blob: f4710fa54935dced98254fd81a85b714e4ca53cc [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346 DefineStd(Builder, "unix", Opts);
347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
391 DefineStd(Builder, "unix", Opts);
392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
414 DefineStd(Builder, "unix", Opts);
415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000809 // RegParmMax is inherited from the underlying architecture.
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
Dan Gohmanc2853072015-09-03 22:51:53 +0000826// WebAssembly target
827template <typename Target>
828class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
829 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000830 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000831 // A common platform macro.
832 if (Opts.POSIXThreads)
833 Builder.defineMacro("_REENTRANT");
834 // Follow g++ convention and predefine _GNU_SOURCE for C++.
835 if (Opts.CPlusPlus)
836 Builder.defineMacro("_GNU_SOURCE");
837 }
838
839 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000840 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000841 return ".text.__startup";
842 }
843
844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000845 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000848 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000849 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
850 }
851};
Dan Gohmanc2853072015-09-03 22:51:53 +0000852
Chris Lattner09d98f52008-10-05 21:50:58 +0000853//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000854// Specific target implementations.
855//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857// PPC abstract base class
858class PPCTargetInfo : public TargetInfo {
859 static const Builtin::Info BuiltinInfo[];
860 static const char * const GCCRegNames[];
861 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000862 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000863
864 // Target cpu features.
865 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000866 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000867 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000868 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000869 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000870 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000871 bool HasBPERMD;
872 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000873 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000874
Ulrich Weigand8afad612014-07-28 13:17:52 +0000875protected:
876 std::string ABI;
877
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000878public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000879 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000880 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
881 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000882 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000883 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000884 LongDoubleWidth = LongDoubleAlign = 128;
885 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
886 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000887
Hal Finkel6b984f02012-07-03 16:51:04 +0000888 /// \brief Flags for architecture specific defines.
889 typedef enum {
890 ArchDefineNone = 0,
891 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
892 ArchDefinePpcgr = 1 << 1,
893 ArchDefinePpcsq = 1 << 2,
894 ArchDefine440 = 1 << 3,
895 ArchDefine603 = 1 << 4,
896 ArchDefine604 = 1 << 5,
897 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000898 ArchDefinePwr5 = 1 << 7,
899 ArchDefinePwr5x = 1 << 8,
900 ArchDefinePwr6 = 1 << 9,
901 ArchDefinePwr6x = 1 << 10,
902 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000903 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000904 ArchDefinePwr9 = 1 << 13,
905 ArchDefineA2 = 1 << 14,
906 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000907 } ArchDefineTypes;
908
Bill Schmidt38378a02013-02-01 20:23:10 +0000909 // Note: GCC recognizes the following additional cpus:
910 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
911 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
912 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000913 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000914 bool CPUKnown = llvm::StringSwitch<bool>(Name)
915 .Case("generic", true)
916 .Case("440", true)
917 .Case("450", true)
918 .Case("601", true)
919 .Case("602", true)
920 .Case("603", true)
921 .Case("603e", true)
922 .Case("603ev", true)
923 .Case("604", true)
924 .Case("604e", true)
925 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000927 .Case("g3", true)
928 .Case("7400", true)
929 .Case("g4", true)
930 .Case("7450", true)
931 .Case("g4+", true)
932 .Case("750", true)
933 .Case("970", true)
934 .Case("g5", true)
935 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000936 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000937 .Case("e500mc", true)
938 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000939 .Case("power3", true)
940 .Case("pwr3", true)
941 .Case("power4", true)
942 .Case("pwr4", true)
943 .Case("power5", true)
944 .Case("pwr5", true)
945 .Case("power5x", true)
946 .Case("pwr5x", true)
947 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000948 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000949 .Case("power6x", true)
950 .Case("pwr6x", true)
951 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000952 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000953 .Case("power8", true)
954 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000955 .Case("power9", true)
956 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000957 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000958 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000959 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000960 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000961 .Case("powerpc64le", true)
962 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000963 .Default(false);
964
965 if (CPUKnown)
966 CPU = Name;
967
968 return CPUKnown;
969 }
970
Ulrich Weigand8afad612014-07-28 13:17:52 +0000971
972 StringRef getABI() const override { return ABI; }
973
Craig Topper6c03a542015-10-19 04:51:35 +0000974 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
975 return llvm::makeArrayRef(BuiltinInfo,
976 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000977 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Craig Topper3164f332014-03-11 03:39:26 +0000979 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000980
Craig Topper3164f332014-03-11 03:39:26 +0000981 void getTargetDefines(const LangOptions &Opts,
982 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000983
Eric Christopher8c47b422015-10-09 18:39:55 +0000984 bool
985 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
986 StringRef CPU,
987 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000988
Craig Topper3164f332014-03-11 03:39:26 +0000989 bool handleTargetFeatures(std::vector<std::string> &Features,
990 DiagnosticsEngine &Diags) override;
991 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000992 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
993 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000994
Craig Topperf054e3a2015-10-19 03:52:27 +0000995 ArrayRef<const char *> getGCCRegNames() const override;
996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000997 bool validateAsmConstraint(const char *&Name,
998 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000999 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001000 default: return false;
1001 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001002 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001003 case 'b': // Base register
1004 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001005 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001006 break;
1007 // FIXME: The following are added to allow parsing.
1008 // I just took a guess at what the actions should be.
1009 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001010 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001011 case 'v': // Altivec vector register
1012 Info.setAllowsRegister();
1013 break;
1014 case 'w':
1015 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001016 case 'd':// VSX vector register to hold vector double data
1017 case 'f':// VSX vector register to hold vector float data
1018 case 's':// VSX vector register to hold scalar float data
1019 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001020 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001021 break;
1022 default:
1023 return false;
1024 }
1025 Info.setAllowsRegister();
1026 Name++; // Skip over 'w'.
1027 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 case 'h': // `MQ', `CTR', or `LINK' register
1029 case 'q': // `MQ' register
1030 case 'c': // `CTR' register
1031 case 'l': // `LINK' register
1032 case 'x': // `CR' register (condition register) number 0
1033 case 'y': // `CR' register (condition register)
1034 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001035 Info.setAllowsRegister();
1036 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001037 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001038 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001039 // (use `L' instead for SImode constants)
1040 case 'K': // Unsigned 16-bit constant
1041 case 'L': // Signed 16-bit constant shifted left 16 bits
1042 case 'M': // Constant larger than 31
1043 case 'N': // Exact power of 2
1044 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001045 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001046 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001047 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001048 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001049 break;
1050 case 'm': // Memory operand. Note that on PowerPC targets, m can
1051 // include addresses that update the base register. It
1052 // is therefore only safe to use `m' in an asm statement
1053 // if that asm statement accesses the operand exactly once.
1054 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001055 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001056 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001057 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001058 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001059 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1060 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // register to be updated.
1062 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001063 if (Name[1] != 's')
1064 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001065 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001066 // include any automodification of the base register. Unlike
1067 // `m', this constraint can be used in asm statements that
1068 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001069 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001070 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001071 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001072 break;
1073 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001075 case 'Z': // Memory operand that is an indexed or indirect from a
1076 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001077 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001078 Info.setAllowsMemory();
1079 Info.setAllowsRegister();
1080 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001081 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001082 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // register (`p' is preferable for asm statements)
1084 case 'S': // Constant suitable as a 64-bit mask operand
1085 case 'T': // Constant suitable as a 32-bit mask operand
1086 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001087 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001088 // instructions
1089 case 'W': // Vector constant that does not require memory
1090 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001091 break;
1092 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001093 }
John Thompson07a61a42010-06-24 22:44:13 +00001094 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001095 }
Craig Topper3164f332014-03-11 03:39:26 +00001096 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001097 std::string R;
1098 switch (*Constraint) {
1099 case 'e':
1100 case 'w':
1101 // Two-character constraint; add "^" hint for later parsing.
1102 R = std::string("^") + std::string(Constraint, 2);
1103 Constraint++;
1104 break;
1105 default:
1106 return TargetInfo::convertConstraint(Constraint);
1107 }
1108 return R;
1109 }
Craig Topper3164f332014-03-11 03:39:26 +00001110 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001111 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001112 }
Craig Topper3164f332014-03-11 03:39:26 +00001113 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001114 if (RegNo == 0) return 3;
1115 if (RegNo == 1) return 4;
1116 return -1;
1117 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001118
1119 bool hasSjLjLowering() const override {
1120 return true;
1121 }
David Majnemer2617ea62015-06-09 18:05:33 +00001122
1123 bool useFloat128ManglingForLongDouble() const override {
1124 return LongDoubleWidth == 128 &&
1125 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1126 getTriple().isOSBinFormatELF();
1127 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001128};
Anders Carlssonf511f642007-11-27 04:11:28 +00001129
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001130const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001131#define BUILTIN(ID, TYPE, ATTRS) \
1132 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1133#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1134 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001135#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001136};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001137
Eric Christopher917e9522014-11-18 22:36:15 +00001138/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001139/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001140bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001141 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001142 for (const auto &Feature : Features) {
1143 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001144 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001145 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001146 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001147 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001148 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001149 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001150 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001151 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001152 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001153 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001154 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001155 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001156 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001157 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001158 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001159 } else if (Feature == "+float128") {
1160 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001161 } else if (Feature == "+power9-vector") {
1162 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001163 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001164 // TODO: Finish this list and add an assert that we've handled them
1165 // all.
1166 }
Eric Christopher02c33352015-08-25 00:59:11 +00001167
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001168 return true;
1169}
1170
Chris Lattnerecd49032009-03-02 22:27:17 +00001171/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1172/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001173void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001174 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001175 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001176 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001177 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001178 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001179 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001180 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001181 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001182 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001183 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001184 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001185 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001186 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001187
Chris Lattnerecd49032009-03-02 22:27:17 +00001188 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001189 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1190 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001191 } else {
1192 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1193 getTriple().getOS() != llvm::Triple::OpenBSD)
1194 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001195 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001196
Ulrich Weigand8afad612014-07-28 13:17:52 +00001197 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001198 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001199 Builder.defineMacro("_CALL_ELF", "1");
1200 if (ABI == "elfv2")
1201 Builder.defineMacro("_CALL_ELF", "2");
1202
Chris Lattnerecd49032009-03-02 22:27:17 +00001203 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1205 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001206
Chris Lattnerecd49032009-03-02 22:27:17 +00001207 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001208 if (LongDoubleWidth == 128)
1209 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001210
John Thompsone467e192009-11-19 17:18:50 +00001211 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001212 Builder.defineMacro("__VEC__", "10206");
1213 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001214 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001215
1216 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001217 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1218 .Case("440", ArchDefineName)
1219 .Case("450", ArchDefineName | ArchDefine440)
1220 .Case("601", ArchDefineName)
1221 .Case("602", ArchDefineName | ArchDefinePpcgr)
1222 .Case("603", ArchDefineName | ArchDefinePpcgr)
1223 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1224 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1225 .Case("604", ArchDefineName | ArchDefinePpcgr)
1226 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1227 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001228 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001229 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1230 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1231 .Case("750", ArchDefineName | ArchDefinePpcgr)
1232 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1233 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001234 .Case("a2", ArchDefineA2)
1235 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001236 .Case("pwr3", ArchDefinePpcgr)
1237 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1238 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1239 | ArchDefinePpcsq)
1240 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1241 | ArchDefinePpcgr | ArchDefinePpcsq)
1242 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1243 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1244 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1245 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1246 | ArchDefinePpcsq)
1247 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1248 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001249 | ArchDefinePpcgr | ArchDefinePpcsq)
1250 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1251 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1252 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001253 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1254 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1255 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1256 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001257 .Case("power3", ArchDefinePpcgr)
1258 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1259 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1260 | ArchDefinePpcsq)
1261 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1262 | ArchDefinePpcgr | ArchDefinePpcsq)
1263 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1264 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1265 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1266 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1267 | ArchDefinePpcsq)
1268 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1269 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001270 | ArchDefinePpcgr | ArchDefinePpcsq)
1271 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1272 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1273 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001274 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1275 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1276 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1277 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001278 .Default(ArchDefineNone);
1279
1280 if (defs & ArchDefineName)
1281 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1282 if (defs & ArchDefinePpcgr)
1283 Builder.defineMacro("_ARCH_PPCGR");
1284 if (defs & ArchDefinePpcsq)
1285 Builder.defineMacro("_ARCH_PPCSQ");
1286 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001287 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001288 if (defs & ArchDefine603)
1289 Builder.defineMacro("_ARCH_603");
1290 if (defs & ArchDefine604)
1291 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001292 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001293 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001294 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001295 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001296 if (defs & ArchDefinePwr5x)
1297 Builder.defineMacro("_ARCH_PWR5X");
1298 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001299 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001300 if (defs & ArchDefinePwr6x)
1301 Builder.defineMacro("_ARCH_PWR6X");
1302 if (defs & ArchDefinePwr7)
1303 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001304 if (defs & ArchDefinePwr8)
1305 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001306 if (defs & ArchDefinePwr9)
1307 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001308 if (defs & ArchDefineA2)
1309 Builder.defineMacro("_ARCH_A2");
1310 if (defs & ArchDefineA2q) {
1311 Builder.defineMacro("_ARCH_A2Q");
1312 Builder.defineMacro("_ARCH_QP");
1313 }
1314
1315 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1316 Builder.defineMacro("__bg__");
1317 Builder.defineMacro("__THW_BLUEGENE__");
1318 Builder.defineMacro("__bgq__");
1319 Builder.defineMacro("__TOS_BGQ__");
1320 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001321
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001322 if (HasVSX)
1323 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001324 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001325 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001326 if (HasP8Crypto)
1327 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001328 if (HasHTM)
1329 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001330 if (HasFloat128)
1331 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001332 if (HasP9Vector)
1333 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001334
1335 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1336 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1337 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1338 if (PointerWidth == 64)
1339 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001340
Bill Schmidt38378a02013-02-01 20:23:10 +00001341 // FIXME: The following are not yet generated here by Clang, but are
1342 // generated by GCC:
1343 //
1344 // _SOFT_FLOAT_
1345 // __RECIP_PRECISION__
1346 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001347 // __RECIP__
1348 // __RECIPF__
1349 // __RSQRTE__
1350 // __RSQRTEF__
1351 // _SOFT_DOUBLE_
1352 // __NO_LWSYNC__
1353 // __HAVE_BSWAP__
1354 // __LONGDOUBLE128
1355 // __CMODEL_MEDIUM__
1356 // __CMODEL_LARGE__
1357 // _CALL_SYSV
1358 // _CALL_DARWIN
1359 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001360}
1361
Eric Christophera8a14c32015-08-31 18:39:16 +00001362// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001363// explicitly turned off vsx and turned on any of:
1364// - power8-vector
1365// - direct-move
1366// - float128
1367// - power9-vector
1368// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001369// set of options.
1370static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001371 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001372
1373 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1374 FeaturesVec.end()) {
1375 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1376 FeaturesVec.end()) {
1377 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1378 << "-mno-vsx";
1379 return false;
1380 }
1381
1382 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1383 FeaturesVec.end()) {
1384 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1385 << "-mno-vsx";
1386 return false;
1387 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001388
1389 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1390 FeaturesVec.end()) {
1391 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1392 << "-mno-vsx";
1393 return false;
1394 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001395
1396 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1397 FeaturesVec.end()) {
1398 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1399 << "-mno-vsx";
1400 return false;
1401 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001402 }
1403
1404 return true;
1405}
1406
Eric Christopher8c47b422015-10-09 18:39:55 +00001407bool PPCTargetInfo::initFeatureMap(
1408 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1409 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001410 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1411 .Case("7400", true)
1412 .Case("g4", true)
1413 .Case("7450", true)
1414 .Case("g4+", true)
1415 .Case("970", true)
1416 .Case("g5", true)
1417 .Case("pwr6", true)
1418 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001419 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001420 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001421 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001422 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001423 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001424
1425 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001426 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001427 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1428 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001429 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001430 .Case("pwr8", true)
1431 .Default(false);
1432 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1433 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001434 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001435 .Case("pwr8", true)
1436 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001437 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1438 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001439 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001440 .Case("pwr8", true)
1441 .Case("pwr7", true)
1442 .Default(false);
1443 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1444 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001445 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001446 .Case("pwr8", true)
1447 .Case("pwr7", true)
1448 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001449 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1450 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001451 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001452 .Case("pwr8", true)
1453 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001454 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1455 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001456 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001457 .Case("pwr8", true)
1458 .Case("pwr7", true)
1459 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001460
Eric Christophera8a14c32015-08-31 18:39:16 +00001461 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1462 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001463
Eric Christopher007b0a02015-08-28 22:32:01 +00001464 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001465}
1466
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001467bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001468 return llvm::StringSwitch<bool>(Feature)
1469 .Case("powerpc", true)
1470 .Case("vsx", HasVSX)
1471 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001472 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001473 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001474 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001475 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001476 .Case("bpermd", HasBPERMD)
1477 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001478 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001479 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001480 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001481}
Chris Lattner17df24e2008-04-21 18:56:49 +00001482
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001483void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1484 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001485 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1486 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1487 // incompatible options.
1488 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001489 if (Name == "direct-move" ||
1490 Name == "power8-vector" ||
1491 Name == "float128" ||
1492 Name == "power9-vector") {
1493 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001494 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001495 if (Name == "power9-vector")
1496 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001497 } else {
1498 Features[Name] = true;
1499 }
1500 } else {
1501 if (Name == "vsx") {
1502 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001503 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001504 } else {
1505 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001506 }
1507 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001508}
1509
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001510const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001511 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1512 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1513 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1514 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1515 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1516 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1517 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1518 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001519 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001520 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001521 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001522 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1523 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1524 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1525 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001526 "vrsave", "vscr",
1527 "spe_acc", "spefscr",
1528 "sfp"
1529};
Chris Lattner10a5b382007-01-29 05:24:35 +00001530
Craig Topperf054e3a2015-10-19 03:52:27 +00001531ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1532 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001533}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001534
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001535const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1536 // While some of these aliases do map to different registers
1537 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001538 { { "0" }, "r0" },
1539 { { "1"}, "r1" },
1540 { { "2" }, "r2" },
1541 { { "3" }, "r3" },
1542 { { "4" }, "r4" },
1543 { { "5" }, "r5" },
1544 { { "6" }, "r6" },
1545 { { "7" }, "r7" },
1546 { { "8" }, "r8" },
1547 { { "9" }, "r9" },
1548 { { "10" }, "r10" },
1549 { { "11" }, "r11" },
1550 { { "12" }, "r12" },
1551 { { "13" }, "r13" },
1552 { { "14" }, "r14" },
1553 { { "15" }, "r15" },
1554 { { "16" }, "r16" },
1555 { { "17" }, "r17" },
1556 { { "18" }, "r18" },
1557 { { "19" }, "r19" },
1558 { { "20" }, "r20" },
1559 { { "21" }, "r21" },
1560 { { "22" }, "r22" },
1561 { { "23" }, "r23" },
1562 { { "24" }, "r24" },
1563 { { "25" }, "r25" },
1564 { { "26" }, "r26" },
1565 { { "27" }, "r27" },
1566 { { "28" }, "r28" },
1567 { { "29" }, "r29" },
1568 { { "30" }, "r30" },
1569 { { "31" }, "r31" },
1570 { { "fr0" }, "f0" },
1571 { { "fr1" }, "f1" },
1572 { { "fr2" }, "f2" },
1573 { { "fr3" }, "f3" },
1574 { { "fr4" }, "f4" },
1575 { { "fr5" }, "f5" },
1576 { { "fr6" }, "f6" },
1577 { { "fr7" }, "f7" },
1578 { { "fr8" }, "f8" },
1579 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001580 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001581 { { "fr11" }, "f11" },
1582 { { "fr12" }, "f12" },
1583 { { "fr13" }, "f13" },
1584 { { "fr14" }, "f14" },
1585 { { "fr15" }, "f15" },
1586 { { "fr16" }, "f16" },
1587 { { "fr17" }, "f17" },
1588 { { "fr18" }, "f18" },
1589 { { "fr19" }, "f19" },
1590 { { "fr20" }, "f20" },
1591 { { "fr21" }, "f21" },
1592 { { "fr22" }, "f22" },
1593 { { "fr23" }, "f23" },
1594 { { "fr24" }, "f24" },
1595 { { "fr25" }, "f25" },
1596 { { "fr26" }, "f26" },
1597 { { "fr27" }, "f27" },
1598 { { "fr28" }, "f28" },
1599 { { "fr29" }, "f29" },
1600 { { "fr30" }, "f30" },
1601 { { "fr31" }, "f31" },
1602 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001603};
1604
Craig Topperf054e3a2015-10-19 03:52:27 +00001605ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1606 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001607}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001608
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001609class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001610public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001611 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1612 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001613 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001614
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001615 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001616 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001617 case llvm::Triple::FreeBSD:
1618 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001619 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001620 PtrDiffType = SignedInt;
1621 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001622 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001623 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001624 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001625 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001626
Roman Divacky3ffe7462012-03-13 19:20:17 +00001627 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1628 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001629 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001630 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001631
1632 // PPC32 supports atomics up to 4 bytes.
1633 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001634 }
1635
Craig Topper3164f332014-03-11 03:39:26 +00001636 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001637 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001638 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001639 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001640};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001641
Bill Schmidt778d3872013-07-26 01:36:11 +00001642// Note: ABI differences may eventually require us to have a separate
1643// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001644class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001645public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001646 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1647 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001648 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001649 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001650 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001651
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001652 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001653 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001654 ABI = "elfv2";
1655 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001656 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001657 ABI = "elfv1";
1658 }
1659
1660 switch (getTriple().getOS()) {
1661 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001662 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001663 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001664 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001665 case llvm::Triple::NetBSD:
1666 IntMaxType = SignedLongLong;
1667 Int64Type = SignedLongLong;
1668 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001669 default:
1670 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001671 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001672
1673 // PPC64 supports atomics up to 8 bytes.
1674 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001675 }
Craig Topper3164f332014-03-11 03:39:26 +00001676 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001677 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001678 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001679 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001680 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001681 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001682 ABI = Name;
1683 return true;
1684 }
1685 return false;
1686 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001687};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001688
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001689class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001690public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001691 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1692 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001693 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001694 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001695 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001696 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001697 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001698 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001699 }
Craig Topper3164f332014-03-11 03:39:26 +00001700 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001701 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001702 }
1703};
1704
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001705class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001706public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001707 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1708 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001709 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001710 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001711 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001712 }
1713};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001714
Eric Christopherc48497a2015-09-18 21:26:24 +00001715static const unsigned NVPTXAddrSpaceMap[] = {
1716 1, // opencl_global
1717 3, // opencl_local
1718 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001719 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001720 0, // opencl_generic
1721 1, // cuda_device
1722 4, // cuda_constant
1723 3, // cuda_shared
1724};
1725
1726class NVPTXTargetInfo : public TargetInfo {
1727 static const char *const GCCRegNames[];
1728 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001729 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001730
Eric Christopherc48497a2015-09-18 21:26:24 +00001731public:
Justin Lebar76945b22016-04-29 23:05:19 +00001732 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001733 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001734 TLSSupported = false;
1735 LongWidth = LongAlign = 64;
1736 AddrSpaceMap = &NVPTXAddrSpaceMap;
1737 UseAddrSpaceMapMangling = true;
1738 // Define available target features
1739 // These must be defined in sorted order!
1740 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001741 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001742
1743 // If possible, get a TargetInfo for our host triple, so we can match its
1744 // types.
1745 llvm::Triple HostTriple(Opts.HostTriple);
1746 if (HostTriple.isNVPTX())
1747 return;
1748 std::unique_ptr<TargetInfo> HostTarget(
1749 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1750 if (!HostTarget) {
1751 return;
1752 }
1753
1754 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1755 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1756 BoolWidth = HostTarget->getBoolWidth();
1757 BoolAlign = HostTarget->getBoolAlign();
1758 IntWidth = HostTarget->getIntWidth();
1759 IntAlign = HostTarget->getIntAlign();
1760 HalfWidth = HostTarget->getHalfWidth();
1761 HalfAlign = HostTarget->getHalfAlign();
1762 FloatWidth = HostTarget->getFloatWidth();
1763 FloatAlign = HostTarget->getFloatAlign();
1764 DoubleWidth = HostTarget->getDoubleWidth();
1765 DoubleAlign = HostTarget->getDoubleAlign();
1766 LongWidth = HostTarget->getLongWidth();
1767 LongAlign = HostTarget->getLongAlign();
1768 LongLongWidth = HostTarget->getLongLongWidth();
1769 LongLongAlign = HostTarget->getLongLongAlign();
1770 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001771 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001772 DefaultAlignForAttributeAligned =
1773 HostTarget->getDefaultAlignForAttributeAligned();
1774 SizeType = HostTarget->getSizeType();
1775 IntMaxType = HostTarget->getIntMaxType();
1776 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1777 IntPtrType = HostTarget->getIntPtrType();
1778 WCharType = HostTarget->getWCharType();
1779 WIntType = HostTarget->getWIntType();
1780 Char16Type = HostTarget->getChar16Type();
1781 Char32Type = HostTarget->getChar32Type();
1782 Int64Type = HostTarget->getInt64Type();
1783 SigAtomicType = HostTarget->getSigAtomicType();
1784 ProcessIDType = HostTarget->getProcessIDType();
1785
1786 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1787 UseZeroLengthBitfieldAlignment =
1788 HostTarget->useZeroLengthBitfieldAlignment();
1789 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1790 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1791
Justin Lebar5057f172016-09-09 20:35:43 +00001792 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1793 // we need those macros to be identical on host and device, because (among
1794 // other things) they affect which standard library classes are defined, and
1795 // we need all classes to be defined on both the host and device.
1796 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1797
Justin Lebar76945b22016-04-29 23:05:19 +00001798 // Properties intentionally not copied from host:
1799 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1800 // host/device boundary.
1801 // - SuitableAlign: Not visible across the host/device boundary, and may
1802 // correctly be different on host/device, e.g. if host has wider vector
1803 // types than device.
1804 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1805 // as its double type, but that's not necessarily true on the host.
1806 // TODO: nvcc emits a warning when using long double on device; we should
1807 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001808 }
1809 void getTargetDefines(const LangOptions &Opts,
1810 MacroBuilder &Builder) const override {
1811 Builder.defineMacro("__PTX__");
1812 Builder.defineMacro("__NVPTX__");
1813 if (Opts.CUDAIsDevice) {
1814 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001815 std::string CUDAArchCode = [this] {
1816 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001817 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001818 assert(false && "No GPU arch when compiling CUDA device code.");
1819 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001820 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001821 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001822 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001823 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001824 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001825 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001826 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001827 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001828 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001829 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001830 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001831 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001832 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001833 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001834 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001835 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001836 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001837 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001838 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001839 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001840 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001841 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001842 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001843 return "620";
1844 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001845 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001846 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001847 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001848 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001849 }
Craig Topper6c03a542015-10-19 04:51:35 +00001850 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1851 return llvm::makeArrayRef(BuiltinInfo,
1852 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001853 }
Artem Belevichfda99052016-09-28 17:47:35 +00001854 bool
1855 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1856 StringRef CPU,
1857 const std::vector<std::string> &FeaturesVec) const override {
1858 Features["satom"] = GPU >= CudaArch::SM_60;
1859 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1860 }
1861
Eric Christopherc48497a2015-09-18 21:26:24 +00001862 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001863 return llvm::StringSwitch<bool>(Feature)
1864 .Cases("ptx", "nvptx", true)
1865 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1866 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001867 }
1868
Craig Topperf054e3a2015-10-19 03:52:27 +00001869 ArrayRef<const char *> getGCCRegNames() const override;
1870 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001871 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001872 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001873 }
1874 bool validateAsmConstraint(const char *&Name,
1875 TargetInfo::ConstraintInfo &Info) const override {
1876 switch (*Name) {
1877 default:
1878 return false;
1879 case 'c':
1880 case 'h':
1881 case 'r':
1882 case 'l':
1883 case 'f':
1884 case 'd':
1885 Info.setAllowsRegister();
1886 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001887 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001888 }
1889 const char *getClobbers() const override {
1890 // FIXME: Is this really right?
1891 return "";
1892 }
1893 BuiltinVaListKind getBuiltinVaListKind() const override {
1894 // FIXME: implement
1895 return TargetInfo::CharPtrBuiltinVaList;
1896 }
1897 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001898 GPU = StringToCudaArch(Name);
1899 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001900 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001901 void setSupportedOpenCLOpts() override {
1902 auto &Opts = getSupportedOpenCLOpts();
1903 Opts.cl_clang_storage_class_specifiers = 1;
1904 Opts.cl_khr_gl_sharing = 1;
1905 Opts.cl_khr_icd = 1;
1906
1907 Opts.cl_khr_fp64 = 1;
1908 Opts.cl_khr_byte_addressable_store = 1;
1909 Opts.cl_khr_global_int32_base_atomics = 1;
1910 Opts.cl_khr_global_int32_extended_atomics = 1;
1911 Opts.cl_khr_local_int32_base_atomics = 1;
1912 Opts.cl_khr_local_int32_extended_atomics = 1;
1913 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001914};
1915
1916const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1917#define BUILTIN(ID, TYPE, ATTRS) \
1918 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1919#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1920 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001921#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1922 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001923#include "clang/Basic/BuiltinsNVPTX.def"
1924};
1925
1926const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1927
Craig Topperf054e3a2015-10-19 03:52:27 +00001928ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1929 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001930}
1931
1932class NVPTX32TargetInfo : public NVPTXTargetInfo {
1933public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001934 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1935 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001936 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001937 PointerWidth = PointerAlign = 32;
1938 SizeType = TargetInfo::UnsignedInt;
1939 PtrDiffType = TargetInfo::SignedInt;
1940 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001941 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001942 }
1943};
1944
1945class NVPTX64TargetInfo : public NVPTXTargetInfo {
1946public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001947 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1948 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001949 PointerWidth = PointerAlign = 64;
1950 SizeType = TargetInfo::UnsignedLong;
1951 PtrDiffType = TargetInfo::SignedLong;
1952 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001953 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001954 }
1955};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001956
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001957static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001958 1, // opencl_global
1959 3, // opencl_local
1960 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001961 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001962 1, // cuda_device
1963 2, // cuda_constant
1964 3 // cuda_shared
1965};
1966
Tom Stellarda96344b2014-08-21 13:58:40 +00001967// If you edit the description strings, make sure you update
1968// getPointerWidthV().
1969
Craig Topper273dbc62015-10-18 05:29:26 +00001970static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001971 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1972 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001973
Craig Topper273dbc62015-10-18 05:29:26 +00001974static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001975 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001976 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1977 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001978
Matt Arsenault250024f2016-06-08 01:56:42 +00001979class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001980 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001981 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001982
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001983 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001984 enum GPUKind {
1985 GK_NONE,
1986 GK_R600,
1987 GK_R600_DOUBLE_OPS,
1988 GK_R700,
1989 GK_R700_DOUBLE_OPS,
1990 GK_EVERGREEN,
1991 GK_EVERGREEN_DOUBLE_OPS,
1992 GK_NORTHERN_ISLANDS,
1993 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001994 GK_GFX6,
1995 GK_GFX7,
1996 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00001997 } GPU;
1998
Jan Veselyeebeaea2015-05-04 19:53:36 +00001999 bool hasFP64:1;
2000 bool hasFMAF:1;
2001 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002002 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002003
Matt Arsenault250024f2016-06-08 01:56:42 +00002004 static bool isAMDGCN(const llvm::Triple &TT) {
2005 return TT.getArch() == llvm::Triple::amdgcn;
2006 }
2007
Eli Friedmand13b41e2012-10-12 23:32:00 +00002008public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002009 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002010 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002011 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002012 hasFP64(false),
2013 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002014 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002015 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002016 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002017 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002018 hasFMAF = true;
2019 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002020 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002021
2022 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2023 DataLayoutStringSI : DataLayoutStringR600);
2024
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002025 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002026 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002027 }
2028
Tom Stellarda96344b2014-08-21 13:58:40 +00002029 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2030 if (GPU <= GK_CAYMAN)
2031 return 32;
2032
2033 switch(AddrSpace) {
2034 default:
2035 return 64;
2036 case 0:
2037 case 3:
2038 case 5:
2039 return 32;
2040 }
2041 }
2042
Yaxun Liu26f75662016-08-19 05:17:25 +00002043 uint64_t getMaxPointerWidth() const override {
2044 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2045 }
2046
Craig Topper3164f332014-03-11 03:39:26 +00002047 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002048 return "";
2049 }
2050
Craig Topperf054e3a2015-10-19 03:52:27 +00002051 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002052
Craig Topperf054e3a2015-10-19 03:52:27 +00002053 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2054 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002055 }
2056
Craig Topper3164f332014-03-11 03:39:26 +00002057 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002058 TargetInfo::ConstraintInfo &Info) const override {
2059 switch (*Name) {
2060 default: break;
2061 case 'v': // vgpr
2062 case 's': // sgpr
2063 Info.setAllowsRegister();
2064 return true;
2065 }
2066 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002067 }
2068
Matt Arsenault250024f2016-06-08 01:56:42 +00002069 bool initFeatureMap(llvm::StringMap<bool> &Features,
2070 DiagnosticsEngine &Diags, StringRef CPU,
2071 const std::vector<std::string> &FeatureVec) const override;
2072
Yaxun Liu2c17e822016-08-09 19:43:38 +00002073 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2074 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002075 bool hasFP32Denormals = false;
2076 bool hasFP64Denormals = false;
2077 for (auto &I : TargetOpts.FeaturesAsWritten) {
2078 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2079 hasFP32Denormals = true;
2080 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2081 hasFP64Denormals = true;
2082 }
2083 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002084 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2085 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2086 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002087 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002088 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002089 }
2090
Craig Topper6c03a542015-10-19 04:51:35 +00002091 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2092 return llvm::makeArrayRef(BuiltinInfo,
2093 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002094 }
2095
Craig Topper3164f332014-03-11 03:39:26 +00002096 void getTargetDefines(const LangOptions &Opts,
2097 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002098 if (getTriple().getArch() == llvm::Triple::amdgcn)
2099 Builder.defineMacro("__AMDGCN__");
2100 else
2101 Builder.defineMacro("__R600__");
2102
Jan Veselyeebeaea2015-05-04 19:53:36 +00002103 if (hasFMAF)
2104 Builder.defineMacro("__HAS_FMAF__");
2105 if (hasLDEXPF)
2106 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002107 if (hasFP64)
2108 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002109 }
2110
Craig Topper3164f332014-03-11 03:39:26 +00002111 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002112 return TargetInfo::CharPtrBuiltinVaList;
2113 }
2114
Matt Arsenault250024f2016-06-08 01:56:42 +00002115 static GPUKind parseR600Name(StringRef Name) {
2116 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002117 .Case("r600" , GK_R600)
2118 .Case("rv610", GK_R600)
2119 .Case("rv620", GK_R600)
2120 .Case("rv630", GK_R600)
2121 .Case("rv635", GK_R600)
2122 .Case("rs780", GK_R600)
2123 .Case("rs880", GK_R600)
2124 .Case("rv670", GK_R600_DOUBLE_OPS)
2125 .Case("rv710", GK_R700)
2126 .Case("rv730", GK_R700)
2127 .Case("rv740", GK_R700_DOUBLE_OPS)
2128 .Case("rv770", GK_R700_DOUBLE_OPS)
2129 .Case("palm", GK_EVERGREEN)
2130 .Case("cedar", GK_EVERGREEN)
2131 .Case("sumo", GK_EVERGREEN)
2132 .Case("sumo2", GK_EVERGREEN)
2133 .Case("redwood", GK_EVERGREEN)
2134 .Case("juniper", GK_EVERGREEN)
2135 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2136 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2137 .Case("barts", GK_NORTHERN_ISLANDS)
2138 .Case("turks", GK_NORTHERN_ISLANDS)
2139 .Case("caicos", GK_NORTHERN_ISLANDS)
2140 .Case("cayman", GK_CAYMAN)
2141 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002142 .Default(GK_NONE);
2143 }
2144
2145 static GPUKind parseAMDGCNName(StringRef Name) {
2146 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002147 .Case("tahiti", GK_GFX6)
2148 .Case("pitcairn", GK_GFX6)
2149 .Case("verde", GK_GFX6)
2150 .Case("oland", GK_GFX6)
2151 .Case("hainan", GK_GFX6)
2152 .Case("bonaire", GK_GFX7)
2153 .Case("kabini", GK_GFX7)
2154 .Case("kaveri", GK_GFX7)
2155 .Case("hawaii", GK_GFX7)
2156 .Case("mullins", GK_GFX7)
2157 .Case("tonga", GK_GFX8)
2158 .Case("iceland", GK_GFX8)
2159 .Case("carrizo", GK_GFX8)
2160 .Case("fiji", GK_GFX8)
2161 .Case("stoney", GK_GFX8)
2162 .Case("polaris10", GK_GFX8)
2163 .Case("polaris11", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002164 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002165 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002166
Matt Arsenault250024f2016-06-08 01:56:42 +00002167 bool setCPU(const std::string &Name) override {
2168 if (getTriple().getArch() == llvm::Triple::amdgcn)
2169 GPU = parseAMDGCNName(Name);
2170 else
2171 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002172
Matt Arsenault250024f2016-06-08 01:56:42 +00002173 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002174 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002175
Jan Vesely211ba782016-06-17 02:25:03 +00002176 void setSupportedOpenCLOpts() override {
2177 auto &Opts = getSupportedOpenCLOpts();
2178 Opts.cl_clang_storage_class_specifiers = 1;
2179 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002180
Jan Vesely211ba782016-06-17 02:25:03 +00002181 if (hasFP64)
2182 Opts.cl_khr_fp64 = 1;
2183 if (GPU >= GK_EVERGREEN) {
2184 Opts.cl_khr_byte_addressable_store = 1;
2185 Opts.cl_khr_global_int32_base_atomics = 1;
2186 Opts.cl_khr_global_int32_extended_atomics = 1;
2187 Opts.cl_khr_local_int32_base_atomics = 1;
2188 Opts.cl_khr_local_int32_extended_atomics = 1;
2189 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002190 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002191 Opts.cl_khr_fp16 = 1;
2192 Opts.cl_khr_int64_base_atomics = 1;
2193 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002194 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002195 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002196 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002197 Opts.cl_amd_media_ops = 1;
2198 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002199 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002200 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002201
Yaxun Liu99444cb2016-08-03 20:38:06 +00002202 LangAS::ID getOpenCLImageAddrSpace() const override {
2203 return LangAS::opencl_constant;
2204 }
2205
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002206 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2207 switch (CC) {
2208 default:
2209 return CCCR_Warning;
2210 case CC_C:
2211 case CC_OpenCLKernel:
2212 return CCCR_OK;
2213 }
2214 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002215};
2216
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002217const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002218#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002219 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002220#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2221 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002222#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002223};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002224const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002225 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2226 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2227 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2228 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2229 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2230 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2231 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2232 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2233 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2234 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2235 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2236 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2237 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2238 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2239 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2240 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2241 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2242 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2243 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2244 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2245 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2246 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2247 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2248 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2249 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2250 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2251 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2252 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2253 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2254 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2255 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2256 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2257 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2258 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2259 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2260 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2261 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2262 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2263 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2264 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2265 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2266 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2267 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2268 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2269 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2270 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2271 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002272 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002273 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2274 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002275};
2276
Craig Topperf054e3a2015-10-19 03:52:27 +00002277ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2278 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002279}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002280
Matt Arsenault250024f2016-06-08 01:56:42 +00002281bool AMDGPUTargetInfo::initFeatureMap(
2282 llvm::StringMap<bool> &Features,
2283 DiagnosticsEngine &Diags, StringRef CPU,
2284 const std::vector<std::string> &FeatureVec) const {
2285
2286 // XXX - What does the member GPU mean if device name string passed here?
2287 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2288 if (CPU.empty())
2289 CPU = "tahiti";
2290
2291 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002292 case GK_GFX6:
2293 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002294 break;
2295
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002296 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002297 Features["s-memrealtime"] = true;
2298 Features["16-bit-insts"] = true;
2299 break;
2300
2301 case GK_NONE:
2302 return false;
2303 default:
2304 llvm_unreachable("unhandled subtarget");
2305 }
2306 } else {
2307 if (CPU.empty())
2308 CPU = "r600";
2309
2310 switch (parseR600Name(CPU)) {
2311 case GK_R600:
2312 case GK_R700:
2313 case GK_EVERGREEN:
2314 case GK_NORTHERN_ISLANDS:
2315 break;
2316 case GK_R600_DOUBLE_OPS:
2317 case GK_R700_DOUBLE_OPS:
2318 case GK_EVERGREEN_DOUBLE_OPS:
2319 case GK_CAYMAN:
2320 Features["fp64"] = true;
2321 break;
2322 case GK_NONE:
2323 return false;
2324 default:
2325 llvm_unreachable("unhandled subtarget");
2326 }
2327 }
2328
2329 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2330}
2331
Eli Friedman3fd920a2008-08-20 02:34:37 +00002332// Namespace for x86 abstract base class
2333const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002334#define BUILTIN(ID, TYPE, ATTRS) \
2335 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002336#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002337 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002338#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002339 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002340#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2341 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002342#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002343};
Eli Friedmanb5366062008-05-20 14:21:01 +00002344
Nuno Lopescfca1f02009-12-23 17:49:57 +00002345static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002346 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2347 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002348 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002349 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2350 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2351 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002352 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002353 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2354 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002355 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2356 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2357 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2358 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2359 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2360 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2361 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2362 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002363};
2364
Eric Christophercdd36352011-06-21 00:05:20 +00002365const TargetInfo::AddlRegName AddlRegNames[] = {
2366 { { "al", "ah", "eax", "rax" }, 0 },
2367 { { "bl", "bh", "ebx", "rbx" }, 3 },
2368 { { "cl", "ch", "ecx", "rcx" }, 2 },
2369 { { "dl", "dh", "edx", "rdx" }, 1 },
2370 { { "esi", "rsi" }, 4 },
2371 { { "edi", "rdi" }, 5 },
2372 { { "esp", "rsp" }, 7 },
2373 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002374 { { "r8d", "r8w", "r8b" }, 38 },
2375 { { "r9d", "r9w", "r9b" }, 39 },
2376 { { "r10d", "r10w", "r10b" }, 40 },
2377 { { "r11d", "r11w", "r11b" }, 41 },
2378 { { "r12d", "r12w", "r12b" }, 42 },
2379 { { "r13d", "r13w", "r13b" }, 43 },
2380 { { "r14d", "r14w", "r14b" }, 44 },
2381 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002382};
2383
2384// X86 target abstract base class; x86-32 and x86-64 are very close, so
2385// most of the implementation can be shared.
2386class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002387 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002388 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002389 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002390 enum MMX3DNowEnum {
2391 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002392 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002393 enum XOPEnum {
2394 NoXOP,
2395 SSE4A,
2396 FMA4,
2397 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002398 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002399
Craig Topper543f3bd2015-10-14 23:47:57 +00002400 bool HasAES = false;
2401 bool HasPCLMUL = false;
2402 bool HasLZCNT = false;
2403 bool HasRDRND = false;
2404 bool HasFSGSBASE = false;
2405 bool HasBMI = false;
2406 bool HasBMI2 = false;
2407 bool HasPOPCNT = false;
2408 bool HasRTM = false;
2409 bool HasPRFCHW = false;
2410 bool HasRDSEED = false;
2411 bool HasADX = false;
2412 bool HasTBM = false;
2413 bool HasFMA = false;
2414 bool HasF16C = false;
2415 bool HasAVX512CD = false;
2416 bool HasAVX512ER = false;
2417 bool HasAVX512PF = false;
2418 bool HasAVX512DQ = false;
2419 bool HasAVX512BW = false;
2420 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002421 bool HasAVX512VBMI = false;
2422 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002423 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002424 bool HasMPX = false;
2425 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002426 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002427 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002428 bool HasXSAVE = false;
2429 bool HasXSAVEOPT = false;
2430 bool HasXSAVEC = false;
2431 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002432 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002433 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002434 bool HasCLFLUSHOPT = false;
2435 bool HasPCOMMIT = false;
2436 bool HasCLWB = false;
2437 bool HasUMIP = false;
2438 bool HasMOVBE = false;
2439 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002440
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002441 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2442 ///
2443 /// Each enumeration represents a particular CPU supported by Clang. These
2444 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2445 enum CPUKind {
2446 CK_Generic,
2447
2448 /// \name i386
2449 /// i386-generation processors.
2450 //@{
2451 CK_i386,
2452 //@}
2453
2454 /// \name i486
2455 /// i486-generation processors.
2456 //@{
2457 CK_i486,
2458 CK_WinChipC6,
2459 CK_WinChip2,
2460 CK_C3,
2461 //@}
2462
2463 /// \name i586
2464 /// i586-generation processors, P5 microarchitecture based.
2465 //@{
2466 CK_i586,
2467 CK_Pentium,
2468 CK_PentiumMMX,
2469 //@}
2470
2471 /// \name i686
2472 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2473 //@{
2474 CK_i686,
2475 CK_PentiumPro,
2476 CK_Pentium2,
2477 CK_Pentium3,
2478 CK_Pentium3M,
2479 CK_PentiumM,
2480 CK_C3_2,
2481
2482 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2483 /// Clang however has some logic to suport this.
2484 // FIXME: Warn, deprecate, and potentially remove this.
2485 CK_Yonah,
2486 //@}
2487
2488 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002489 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002490 //@{
2491 CK_Pentium4,
2492 CK_Pentium4M,
2493 CK_Prescott,
2494 CK_Nocona,
2495 //@}
2496
2497 /// \name Core
2498 /// Core microarchitecture based processors.
2499 //@{
2500 CK_Core2,
2501
2502 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2503 /// codename which GCC no longer accepts as an option to -march, but Clang
2504 /// has some logic for recognizing it.
2505 // FIXME: Warn, deprecate, and potentially remove this.
2506 CK_Penryn,
2507 //@}
2508
2509 /// \name Atom
2510 /// Atom processors
2511 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002512 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002513 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002514 //@}
2515
2516 /// \name Nehalem
2517 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002518 CK_Nehalem,
2519
2520 /// \name Westmere
2521 /// Westmere microarchitecture based processors.
2522 CK_Westmere,
2523
2524 /// \name Sandy Bridge
2525 /// Sandy Bridge microarchitecture based processors.
2526 CK_SandyBridge,
2527
2528 /// \name Ivy Bridge
2529 /// Ivy Bridge microarchitecture based processors.
2530 CK_IvyBridge,
2531
2532 /// \name Haswell
2533 /// Haswell microarchitecture based processors.
2534 CK_Haswell,
2535
2536 /// \name Broadwell
2537 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002538 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002539
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002540 /// \name Skylake Client
2541 /// Skylake client microarchitecture based processors.
2542 CK_SkylakeClient,
2543
2544 /// \name Skylake Server
2545 /// Skylake server microarchitecture based processors.
2546 CK_SkylakeServer,
2547
2548 /// \name Cannonlake Client
2549 /// Cannonlake client microarchitecture based processors.
2550 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002551
Craig Topper449314e2013-08-20 07:09:39 +00002552 /// \name Knights Landing
2553 /// Knights Landing processor.
2554 CK_KNL,
2555
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002556 /// \name Lakemont
2557 /// Lakemont microarchitecture based processors.
2558 CK_Lakemont,
2559
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002560 /// \name K6
2561 /// K6 architecture processors.
2562 //@{
2563 CK_K6,
2564 CK_K6_2,
2565 CK_K6_3,
2566 //@}
2567
2568 /// \name K7
2569 /// K7 architecture processors.
2570 //@{
2571 CK_Athlon,
2572 CK_AthlonThunderbird,
2573 CK_Athlon4,
2574 CK_AthlonXP,
2575 CK_AthlonMP,
2576 //@}
2577
2578 /// \name K8
2579 /// K8 architecture processors.
2580 //@{
2581 CK_Athlon64,
2582 CK_Athlon64SSE3,
2583 CK_AthlonFX,
2584 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002585 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002586 CK_Opteron,
2587 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002588 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002589 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002590
Benjamin Kramer569f2152012-01-10 11:50:18 +00002591 /// \name Bobcat
2592 /// Bobcat architecture processors.
2593 //@{
2594 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002595 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002596 //@}
2597
2598 /// \name Bulldozer
2599 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002600 //@{
2601 CK_BDVER1,
2602 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002603 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002604 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002605 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002606
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002607 /// This specification is deprecated and will be removed in the future.
2608 /// Users should prefer \see CK_K8.
2609 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002610 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002611 CK_x86_64,
2612 //@}
2613
2614 /// \name Geode
2615 /// Geode processors.
2616 //@{
2617 CK_Geode
2618 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002619 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002620
Eric Christopherc50738f2015-08-27 00:05:50 +00002621 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002622 return llvm::StringSwitch<CPUKind>(CPU)
2623 .Case("i386", CK_i386)
2624 .Case("i486", CK_i486)
2625 .Case("winchip-c6", CK_WinChipC6)
2626 .Case("winchip2", CK_WinChip2)
2627 .Case("c3", CK_C3)
2628 .Case("i586", CK_i586)
2629 .Case("pentium", CK_Pentium)
2630 .Case("pentium-mmx", CK_PentiumMMX)
2631 .Case("i686", CK_i686)
2632 .Case("pentiumpro", CK_PentiumPro)
2633 .Case("pentium2", CK_Pentium2)
2634 .Case("pentium3", CK_Pentium3)
2635 .Case("pentium3m", CK_Pentium3M)
2636 .Case("pentium-m", CK_PentiumM)
2637 .Case("c3-2", CK_C3_2)
2638 .Case("yonah", CK_Yonah)
2639 .Case("pentium4", CK_Pentium4)
2640 .Case("pentium4m", CK_Pentium4M)
2641 .Case("prescott", CK_Prescott)
2642 .Case("nocona", CK_Nocona)
2643 .Case("core2", CK_Core2)
2644 .Case("penryn", CK_Penryn)
2645 .Case("bonnell", CK_Bonnell)
2646 .Case("atom", CK_Bonnell) // Legacy name.
2647 .Case("silvermont", CK_Silvermont)
2648 .Case("slm", CK_Silvermont) // Legacy name.
2649 .Case("nehalem", CK_Nehalem)
2650 .Case("corei7", CK_Nehalem) // Legacy name.
2651 .Case("westmere", CK_Westmere)
2652 .Case("sandybridge", CK_SandyBridge)
2653 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2654 .Case("ivybridge", CK_IvyBridge)
2655 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2656 .Case("haswell", CK_Haswell)
2657 .Case("core-avx2", CK_Haswell) // Legacy name.
2658 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002659 .Case("skylake", CK_SkylakeClient)
2660 .Case("skylake-avx512", CK_SkylakeServer)
2661 .Case("skx", CK_SkylakeServer) // Legacy name.
2662 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002663 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002664 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002665 .Case("k6", CK_K6)
2666 .Case("k6-2", CK_K6_2)
2667 .Case("k6-3", CK_K6_3)
2668 .Case("athlon", CK_Athlon)
2669 .Case("athlon-tbird", CK_AthlonThunderbird)
2670 .Case("athlon-4", CK_Athlon4)
2671 .Case("athlon-xp", CK_AthlonXP)
2672 .Case("athlon-mp", CK_AthlonMP)
2673 .Case("athlon64", CK_Athlon64)
2674 .Case("athlon64-sse3", CK_Athlon64SSE3)
2675 .Case("athlon-fx", CK_AthlonFX)
2676 .Case("k8", CK_K8)
2677 .Case("k8-sse3", CK_K8SSE3)
2678 .Case("opteron", CK_Opteron)
2679 .Case("opteron-sse3", CK_OpteronSSE3)
2680 .Case("barcelona", CK_AMDFAM10)
2681 .Case("amdfam10", CK_AMDFAM10)
2682 .Case("btver1", CK_BTVER1)
2683 .Case("btver2", CK_BTVER2)
2684 .Case("bdver1", CK_BDVER1)
2685 .Case("bdver2", CK_BDVER2)
2686 .Case("bdver3", CK_BDVER3)
2687 .Case("bdver4", CK_BDVER4)
2688 .Case("x86-64", CK_x86_64)
2689 .Case("geode", CK_Geode)
2690 .Default(CK_Generic);
2691 }
2692
Rafael Espindolaeb265472013-08-21 21:59:03 +00002693 enum FPMathKind {
2694 FP_Default,
2695 FP_SSE,
2696 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002697 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002698
Eli Friedman3fd920a2008-08-20 02:34:37 +00002699public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002700 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2701 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002702 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002703 }
Craig Topper3164f332014-03-11 03:39:26 +00002704 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002705 // X87 evaluates with 80 bits "long double" precision.
2706 return SSELevel == NoSSE ? 2 : 0;
2707 }
Craig Topper6c03a542015-10-19 04:51:35 +00002708 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2709 return llvm::makeArrayRef(BuiltinInfo,
2710 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002711 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002712 ArrayRef<const char *> getGCCRegNames() const override {
2713 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002714 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002715 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2716 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002717 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002718 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2719 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002720 }
Eric Christopherd9832702015-06-29 21:00:05 +00002721 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002722 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002723 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002724
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002725 bool validateGlobalRegisterVariable(StringRef RegName,
2726 unsigned RegSize,
2727 bool &HasSizeMismatch) const override {
2728 // esp and ebp are the only 32-bit registers the x86 backend can currently
2729 // handle.
2730 if (RegName.equals("esp") || RegName.equals("ebp")) {
2731 // Check that the register size is 32-bit.
2732 HasSizeMismatch = RegSize != 32;
2733 return true;
2734 }
2735
2736 return false;
2737 }
2738
Akira Hatanaka974131e2014-09-18 18:17:18 +00002739 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2740
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002741 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2742
Akira Hatanaka974131e2014-09-18 18:17:18 +00002743 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2744
Craig Topper3164f332014-03-11 03:39:26 +00002745 std::string convertConstraint(const char *&Constraint) const override;
2746 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002747 return "~{dirflag},~{fpsr},~{flags}";
2748 }
Craig Topper3164f332014-03-11 03:39:26 +00002749 void getTargetDefines(const LangOptions &Opts,
2750 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002751 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2752 bool Enabled);
2753 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2754 bool Enabled);
2755 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2756 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002757 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2758 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002759 setFeatureEnabledImpl(Features, Name, Enabled);
2760 }
2761 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002762 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002763 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2764 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002765 bool
2766 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2767 StringRef CPU,
2768 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002769 bool hasFeature(StringRef Feature) const override;
2770 bool handleTargetFeatures(std::vector<std::string> &Features,
2771 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002772 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002773 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2774 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002775 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002776 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002777 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002778 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002779 return "no-mmx";
2780 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002781 }
Craig Topper3164f332014-03-11 03:39:26 +00002782 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002783 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002784
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002785 // Perform any per-CPU checks necessary to determine if this CPU is
2786 // acceptable.
2787 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2788 // invalid without explaining *why*.
2789 switch (CPU) {
2790 case CK_Generic:
2791 // No processor selected!
2792 return false;
2793
2794 case CK_i386:
2795 case CK_i486:
2796 case CK_WinChipC6:
2797 case CK_WinChip2:
2798 case CK_C3:
2799 case CK_i586:
2800 case CK_Pentium:
2801 case CK_PentiumMMX:
2802 case CK_i686:
2803 case CK_PentiumPro:
2804 case CK_Pentium2:
2805 case CK_Pentium3:
2806 case CK_Pentium3M:
2807 case CK_PentiumM:
2808 case CK_Yonah:
2809 case CK_C3_2:
2810 case CK_Pentium4:
2811 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002812 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002813 case CK_Prescott:
2814 case CK_K6:
2815 case CK_K6_2:
2816 case CK_K6_3:
2817 case CK_Athlon:
2818 case CK_AthlonThunderbird:
2819 case CK_Athlon4:
2820 case CK_AthlonXP:
2821 case CK_AthlonMP:
2822 case CK_Geode:
2823 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002824 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002825 return false;
2826
2827 // Fallthrough
2828 case CK_Nocona:
2829 case CK_Core2:
2830 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002831 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002832 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002833 case CK_Nehalem:
2834 case CK_Westmere:
2835 case CK_SandyBridge:
2836 case CK_IvyBridge:
2837 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002838 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002839 case CK_SkylakeClient:
2840 case CK_SkylakeServer:
2841 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002842 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002843 case CK_Athlon64:
2844 case CK_Athlon64SSE3:
2845 case CK_AthlonFX:
2846 case CK_K8:
2847 case CK_K8SSE3:
2848 case CK_Opteron:
2849 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002850 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002851 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002852 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002853 case CK_BDVER1:
2854 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002855 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002856 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002857 case CK_x86_64:
2858 return true;
2859 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002860 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002861 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002862
Craig Topper3164f332014-03-11 03:39:26 +00002863 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002864
Craig Topper3164f332014-03-11 03:39:26 +00002865 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002866 // Most of the non-ARM calling conventions are i386 conventions.
2867 switch (CC) {
2868 case CC_X86ThisCall:
2869 case CC_X86FastCall:
2870 case CC_X86StdCall:
2871 case CC_X86VectorCall:
2872 case CC_C:
2873 case CC_Swift:
2874 case CC_X86Pascal:
2875 case CC_IntelOclBicc:
2876 return CCCR_OK;
2877 default:
2878 return CCCR_Warning;
2879 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002880 }
2881
Craig Topper3164f332014-03-11 03:39:26 +00002882 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002883 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002884 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002885
2886 bool hasSjLjLowering() const override {
2887 return true;
2888 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002889
2890 void setSupportedOpenCLOpts() override {
2891 getSupportedOpenCLOpts().setAll();
2892 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002893};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002894
Rafael Espindolaeb265472013-08-21 21:59:03 +00002895bool X86TargetInfo::setFPMath(StringRef Name) {
2896 if (Name == "387") {
2897 FPMath = FP_387;
2898 return true;
2899 }
2900 if (Name == "sse") {
2901 FPMath = FP_SSE;
2902 return true;
2903 }
2904 return false;
2905}
2906
Eric Christopher007b0a02015-08-28 22:32:01 +00002907bool X86TargetInfo::initFeatureMap(
2908 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002909 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002910 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002911 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002912 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002913 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002914
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002915 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002916
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002917 // Enable X87 for all X86 processors but Lakemont.
2918 if (Kind != CK_Lakemont)
2919 setFeatureEnabledImpl(Features, "x87", true);
2920
2921 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002922 case CK_Generic:
2923 case CK_i386:
2924 case CK_i486:
2925 case CK_i586:
2926 case CK_Pentium:
2927 case CK_i686:
2928 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002929 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002930 break;
2931 case CK_PentiumMMX:
2932 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002933 case CK_K6:
2934 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002935 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002936 break;
2937 case CK_Pentium3:
2938 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002939 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002940 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002941 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002942 break;
2943 case CK_PentiumM:
2944 case CK_Pentium4:
2945 case CK_Pentium4M:
2946 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002947 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002948 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002949 break;
2950 case CK_Yonah:
2951 case CK_Prescott:
2952 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002953 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002954 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002955 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002956 break;
2957 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002958 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002959 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002960 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002961 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002962 break;
2963 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002964 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002965 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002966 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002967 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002968 case CK_Cannonlake:
2969 setFeatureEnabledImpl(Features, "avx512ifma", true);
2970 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2971 setFeatureEnabledImpl(Features, "sha", true);
2972 setFeatureEnabledImpl(Features, "umip", true);
2973 // FALLTHROUGH
2974 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002975 setFeatureEnabledImpl(Features, "avx512f", true);
2976 setFeatureEnabledImpl(Features, "avx512cd", true);
2977 setFeatureEnabledImpl(Features, "avx512dq", true);
2978 setFeatureEnabledImpl(Features, "avx512bw", true);
2979 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002980 setFeatureEnabledImpl(Features, "pku", true);
2981 setFeatureEnabledImpl(Features, "pcommit", true);
2982 setFeatureEnabledImpl(Features, "clwb", true);
2983 // FALLTHROUGH
2984 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002985 setFeatureEnabledImpl(Features, "xsavec", true);
2986 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002987 setFeatureEnabledImpl(Features, "mpx", true);
2988 setFeatureEnabledImpl(Features, "sgx", true);
2989 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002990 // FALLTHROUGH
2991 case CK_Broadwell:
2992 setFeatureEnabledImpl(Features, "rdseed", true);
2993 setFeatureEnabledImpl(Features, "adx", true);
2994 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002995 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002996 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002997 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002998 setFeatureEnabledImpl(Features, "bmi", true);
2999 setFeatureEnabledImpl(Features, "bmi2", true);
3000 setFeatureEnabledImpl(Features, "rtm", true);
3001 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003002 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003003 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003004 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003005 setFeatureEnabledImpl(Features, "rdrnd", true);
3006 setFeatureEnabledImpl(Features, "f16c", true);
3007 setFeatureEnabledImpl(Features, "fsgsbase", true);
3008 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003009 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003010 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003011 setFeatureEnabledImpl(Features, "xsave", true);
3012 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003013 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003014 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003015 case CK_Silvermont:
3016 setFeatureEnabledImpl(Features, "aes", true);
3017 setFeatureEnabledImpl(Features, "pclmul", true);
3018 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003019 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003020 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003021 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003022 setFeatureEnabledImpl(Features, "cx16", true);
3023 break;
3024 case CK_KNL:
3025 setFeatureEnabledImpl(Features, "avx512f", true);
3026 setFeatureEnabledImpl(Features, "avx512cd", true);
3027 setFeatureEnabledImpl(Features, "avx512er", true);
3028 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003029 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003030 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003031 setFeatureEnabledImpl(Features, "rdseed", true);
3032 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003033 setFeatureEnabledImpl(Features, "lzcnt", true);
3034 setFeatureEnabledImpl(Features, "bmi", true);
3035 setFeatureEnabledImpl(Features, "bmi2", true);
3036 setFeatureEnabledImpl(Features, "rtm", true);
3037 setFeatureEnabledImpl(Features, "fma", true);
3038 setFeatureEnabledImpl(Features, "rdrnd", true);
3039 setFeatureEnabledImpl(Features, "f16c", true);
3040 setFeatureEnabledImpl(Features, "fsgsbase", true);
3041 setFeatureEnabledImpl(Features, "aes", true);
3042 setFeatureEnabledImpl(Features, "pclmul", true);
3043 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003044 setFeatureEnabledImpl(Features, "xsaveopt", true);
3045 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003046 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003047 break;
3048 case CK_K6_2:
3049 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003050 case CK_WinChip2:
3051 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003052 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003053 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003054 case CK_Athlon:
3055 case CK_AthlonThunderbird:
3056 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003057 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003058 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003059 case CK_Athlon4:
3060 case CK_AthlonXP:
3061 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003062 setFeatureEnabledImpl(Features, "sse", true);
3063 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003064 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003065 break;
3066 case CK_K8:
3067 case CK_Opteron:
3068 case CK_Athlon64:
3069 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003070 setFeatureEnabledImpl(Features, "sse2", true);
3071 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003072 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003073 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003074 case CK_AMDFAM10:
3075 setFeatureEnabledImpl(Features, "sse4a", true);
3076 setFeatureEnabledImpl(Features, "lzcnt", true);
3077 setFeatureEnabledImpl(Features, "popcnt", true);
3078 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003079 case CK_K8SSE3:
3080 case CK_OpteronSSE3:
3081 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003082 setFeatureEnabledImpl(Features, "sse3", true);
3083 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003084 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003085 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003086 case CK_BTVER2:
3087 setFeatureEnabledImpl(Features, "avx", true);
3088 setFeatureEnabledImpl(Features, "aes", true);
3089 setFeatureEnabledImpl(Features, "pclmul", true);
3090 setFeatureEnabledImpl(Features, "bmi", true);
3091 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003092 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003093 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003094 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003095 setFeatureEnabledImpl(Features, "ssse3", true);
3096 setFeatureEnabledImpl(Features, "sse4a", true);
3097 setFeatureEnabledImpl(Features, "lzcnt", true);
3098 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003099 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003100 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003101 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003102 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003103 case CK_BDVER4:
3104 setFeatureEnabledImpl(Features, "avx2", true);
3105 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003106 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003107 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003108 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003109 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003110 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003111 // FALLTHROUGH
3112 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003113 setFeatureEnabledImpl(Features, "bmi", true);
3114 setFeatureEnabledImpl(Features, "fma", true);
3115 setFeatureEnabledImpl(Features, "f16c", true);
3116 setFeatureEnabledImpl(Features, "tbm", true);
3117 // FALLTHROUGH
3118 case CK_BDVER1:
3119 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003120 setFeatureEnabledImpl(Features, "xop", true);
3121 setFeatureEnabledImpl(Features, "lzcnt", true);
3122 setFeatureEnabledImpl(Features, "aes", true);
3123 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003124 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003125 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003126 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003127 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003128 break;
Eli Friedman33465822011-07-08 23:31:17 +00003129 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003130 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3131 return false;
3132
3133 // Can't do this earlier because we need to be able to explicitly enable
3134 // or disable these features and the things that they depend upon.
3135
3136 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3137 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003138 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003139 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3140 FeaturesVec.end())
3141 Features["popcnt"] = true;
3142
3143 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3144 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003145 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003146 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3147 FeaturesVec.end())
3148 Features["prfchw"] = true;
3149
Eric Christophera7260af2015-10-08 20:10:18 +00003150 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3151 // then enable MMX.
3152 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003153 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003154 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3155 FeaturesVec.end())
3156 Features["mmx"] = true;
3157
Eric Christopherbbd746d2015-10-08 20:10:14 +00003158 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003159}
3160
Rafael Espindolae62e2792013-08-20 13:44:29 +00003161void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003162 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003163 if (Enabled) {
3164 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003165 case AVX512F:
3166 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003167 case AVX2:
3168 Features["avx2"] = true;
3169 case AVX:
3170 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003171 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003172 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003173 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003174 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003175 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003176 case SSSE3:
3177 Features["ssse3"] = true;
3178 case SSE3:
3179 Features["sse3"] = true;
3180 case SSE2:
3181 Features["sse2"] = true;
3182 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003183 Features["sse"] = true;
3184 case NoSSE:
3185 break;
3186 }
3187 return;
3188 }
3189
3190 switch (Level) {
3191 case NoSSE:
3192 case SSE1:
3193 Features["sse"] = false;
3194 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003195 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3196 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003197 case SSE3:
3198 Features["sse3"] = false;
3199 setXOPLevel(Features, NoXOP, false);
3200 case SSSE3:
3201 Features["ssse3"] = false;
3202 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003203 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003204 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003205 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003206 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003207 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3208 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003209 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003210 case AVX2:
3211 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003212 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003213 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003214 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003215 Features["avx512vl"] = Features["avx512vbmi"] =
3216 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003217 }
3218}
3219
3220void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003221 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003222 if (Enabled) {
3223 switch (Level) {
3224 case AMD3DNowAthlon:
3225 Features["3dnowa"] = true;
3226 case AMD3DNow:
3227 Features["3dnow"] = true;
3228 case MMX:
3229 Features["mmx"] = true;
3230 case NoMMX3DNow:
3231 break;
3232 }
3233 return;
3234 }
3235
3236 switch (Level) {
3237 case NoMMX3DNow:
3238 case MMX:
3239 Features["mmx"] = false;
3240 case AMD3DNow:
3241 Features["3dnow"] = false;
3242 case AMD3DNowAthlon:
3243 Features["3dnowa"] = false;
3244 }
3245}
3246
3247void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003248 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003249 if (Enabled) {
3250 switch (Level) {
3251 case XOP:
3252 Features["xop"] = true;
3253 case FMA4:
3254 Features["fma4"] = true;
3255 setSSELevel(Features, AVX, true);
3256 case SSE4A:
3257 Features["sse4a"] = true;
3258 setSSELevel(Features, SSE3, true);
3259 case NoXOP:
3260 break;
3261 }
3262 return;
3263 }
3264
3265 switch (Level) {
3266 case NoXOP:
3267 case SSE4A:
3268 Features["sse4a"] = false;
3269 case FMA4:
3270 Features["fma4"] = false;
3271 case XOP:
3272 Features["xop"] = false;
3273 }
3274}
3275
Craig Topper86d79ef2013-09-17 04:51:29 +00003276void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3277 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003278 // This is a bit of a hack to deal with the sse4 target feature when used
3279 // as part of the target attribute. We handle sse4 correctly everywhere
3280 // else. See below for more information on how we handle the sse4 options.
3281 if (Name != "sse4")
3282 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003283
Craig Topper29561122013-09-19 01:13:07 +00003284 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003285 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003286 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003287 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003288 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003289 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003290 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003291 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003292 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003293 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003294 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003295 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003296 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003297 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003298 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003299 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003300 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003301 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003302 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003303 if (Enabled)
3304 setSSELevel(Features, SSE2, Enabled);
3305 } else if (Name == "pclmul") {
3306 if (Enabled)
3307 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003308 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003309 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003310 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003311 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003312 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003313 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003314 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3315 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3316 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003317 if (Enabled)
3318 setSSELevel(Features, AVX512F, Enabled);
3319 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003320 if (Enabled)
3321 setSSELevel(Features, AVX, Enabled);
3322 } else if (Name == "fma4") {
3323 setXOPLevel(Features, FMA4, Enabled);
3324 } else if (Name == "xop") {
3325 setXOPLevel(Features, XOP, Enabled);
3326 } else if (Name == "sse4a") {
3327 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003328 } else if (Name == "f16c") {
3329 if (Enabled)
3330 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003331 } else if (Name == "sha") {
3332 if (Enabled)
3333 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003334 } else if (Name == "sse4") {
3335 // We can get here via the __target__ attribute since that's not controlled
3336 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3337 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3338 // disabled.
3339 if (Enabled)
3340 setSSELevel(Features, SSE42, Enabled);
3341 else
3342 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003343 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003344 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003345 Features["xsaveopt"] = false;
3346 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003347 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003348 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003349 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003350}
3351
Eric Christopher3ff21b32013-10-16 21:26:26 +00003352/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003353/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003354bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003355 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003356 for (const auto &Feature : Features) {
3357 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003358 continue;
3359
Eric Christopher610fe112015-08-26 08:21:55 +00003360 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003361 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003362 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003363 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003364 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003365 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003366 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003367 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003368 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003369 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003370 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003371 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003372 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003373 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003374 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003375 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003376 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003377 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003378 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003379 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003380 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003381 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003382 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003383 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003384 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003385 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003386 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003387 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003388 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003389 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003390 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003391 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003392 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003393 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003394 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003395 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003396 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003397 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003398 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003399 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003400 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003401 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003402 } else if (Feature == "+avx512vbmi") {
3403 HasAVX512VBMI = true;
3404 } else if (Feature == "+avx512ifma") {
3405 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003406 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003407 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003408 } else if (Feature == "+mpx") {
3409 HasMPX = true;
3410 } else if (Feature == "+movbe") {
3411 HasMOVBE = true;
3412 } else if (Feature == "+sgx") {
3413 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003414 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003415 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003416 } else if (Feature == "+fxsr") {
3417 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003418 } else if (Feature == "+xsave") {
3419 HasXSAVE = true;
3420 } else if (Feature == "+xsaveopt") {
3421 HasXSAVEOPT = true;
3422 } else if (Feature == "+xsavec") {
3423 HasXSAVEC = true;
3424 } else if (Feature == "+xsaves") {
3425 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003426 } else if (Feature == "+mwaitx") {
3427 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003428 } else if (Feature == "+pku") {
3429 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003430 } else if (Feature == "+clflushopt") {
3431 HasCLFLUSHOPT = true;
3432 } else if (Feature == "+pcommit") {
3433 HasPCOMMIT = true;
3434 } else if (Feature == "+clwb") {
3435 HasCLWB = true;
3436 } else if (Feature == "+umip") {
3437 HasUMIP = true;
3438 } else if (Feature == "+prefetchwt1") {
3439 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003440 }
3441
Benjamin Kramer27402c62012-03-05 15:10:44 +00003442 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003443 .Case("+avx512f", AVX512F)
3444 .Case("+avx2", AVX2)
3445 .Case("+avx", AVX)
3446 .Case("+sse4.2", SSE42)
3447 .Case("+sse4.1", SSE41)
3448 .Case("+ssse3", SSSE3)
3449 .Case("+sse3", SSE3)
3450 .Case("+sse2", SSE2)
3451 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003452 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003453 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003454
Eli Friedman33465822011-07-08 23:31:17 +00003455 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003456 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003457 .Case("+3dnowa", AMD3DNowAthlon)
3458 .Case("+3dnow", AMD3DNow)
3459 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003460 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003461 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003462
3463 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003464 .Case("+xop", XOP)
3465 .Case("+fma4", FMA4)
3466 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003467 .Default(NoXOP);
3468 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003469 }
Eli Friedman33465822011-07-08 23:31:17 +00003470
Rafael Espindolaeb265472013-08-21 21:59:03 +00003471 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3472 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003473 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3474 (FPMath == FP_387 && SSELevel >= SSE1)) {
3475 Diags.Report(diag::err_target_unsupported_fpmath) <<
3476 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003477 return false;
3478 }
3479
Alexey Bataev00396512015-07-02 03:40:19 +00003480 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003481 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003482 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003483}
Chris Lattnerecd49032009-03-02 22:27:17 +00003484
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003485/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3486/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003487void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003488 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003489 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003490 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003491 Builder.defineMacro("__amd64__");
3492 Builder.defineMacro("__amd64");
3493 Builder.defineMacro("__x86_64");
3494 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003495 if (getTriple().getArchName() == "x86_64h") {
3496 Builder.defineMacro("__x86_64h");
3497 Builder.defineMacro("__x86_64h__");
3498 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003499 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003500 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003501 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003502
Chris Lattnerecd49032009-03-02 22:27:17 +00003503 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003504 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3505 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003506 switch (CPU) {
3507 case CK_Generic:
3508 break;
3509 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003510 // The rest are coming from the i386 define above.
3511 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003512 break;
3513 case CK_i486:
3514 case CK_WinChipC6:
3515 case CK_WinChip2:
3516 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003517 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003518 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003519 case CK_PentiumMMX:
3520 Builder.defineMacro("__pentium_mmx__");
3521 Builder.defineMacro("__tune_pentium_mmx__");
3522 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003523 case CK_i586:
3524 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003525 defineCPUMacros(Builder, "i586");
3526 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003527 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003528 case CK_Pentium3:
3529 case CK_Pentium3M:
3530 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003531 Builder.defineMacro("__tune_pentium3__");
3532 // Fallthrough
3533 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003534 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003535 Builder.defineMacro("__tune_pentium2__");
3536 // Fallthrough
3537 case CK_PentiumPro:
3538 Builder.defineMacro("__tune_i686__");
3539 Builder.defineMacro("__tune_pentiumpro__");
3540 // Fallthrough
3541 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003542 Builder.defineMacro("__i686");
3543 Builder.defineMacro("__i686__");
3544 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3545 Builder.defineMacro("__pentiumpro");
3546 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003547 break;
3548 case CK_Pentium4:
3549 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003550 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003551 break;
3552 case CK_Yonah:
3553 case CK_Prescott:
3554 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003555 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003556 break;
3557 case CK_Core2:
3558 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003559 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003560 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003561 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003562 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003563 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003564 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003565 defineCPUMacros(Builder, "slm");
3566 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003567 case CK_Nehalem:
3568 case CK_Westmere:
3569 case CK_SandyBridge:
3570 case CK_IvyBridge:
3571 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003572 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003573 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003574 // FIXME: Historically, we defined this legacy name, it would be nice to
3575 // remove it at some point. We've never exposed fine-grained names for
3576 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003577 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003578 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003579 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003580 defineCPUMacros(Builder, "skx");
3581 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003582 case CK_Cannonlake:
3583 break;
Craig Topper449314e2013-08-20 07:09:39 +00003584 case CK_KNL:
3585 defineCPUMacros(Builder, "knl");
3586 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003587 case CK_Lakemont:
3588 Builder.defineMacro("__tune_lakemont__");
3589 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003590 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003591 Builder.defineMacro("__k6_2__");
3592 Builder.defineMacro("__tune_k6_2__");
3593 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003594 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003595 if (CPU != CK_K6_2) { // In case of fallthrough
3596 // FIXME: GCC may be enabling these in cases where some other k6
3597 // architecture is specified but -m3dnow is explicitly provided. The
3598 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003599 Builder.defineMacro("__k6_3__");
3600 Builder.defineMacro("__tune_k6_3__");
3601 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003602 // Fallthrough
3603 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003604 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003605 break;
3606 case CK_Athlon:
3607 case CK_AthlonThunderbird:
3608 case CK_Athlon4:
3609 case CK_AthlonXP:
3610 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003611 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003612 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003613 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003614 Builder.defineMacro("__tune_athlon_sse__");
3615 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003616 break;
3617 case CK_K8:
3618 case CK_K8SSE3:
3619 case CK_x86_64:
3620 case CK_Opteron:
3621 case CK_OpteronSSE3:
3622 case CK_Athlon64:
3623 case CK_Athlon64SSE3:
3624 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003625 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003626 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003627 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003628 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003629 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003630 case CK_BTVER1:
3631 defineCPUMacros(Builder, "btver1");
3632 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003633 case CK_BTVER2:
3634 defineCPUMacros(Builder, "btver2");
3635 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003636 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003637 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003638 break;
3639 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003640 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003641 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003642 case CK_BDVER3:
3643 defineCPUMacros(Builder, "bdver3");
3644 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003645 case CK_BDVER4:
3646 defineCPUMacros(Builder, "bdver4");
3647 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003648 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003649 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003650 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003651 }
Chris Lattner96e43572009-03-02 22:40:39 +00003652
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003653 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003654 Builder.defineMacro("__REGISTER_PREFIX__", "");
3655
Chris Lattner6df41af2009-04-19 17:32:33 +00003656 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3657 // functions in glibc header files that use FP Stack inline asm which the
3658 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003659 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003660
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003661 if (HasAES)
3662 Builder.defineMacro("__AES__");
3663
Craig Topper3f122a72012-05-31 05:18:48 +00003664 if (HasPCLMUL)
3665 Builder.defineMacro("__PCLMUL__");
3666
Craig Topper22967d42011-12-25 05:06:45 +00003667 if (HasLZCNT)
3668 Builder.defineMacro("__LZCNT__");
3669
Benjamin Kramer1e250392012-07-07 09:39:18 +00003670 if (HasRDRND)
3671 Builder.defineMacro("__RDRND__");
3672
Craig Topper8c7f2512014-11-03 06:51:41 +00003673 if (HasFSGSBASE)
3674 Builder.defineMacro("__FSGSBASE__");
3675
Craig Topper22967d42011-12-25 05:06:45 +00003676 if (HasBMI)
3677 Builder.defineMacro("__BMI__");
3678
3679 if (HasBMI2)
3680 Builder.defineMacro("__BMI2__");
3681
Craig Topper1de83482011-12-29 16:10:46 +00003682 if (HasPOPCNT)
3683 Builder.defineMacro("__POPCNT__");
3684
Michael Liao625a8752012-11-10 05:17:46 +00003685 if (HasRTM)
3686 Builder.defineMacro("__RTM__");
3687
Michael Liao74f4eaf2013-03-26 17:52:08 +00003688 if (HasPRFCHW)
3689 Builder.defineMacro("__PRFCHW__");
3690
Michael Liaoffaae352013-03-29 05:17:55 +00003691 if (HasRDSEED)
3692 Builder.defineMacro("__RDSEED__");
3693
Robert Khasanov50e6f582014-09-19 09:53:48 +00003694 if (HasADX)
3695 Builder.defineMacro("__ADX__");
3696
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003697 if (HasTBM)
3698 Builder.defineMacro("__TBM__");
3699
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003700 if (HasMWAITX)
3701 Builder.defineMacro("__MWAITX__");
3702
Rafael Espindolae62e2792013-08-20 13:44:29 +00003703 switch (XOPLevel) {
3704 case XOP:
3705 Builder.defineMacro("__XOP__");
3706 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003707 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003708 case SSE4A:
3709 Builder.defineMacro("__SSE4A__");
3710 case NoXOP:
3711 break;
3712 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003713
Craig Topperbba778b2012-06-03 21:46:30 +00003714 if (HasFMA)
3715 Builder.defineMacro("__FMA__");
3716
Manman Rena45358c2012-10-11 00:59:55 +00003717 if (HasF16C)
3718 Builder.defineMacro("__F16C__");
3719
Craig Topper679b53a2013-08-21 05:29:10 +00003720 if (HasAVX512CD)
3721 Builder.defineMacro("__AVX512CD__");
3722 if (HasAVX512ER)
3723 Builder.defineMacro("__AVX512ER__");
3724 if (HasAVX512PF)
3725 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003726 if (HasAVX512DQ)
3727 Builder.defineMacro("__AVX512DQ__");
3728 if (HasAVX512BW)
3729 Builder.defineMacro("__AVX512BW__");
3730 if (HasAVX512VL)
3731 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003732 if (HasAVX512VBMI)
3733 Builder.defineMacro("__AVX512VBMI__");
3734 if (HasAVX512IFMA)
3735 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003736
Ben Langmuir58078d02013-09-19 13:22:04 +00003737 if (HasSHA)
3738 Builder.defineMacro("__SHA__");
3739
Craig Toppere33f51f2015-10-16 06:22:36 +00003740 if (HasFXSR)
3741 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003742 if (HasXSAVE)
3743 Builder.defineMacro("__XSAVE__");
3744 if (HasXSAVEOPT)
3745 Builder.defineMacro("__XSAVEOPT__");
3746 if (HasXSAVEC)
3747 Builder.defineMacro("__XSAVEC__");
3748 if (HasXSAVES)
3749 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003750 if (HasPKU)
3751 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003752 if (HasCX16)
3753 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3754
Chris Lattner96e43572009-03-02 22:40:39 +00003755 // Each case falls through to the previous one here.
3756 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003757 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003758 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003759 case AVX2:
3760 Builder.defineMacro("__AVX2__");
3761 case AVX:
3762 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003763 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003764 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003765 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003766 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003767 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003768 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003769 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003770 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003771 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003772 Builder.defineMacro("__SSE2__");
3773 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003774 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003775 Builder.defineMacro("__SSE__");
3776 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003777 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003778 break;
3779 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003780
Derek Schuffc7dd7222012-10-11 15:52:22 +00003781 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003782 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003783 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003784 case AVX2:
3785 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003786 case SSE42:
3787 case SSE41:
3788 case SSSE3:
3789 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003790 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003791 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003792 break;
3793 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003794 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003795 break;
3796 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003797 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003798 }
3799 }
3800
Anders Carlssone437c682010-01-27 03:47:49 +00003801 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003802 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003803 case AMD3DNowAthlon:
3804 Builder.defineMacro("__3dNOW_A__");
3805 case AMD3DNow:
3806 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003807 case MMX:
3808 Builder.defineMacro("__MMX__");
3809 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003810 break;
3811 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003812
3813 if (CPU >= CK_i486) {
3814 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3815 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3816 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3817 }
3818 if (CPU >= CK_i586)
3819 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003820}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003821
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003822bool X86TargetInfo::hasFeature(StringRef Feature) const {
3823 return llvm::StringSwitch<bool>(Feature)
3824 .Case("aes", HasAES)
3825 .Case("avx", SSELevel >= AVX)
3826 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003827 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003828 .Case("avx512cd", HasAVX512CD)
3829 .Case("avx512er", HasAVX512ER)
3830 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003831 .Case("avx512dq", HasAVX512DQ)
3832 .Case("avx512bw", HasAVX512BW)
3833 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003834 .Case("avx512vbmi", HasAVX512VBMI)
3835 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003836 .Case("bmi", HasBMI)
3837 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003838 .Case("clflushopt", HasCLFLUSHOPT)
3839 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003840 .Case("cx16", HasCX16)
3841 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003842 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003843 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003844 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003845 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003846 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003847 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3848 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3849 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003850 .Case("movbe", HasMOVBE)
3851 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003852 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003853 .Case("pcommit", HasPCOMMIT)
3854 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003855 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003856 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003857 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003858 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003859 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003860 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003861 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003862 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003863 .Case("sse", SSELevel >= SSE1)
3864 .Case("sse2", SSELevel >= SSE2)
3865 .Case("sse3", SSELevel >= SSE3)
3866 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003867 .Case("sse4.1", SSELevel >= SSE41)
3868 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003869 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003870 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003871 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003872 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003873 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3874 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003875 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003876 .Case("xsave", HasXSAVE)
3877 .Case("xsavec", HasXSAVEC)
3878 .Case("xsaves", HasXSAVES)
3879 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003880 .Default(false);
3881}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003882
Eric Christopherd9832702015-06-29 21:00:05 +00003883// We can't use a generic validation scheme for the features accepted here
3884// versus subtarget features accepted in the target attribute because the
3885// bitfield structure that's initialized in the runtime only supports the
3886// below currently rather than the full range of subtarget features. (See
3887// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3888bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3889 return llvm::StringSwitch<bool>(FeatureStr)
3890 .Case("cmov", true)
3891 .Case("mmx", true)
3892 .Case("popcnt", true)
3893 .Case("sse", true)
3894 .Case("sse2", true)
3895 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003896 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003897 .Case("sse4.1", true)
3898 .Case("sse4.2", true)
3899 .Case("avx", true)
3900 .Case("avx2", true)
3901 .Case("sse4a", true)
3902 .Case("fma4", true)
3903 .Case("xop", true)
3904 .Case("fma", true)
3905 .Case("avx512f", true)
3906 .Case("bmi", true)
3907 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003908 .Case("aes", true)
3909 .Case("pclmul", true)
3910 .Case("avx512vl", true)
3911 .Case("avx512bw", true)
3912 .Case("avx512dq", true)
3913 .Case("avx512cd", true)
3914 .Case("avx512er", true)
3915 .Case("avx512pf", true)
3916 .Case("avx512vbmi", true)
3917 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003918 .Default(false);
3919}
3920
Eli Friedman3fd920a2008-08-20 02:34:37 +00003921bool
Anders Carlsson58436352009-02-28 17:11:49 +00003922X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003923 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003924 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003925 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003926 // Constant constraints.
3927 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3928 // instructions.
3929 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3930 // x86_64 instructions.
3931 case 's':
3932 Info.setRequiresImmediate();
3933 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003934 case 'I':
3935 Info.setRequiresImmediate(0, 31);
3936 return true;
3937 case 'J':
3938 Info.setRequiresImmediate(0, 63);
3939 return true;
3940 case 'K':
3941 Info.setRequiresImmediate(-128, 127);
3942 return true;
3943 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003944 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003945 return true;
3946 case 'M':
3947 Info.setRequiresImmediate(0, 3);
3948 return true;
3949 case 'N':
3950 Info.setRequiresImmediate(0, 255);
3951 return true;
3952 case 'O':
3953 Info.setRequiresImmediate(0, 127);
3954 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003955 // Register constraints.
3956 case 'Y': // 'Y' is the first character for several 2-character constraints.
3957 // Shift the pointer to the second character of the constraint.
3958 Name++;
3959 switch (*Name) {
3960 default:
3961 return false;
3962 case '0': // First SSE register.
3963 case 't': // Any SSE register, when SSE2 is enabled.
3964 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3965 case 'm': // Any MMX register, when inter-unit moves enabled.
3966 Info.setAllowsRegister();
3967 return true;
3968 }
3969 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003970 // Constraint 'f' cannot be used for output operands.
3971 if (Info.ConstraintStr[0] == '=')
3972 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003973 Info.setAllowsRegister();
3974 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003975 case 'a': // eax.
3976 case 'b': // ebx.
3977 case 'c': // ecx.
3978 case 'd': // edx.
3979 case 'S': // esi.
3980 case 'D': // edi.
3981 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003982 case 't': // Top of floating point stack.
3983 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003984 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003985 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003986 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003987 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003988 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3989 case 'l': // "Index" registers: any general register that can be used as an
3990 // index in a base+index memory access.
3991 Info.setAllowsRegister();
3992 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003993 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003994 case 'C': // SSE floating point constant.
3995 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003996 return true;
3997 }
3998}
3999
Akira Hatanaka974131e2014-09-18 18:17:18 +00004000bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4001 unsigned Size) const {
4002 // Strip off constraint modifiers.
4003 while (Constraint[0] == '=' ||
4004 Constraint[0] == '+' ||
4005 Constraint[0] == '&')
4006 Constraint = Constraint.substr(1);
4007
4008 return validateOperandSize(Constraint, Size);
4009}
4010
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004011bool X86TargetInfo::validateInputSize(StringRef Constraint,
4012 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004013 return validateOperandSize(Constraint, Size);
4014}
4015
4016bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4017 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004018 switch (Constraint[0]) {
4019 default: break;
4020 case 'y':
4021 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004022 case 'f':
4023 case 't':
4024 case 'u':
4025 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00004026 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004027 if (SSELevel >= AVX512F)
4028 // 512-bit zmm registers can be used if target supports AVX512F.
4029 return Size <= 512U;
4030 else if (SSELevel >= AVX)
4031 // 256-bit ymm registers can be used if target supports AVX.
4032 return Size <= 256U;
4033 return Size <= 128U;
4034 case 'Y':
4035 // 'Y' is the first character for several 2-character constraints.
4036 switch (Constraint[1]) {
4037 default: break;
4038 case 'm':
4039 // 'Ym' is synonymous with 'y'.
4040 return Size <= 64;
4041 case 'i':
4042 case 't':
4043 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4044 if (SSELevel >= AVX512F)
4045 return Size <= 512U;
4046 else if (SSELevel >= AVX)
4047 return Size <= 256U;
4048 return SSELevel >= SSE2 && Size <= 128U;
4049 }
4050
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004051 }
4052
4053 return true;
4054}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004055
Eli Friedman3fd920a2008-08-20 02:34:37 +00004056std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004057X86TargetInfo::convertConstraint(const char *&Constraint) const {
4058 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004059 case 'a': return std::string("{ax}");
4060 case 'b': return std::string("{bx}");
4061 case 'c': return std::string("{cx}");
4062 case 'd': return std::string("{dx}");
4063 case 'S': return std::string("{si}");
4064 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004065 case 'p': // address
4066 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004067 case 't': // top of floating point stack.
4068 return std::string("{st}");
4069 case 'u': // second from top of floating point stack.
4070 return std::string("{st(1)}"); // second from top of floating point stack.
4071 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004072 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004073 }
4074}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004075
Eli Friedman3fd920a2008-08-20 02:34:37 +00004076// X86-32 generic target
4077class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004078public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004079 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4080 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004081 DoubleAlign = LongLongAlign = 32;
4082 LongDoubleWidth = 96;
4083 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004084 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004085 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004086 SizeType = UnsignedInt;
4087 PtrDiffType = SignedInt;
4088 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004089 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004090
4091 // Use fpret for all types.
4092 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4093 (1 << TargetInfo::Double) |
4094 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004095
4096 // x86-32 has atomics up to 8 bytes
4097 // FIXME: Check that we actually have cmpxchg8b before setting
4098 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4099 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004100 }
Craig Topper3164f332014-03-11 03:39:26 +00004101 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004102 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004103 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004104
Craig Topper3164f332014-03-11 03:39:26 +00004105 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004106 if (RegNo == 0) return 0;
4107 if (RegNo == 1) return 2;
4108 return -1;
4109 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004110 bool validateOperandSize(StringRef Constraint,
4111 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004112 switch (Constraint[0]) {
4113 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004114 case 'R':
4115 case 'q':
4116 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004117 case 'a':
4118 case 'b':
4119 case 'c':
4120 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004121 case 'S':
4122 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004123 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004124 case 'A':
4125 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004126 }
4127
Akira Hatanaka974131e2014-09-18 18:17:18 +00004128 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004129 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004130};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004131
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004132class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4133public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004134 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4135 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004136
Craig Topper3164f332014-03-11 03:39:26 +00004137 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004138 unsigned Major, Minor, Micro;
4139 getTriple().getOSVersion(Major, Minor, Micro);
4140 // New NetBSD uses the default rounding mode.
4141 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4142 return X86_32TargetInfo::getFloatEvalMethod();
4143 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004144 return 1;
4145 }
4146};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004147
Eli Friedmane3aa4542009-07-05 18:47:56 +00004148class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4149public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004150 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4151 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004152 SizeType = UnsignedLong;
4153 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004154 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004155 }
4156};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004157
Eli Friedman9fa28852012-08-08 23:57:20 +00004158class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4159public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004160 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4161 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004162 SizeType = UnsignedLong;
4163 IntPtrType = SignedLong;
4164 PtrDiffType = SignedLong;
4165 }
4166};
Eli Friedman9fa28852012-08-08 23:57:20 +00004167
Torok Edwinb2b37c62009-06-30 17:10:35 +00004168class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004169public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004170 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4171 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004172 LongDoubleWidth = 128;
4173 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004174 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004175 MaxVectorAlign = 256;
4176 // The watchOS simulator uses the builtin bool type for Objective-C.
4177 llvm::Triple T = llvm::Triple(Triple);
4178 if (T.isWatchOS())
4179 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004180 SizeType = UnsignedLong;
4181 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004182 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004183 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004184 }
4185
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004186 bool handleTargetFeatures(std::vector<std::string> &Features,
4187 DiagnosticsEngine &Diags) override {
4188 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4189 Diags))
4190 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004191 // We now know the features we have: we can decide how to align vectors.
4192 MaxVectorAlign =
4193 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004194 return true;
4195 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004196};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004197
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004198// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004199class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004200public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004201 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4202 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004203 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004204 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004205 bool IsWinCOFF =
4206 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004207 resetDataLayout(IsWinCOFF
4208 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4209 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004210 }
Craig Topper3164f332014-03-11 03:39:26 +00004211 void getTargetDefines(const LangOptions &Opts,
4212 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004213 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4214 }
4215};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004216
4217// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004218class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004219public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004220 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4221 const TargetOptions &Opts)
4222 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004223 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004224 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4225 }
Craig Topper3164f332014-03-11 03:39:26 +00004226 void getTargetDefines(const LangOptions &Opts,
4227 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004228 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4229 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4230 // The value of the following reflects processor type.
4231 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4232 // We lost the original triple, so we use the default.
4233 Builder.defineMacro("_M_IX86", "600");
4234 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004235};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004236
David Majnemerae1ed0e2015-05-28 04:36:18 +00004237static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004238 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4239 // supports __declspec natively under -fms-extensions, but we define a no-op
4240 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004241 if (Opts.MicrosoftExt)
4242 Builder.defineMacro("__declspec", "__declspec");
4243 else
4244 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4245
4246 if (!Opts.MicrosoftExt) {
4247 // Provide macros for all the calling convention keywords. Provide both
4248 // single and double underscore prefixed variants. These are available on
4249 // x64 as well as x86, even though they have no effect.
4250 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4251 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004252 std::string GCCSpelling = "__attribute__((__";
4253 GCCSpelling += CC;
4254 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004255 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4256 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4257 }
4258 }
4259}
4260
David Majnemerae1ed0e2015-05-28 04:36:18 +00004261static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4262 Builder.defineMacro("__MSVCRT__");
4263 Builder.defineMacro("__MINGW32__");
4264 addCygMingDefines(Opts, Builder);
4265}
4266
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004267// x86-32 MinGW target
4268class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4269public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004270 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4271 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004272 void getTargetDefines(const LangOptions &Opts,
4273 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004274 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004275 DefineStd(Builder, "WIN32", Opts);
4276 DefineStd(Builder, "WINNT", Opts);
4277 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004278 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004279 }
4280};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004281
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004282// x86-32 Cygwin target
4283class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4284public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004285 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4286 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004287 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004288 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004289 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 +00004290 }
Craig Topper3164f332014-03-11 03:39:26 +00004291 void getTargetDefines(const LangOptions &Opts,
4292 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004293 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004294 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004295 Builder.defineMacro("__CYGWIN__");
4296 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004297 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004298 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004299 if (Opts.CPlusPlus)
4300 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004301 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004302};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004303
Chris Lattnerb986aba2010-04-11 19:29:39 +00004304// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004305class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004306public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004307 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004308 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004309 }
Craig Topper3164f332014-03-11 03:39:26 +00004310 void getTargetDefines(const LangOptions &Opts,
4311 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004312 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004313 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004314 }
4315};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004316
Alexey Bataevc99b0492015-11-25 09:24:26 +00004317// X86-32 MCU target
4318class MCUX86_32TargetInfo : public X86_32TargetInfo {
4319public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004320 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4321 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004322 LongDoubleWidth = 64;
4323 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004324 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 +00004325 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004326 }
4327
4328 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4329 // On MCU we support only C calling convention.
4330 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4331 }
4332
4333 void getTargetDefines(const LangOptions &Opts,
4334 MacroBuilder &Builder) const override {
4335 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4336 Builder.defineMacro("__iamcu");
4337 Builder.defineMacro("__iamcu__");
4338 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004339
4340 bool allowsLargerPreferedTypeAlignment() const override {
4341 return false;
4342 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004343};
4344
Douglas Gregor9fabd852011-07-01 22:41:14 +00004345// RTEMS Target
4346template<typename Target>
4347class RTEMSTargetInfo : public OSTargetInfo<Target> {
4348protected:
Craig Topper3164f332014-03-11 03:39:26 +00004349 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4350 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004351 // RTEMS defines; list based off of gcc output
4352
Douglas Gregor9fabd852011-07-01 22:41:14 +00004353 Builder.defineMacro("__rtems__");
4354 Builder.defineMacro("__ELF__");
4355 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004356
Douglas Gregor9fabd852011-07-01 22:41:14 +00004357public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004358 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4359 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004360 switch (Triple.getArch()) {
4361 default:
4362 case llvm::Triple::x86:
4363 // this->MCountName = ".mcount";
4364 break;
4365 case llvm::Triple::mips:
4366 case llvm::Triple::mipsel:
4367 case llvm::Triple::ppc:
4368 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004369 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004370 // this->MCountName = "_mcount";
4371 break;
4372 case llvm::Triple::arm:
4373 // this->MCountName = "__mcount";
4374 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004375 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004376 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004377};
4378
Douglas Gregor9fabd852011-07-01 22:41:14 +00004379// x86-32 RTEMS target
4380class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4381public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004382 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4383 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004384 SizeType = UnsignedLong;
4385 IntPtrType = SignedLong;
4386 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004387 }
Craig Topper3164f332014-03-11 03:39:26 +00004388 void getTargetDefines(const LangOptions &Opts,
4389 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004390 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4391 Builder.defineMacro("__INTEL__");
4392 Builder.defineMacro("__rtems__");
4393 }
4394};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004395
Eli Friedman3fd920a2008-08-20 02:34:37 +00004396// x86-64 generic target
4397class X86_64TargetInfo : public X86TargetInfo {
4398public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004399 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4400 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004401 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004402 bool IsWinCOFF =
4403 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004404 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004405 LongDoubleWidth = 128;
4406 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004407 LargeArrayMinWidth = 128;
4408 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004409 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004410 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4411 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4412 IntPtrType = IsX32 ? SignedInt : SignedLong;
4413 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004414 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004415 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004416
Eric Christopher917e9522014-11-18 22:36:15 +00004417 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004418 resetDataLayout(IsX32
4419 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4420 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4421 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004422
4423 // Use fpret only for long double.
4424 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004425
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004426 // Use fp2ret for _Complex long double.
4427 ComplexLongDoubleUsesFP2Ret = true;
4428
Charles Davisc7d5c942015-09-17 20:55:33 +00004429 // Make __builtin_ms_va_list available.
4430 HasBuiltinMSVaList = true;
4431
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004432 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004433 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004434 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004435 }
Craig Topper3164f332014-03-11 03:39:26 +00004436 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004437 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004438 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004439
Craig Topper3164f332014-03-11 03:39:26 +00004440 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004441 if (RegNo == 0) return 0;
4442 if (RegNo == 1) return 1;
4443 return -1;
4444 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004445
Craig Topper3164f332014-03-11 03:39:26 +00004446 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004447 switch (CC) {
4448 case CC_C:
4449 case CC_Swift:
4450 case CC_X86VectorCall:
4451 case CC_IntelOclBicc:
4452 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004453 case CC_PreserveMost:
4454 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004455 return CCCR_OK;
4456 default:
4457 return CCCR_Warning;
4458 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004459 }
4460
Craig Topper3164f332014-03-11 03:39:26 +00004461 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004462 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004463 }
4464
Pavel Chupinfd223e12014-08-04 12:39:43 +00004465 // for x32 we need it here explicitly
4466 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004467 unsigned getUnwindWordWidth() const override { return 64; }
4468 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004469
4470 bool validateGlobalRegisterVariable(StringRef RegName,
4471 unsigned RegSize,
4472 bool &HasSizeMismatch) const override {
4473 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4474 // handle.
4475 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4476 // Check that the register size is 64-bit.
4477 HasSizeMismatch = RegSize != 64;
4478 return true;
4479 }
4480
4481 // Check if the register is a 32-bit register the backend can handle.
4482 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4483 HasSizeMismatch);
4484 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004485};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004486
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004487// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004488class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004489public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004490 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4491 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004492 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004493 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004494 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004495 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004496 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004497 SizeType = UnsignedLongLong;
4498 PtrDiffType = SignedLongLong;
4499 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004500 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004501
Craig Topper3164f332014-03-11 03:39:26 +00004502 void getTargetDefines(const LangOptions &Opts,
4503 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004504 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004505 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004506 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004507
Craig Topper3164f332014-03-11 03:39:26 +00004508 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004509 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004510 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004511
Craig Topper3164f332014-03-11 03:39:26 +00004512 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004513 switch (CC) {
4514 case CC_X86StdCall:
4515 case CC_X86ThisCall:
4516 case CC_X86FastCall:
4517 return CCCR_Ignore;
4518 case CC_C:
4519 case CC_X86VectorCall:
4520 case CC_IntelOclBicc:
4521 case CC_X86_64SysV:
4522 return CCCR_OK;
4523 default:
4524 return CCCR_Warning;
4525 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004526 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004527};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004528
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004529// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004530class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004531public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004532 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4533 const TargetOptions &Opts)
4534 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004535 LongDoubleWidth = LongDoubleAlign = 64;
4536 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004537 }
Craig Topper3164f332014-03-11 03:39:26 +00004538 void getTargetDefines(const LangOptions &Opts,
4539 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004540 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4541 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004542 Builder.defineMacro("_M_X64", "100");
4543 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004544 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004545};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004546
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004547// x86-64 MinGW target
4548class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4549public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004550 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4551 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004552 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4553 // with x86 FP ops. Weird.
4554 LongDoubleWidth = LongDoubleAlign = 128;
4555 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4556 }
4557
Craig Topper3164f332014-03-11 03:39:26 +00004558 void getTargetDefines(const LangOptions &Opts,
4559 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004560 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004561 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004562 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004563 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004564
4565 // GCC defines this macro when it is using __gxx_personality_seh0.
4566 if (!Opts.SjLjExceptions)
4567 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004568 }
4569};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004570
Yaron Kerend030d112015-07-22 17:38:19 +00004571// x86-64 Cygwin target
4572class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4573public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004574 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4575 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004576 TLSSupported = false;
4577 WCharType = UnsignedShort;
4578 }
4579 void getTargetDefines(const LangOptions &Opts,
4580 MacroBuilder &Builder) const override {
4581 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4582 Builder.defineMacro("__x86_64__");
4583 Builder.defineMacro("__CYGWIN__");
4584 Builder.defineMacro("__CYGWIN64__");
4585 addCygMingDefines(Opts, Builder);
4586 DefineStd(Builder, "unix", Opts);
4587 if (Opts.CPlusPlus)
4588 Builder.defineMacro("_GNU_SOURCE");
4589
4590 // GCC defines this macro when it is using __gxx_personality_seh0.
4591 if (!Opts.SjLjExceptions)
4592 Builder.defineMacro("__SEH__");
4593 }
4594};
4595
Eli Friedman2857ccb2009-07-01 03:36:11 +00004596class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4597public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004598 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4599 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004600 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004601 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4602 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004603 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004604 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004605 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004606 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004607
4608 bool handleTargetFeatures(std::vector<std::string> &Features,
4609 DiagnosticsEngine &Diags) override {
4610 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4611 Diags))
4612 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004613 // We now know the features we have: we can decide how to align vectors.
4614 MaxVectorAlign =
4615 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004616 return true;
4617 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004618};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004619
Eli Friedman245f2292009-07-05 22:31:18 +00004620class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4621public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004622 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4623 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004624 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004625 Int64Type = SignedLongLong;
4626 }
4627};
Eli Friedman245f2292009-07-05 22:31:18 +00004628
Eli Friedman9fa28852012-08-08 23:57:20 +00004629class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4630public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004631 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4632 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004633 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004634 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004635 }
4636};
Tim Northover9bb857a2013-01-31 12:13:10 +00004637
Eli Friedmanf05b7722008-08-20 07:44:10 +00004638class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004639 // Possible FPU choices.
4640 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004641 VFP2FPU = (1 << 0),
4642 VFP3FPU = (1 << 1),
4643 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004644 NeonFPU = (1 << 3),
4645 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004646 };
4647
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004648 // Possible HWDiv features.
4649 enum HWDivMode {
4650 HWDivThumb = (1 << 0),
4651 HWDivARM = (1 << 1)
4652 };
4653
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004654 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004655 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004656 }
4657
4658 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4659 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004660
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004661 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004662
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004663 StringRef CPUProfile;
4664 StringRef CPUAttr;
4665
Rafael Espindolaeb265472013-08-21 21:59:03 +00004666 enum {
4667 FP_Default,
4668 FP_VFP,
4669 FP_Neon
4670 } FPMath;
4671
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004672 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004673 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004674 unsigned ArchProfile;
4675 unsigned ArchVersion;
4676
Bernard Ogdenda13af32013-10-24 18:32:51 +00004677 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004678
Logan Chien57086ce2012-10-10 06:56:20 +00004679 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004680 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004681
4682 // Initialized via features.
4683 unsigned SoftFloat : 1;
4684 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004685
Bernard Ogden18b57012013-10-29 09:47:51 +00004686 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004687 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004688 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004689 unsigned Unaligned : 1;
4690
4691 enum {
4692 LDREX_B = (1 << 0), /// byte (8-bit)
4693 LDREX_H = (1 << 1), /// half (16-bit)
4694 LDREX_W = (1 << 2), /// word (32-bit)
4695 LDREX_D = (1 << 3), /// double (64-bit)
4696 };
4697
4698 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004699
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004700 // ACLE 6.5.1 Hardware floating point
4701 enum {
4702 HW_FP_HP = (1 << 1), /// half (16-bit)
4703 HW_FP_SP = (1 << 2), /// single (32-bit)
4704 HW_FP_DP = (1 << 3), /// double (64-bit)
4705 };
4706 uint32_t HW_FP;
4707
Chris Lattner5cc15e02010-03-03 19:03:45 +00004708 static const Builtin::Info BuiltinInfo[];
4709
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004710 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004711 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004712
4713 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004714 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004715
Renato Golin0201a9e2016-09-22 19:28:20 +00004716 // size_t is unsigned long on MachO-derived environments, NetBSD,
4717 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004718 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004719 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004720 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004721 SizeType = UnsignedLong;
4722 else
4723 SizeType = UnsignedInt;
4724
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004725 switch (T.getOS()) {
4726 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004727 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004728 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004729 break;
4730 case llvm::Triple::Win32:
4731 WCharType = UnsignedShort;
4732 break;
4733 case llvm::Triple::Linux:
4734 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004735 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4736 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004737 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004738 }
4739
4740 UseBitFieldTypeAlignment = true;
4741
4742 ZeroLengthBitfieldBoundary = 0;
4743
Tim Northover147cd2f2014-10-14 22:12:21 +00004744 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4745 // so set preferred for small types to 32.
4746 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004747 resetDataLayout(BigEndian
4748 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4749 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004750 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004751 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004752 resetDataLayout("e"
4753 "-m:w"
4754 "-p:32:32"
4755 "-i64:64"
4756 "-v128:64:128"
4757 "-a:0:32"
4758 "-n32"
4759 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004760 } else if (T.isOSNaCl()) {
4761 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004762 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004763 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004764 resetDataLayout(BigEndian
4765 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4766 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004767 }
4768
4769 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004770 }
4771
Tim Northover5627d392015-10-30 16:30:45 +00004772 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004773 const llvm::Triple &T = getTriple();
4774
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004775 IsAAPCS = false;
4776
Tim Northover5627d392015-10-30 16:30:45 +00004777 if (IsAAPCS16)
4778 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4779 else
4780 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004781
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004782 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004783 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004784 SizeType = UnsignedInt;
4785 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004786 SizeType = UnsignedLong;
4787
4788 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4789 WCharType = SignedInt;
4790
4791 // Do not respect the alignment of bit-field types when laying out
4792 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4793 UseBitFieldTypeAlignment = false;
4794
4795 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4796 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4797 /// gcc.
4798 ZeroLengthBitfieldBoundary = 32;
4799
Tim Northover5627d392015-10-30 16:30:45 +00004800 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4801 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004802 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004803 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004804 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004805 BigEndian
4806 ? "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 +00004807 : "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 +00004808 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004809 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004810 BigEndian
4811 ? "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 +00004812 : "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 +00004813
4814 // FIXME: Override "preferred align" for double and long long.
4815 }
4816
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004817 void setArchInfo() {
4818 StringRef ArchName = getTriple().getArchName();
4819
Renato Goline84b0002015-10-08 16:43:26 +00004820 ArchISA = llvm::ARM::parseArchISA(ArchName);
4821 CPU = llvm::ARM::getDefaultCPU(ArchName);
4822 unsigned AK = llvm::ARM::parseArch(ArchName);
4823 if (AK != llvm::ARM::AK_INVALID)
4824 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004825 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004826 }
4827
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004828 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004829 StringRef SubArch;
4830
4831 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004832 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004833 SubArch = llvm::ARM::getSubArch(ArchKind);
4834 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4835 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004836
4837 // cache CPU related strings
4838 CPUAttr = getCPUAttr();
4839 CPUProfile = getCPUProfile();
4840 }
4841
4842 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004843 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004844 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004845 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004846 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4847 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004848 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004849 if (ArchProfile == llvm::ARM::PK_M) {
4850 MaxAtomicPromoteWidth = 32;
4851 if (ShouldUseInlineAtomic)
4852 MaxAtomicInlineWidth = 32;
4853 }
4854 else {
4855 MaxAtomicPromoteWidth = 64;
4856 if (ShouldUseInlineAtomic)
4857 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004858 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004859 }
4860
4861 bool isThumb() const {
4862 return (ArchISA == llvm::ARM::IK_THUMB);
4863 }
4864
4865 bool supportsThumb() const {
4866 return CPUAttr.count('T') || ArchVersion >= 6;
4867 }
4868
4869 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004870 return CPUAttr.equals("6T2") ||
4871 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004872 }
4873
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004874 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004875 // For most sub-arches, the build attribute CPU name is enough.
4876 // For Cortex variants, it's slightly different.
4877 switch(ArchKind) {
4878 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004879 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004880 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004881 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004882 case llvm::ARM::AK_ARMV7S:
4883 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004884 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004885 return "7A";
4886 case llvm::ARM::AK_ARMV7R:
4887 return "7R";
4888 case llvm::ARM::AK_ARMV7M:
4889 return "7M";
4890 case llvm::ARM::AK_ARMV7EM:
4891 return "7EM";
4892 case llvm::ARM::AK_ARMV8A:
4893 return "8A";
4894 case llvm::ARM::AK_ARMV8_1A:
4895 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004896 case llvm::ARM::AK_ARMV8_2A:
4897 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004898 case llvm::ARM::AK_ARMV8MBaseline:
4899 return "8M_BASE";
4900 case llvm::ARM::AK_ARMV8MMainline:
4901 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004902 }
4903 }
4904
4905 StringRef getCPUProfile() const {
4906 switch(ArchProfile) {
4907 case llvm::ARM::PK_A:
4908 return "A";
4909 case llvm::ARM::PK_R:
4910 return "R";
4911 case llvm::ARM::PK_M:
4912 return "M";
4913 default:
4914 return "";
4915 }
4916 }
4917
Chris Lattner17df24e2008-04-21 18:56:49 +00004918public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004919 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004920 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4921 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004922
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004923 switch (getTriple().getOS()) {
4924 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004925 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004926 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004927 break;
4928 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004929 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004930 break;
4931 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004932
Renato Goline84b0002015-10-08 16:43:26 +00004933 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004934 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004935
Chris Lattner1a8f3942010-04-23 16:29:58 +00004936 // {} in inline assembly are neon specifiers, not assembly variant
4937 // specifiers.
4938 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004939
Eric Christopher0e261882014-12-05 01:06:59 +00004940 // FIXME: This duplicates code from the driver that sets the -target-abi
4941 // option - this code is used if -target-abi isn't passed and should
4942 // be unified in some way.
4943 if (Triple.isOSBinFormatMachO()) {
4944 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4945 // the frontend matches that.
4946 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4947 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004948 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004949 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004950 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004951 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004952 } else {
4953 setABI("apcs-gnu");
4954 }
4955 } else if (Triple.isOSWindows()) {
4956 // FIXME: this is invalid for WindowsCE
4957 setABI("aapcs");
4958 } else {
4959 // Select the default based on the platform.
4960 switch (Triple.getEnvironment()) {
4961 case llvm::Triple::Android:
4962 case llvm::Triple::GNUEABI:
4963 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004964 case llvm::Triple::MuslEABI:
4965 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004966 setABI("aapcs-linux");
4967 break;
4968 case llvm::Triple::EABIHF:
4969 case llvm::Triple::EABI:
4970 setABI("aapcs");
4971 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004972 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004973 setABI("apcs-gnu");
4974 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004975 default:
4976 if (Triple.getOS() == llvm::Triple::NetBSD)
4977 setABI("apcs-gnu");
4978 else
4979 setABI("aapcs");
4980 break;
4981 }
4982 }
John McCall86353412010-08-21 22:46:04 +00004983
4984 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004985 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004986
Renato Golin15b86152015-07-03 16:41:13 +00004987 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004988 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004989
James Molloya7139222012-03-12 09:14:10 +00004990 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004991 // the alignment of the zero-length bitfield is greater than the member
4992 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004993 // zero length bitfield.
4994 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004995
4996 if (Triple.getOS() == llvm::Triple::Linux ||
4997 Triple.getOS() == llvm::Triple::UnknownOS)
4998 this->MCountName =
4999 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005000 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005001
Alp Toker4925ba72014-06-07 23:30:42 +00005002 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005003
Craig Topper3164f332014-03-11 03:39:26 +00005004 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005005 ABI = Name;
5006
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005007 // The defaults (above) are for AAPCS, check if we need to change them.
5008 //
5009 // FIXME: We need support for -meabi... we could just mangle it into the
5010 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005011 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005012 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005013 return true;
5014 }
5015 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5016 setABIAAPCS();
5017 return true;
5018 }
5019 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005020 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005021
Renato Golinf5c4dec2015-05-27 13:33:00 +00005022 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005023 bool
5024 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5025 StringRef CPU,
5026 const std::vector<std::string> &FeaturesVec) const override {
5027
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005028 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005029 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005030
5031 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005032 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005033 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5034
5035 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005036 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005037 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5038
5039 for (const char *Feature : TargetFeatures)
5040 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00005041 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005042
Eric Christopher007b0a02015-08-28 22:32:01 +00005043 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005044 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005045
Craig Topper3164f332014-03-11 03:39:26 +00005046 bool handleTargetFeatures(std::vector<std::string> &Features,
5047 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005048 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005049 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005050 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005051 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005052 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005053 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005054 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005055
Ranjeet Singhac08e532015-06-24 23:39:25 +00005056 // This does not diagnose illegal cases like having both
5057 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5058 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005059 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005060 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005061 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005062 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005063 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005064 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005065 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005066 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005067 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005068 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005069 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005070 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005071 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005072 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005073 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005074 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005075 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005076 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005077 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005078 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005079 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005080 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005081 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005082 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005083 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005084 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005085 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005086 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005087 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005088 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005089 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005090 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005091 } else if (Feature == "+strict-align") {
5092 Unaligned = 0;
5093 } else if (Feature == "+fp16") {
5094 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005095 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005096 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005097 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005098
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005099 switch (ArchVersion) {
5100 case 6:
5101 if (ArchProfile == llvm::ARM::PK_M)
5102 LDREX = 0;
5103 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5104 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5105 else
5106 LDREX = LDREX_W;
5107 break;
5108 case 7:
5109 if (ArchProfile == llvm::ARM::PK_M)
5110 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5111 else
5112 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5113 break;
5114 case 8:
5115 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5116 }
5117
Rafael Espindolaeb265472013-08-21 21:59:03 +00005118 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5119 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5120 return false;
5121 }
5122
5123 if (FPMath == FP_Neon)
5124 Features.push_back("+neonfp");
5125 else if (FPMath == FP_VFP)
5126 Features.push_back("-neonfp");
5127
Daniel Dunbar893d4752009-12-19 04:15:38 +00005128 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005129 auto Feature =
5130 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5131 if (Feature != Features.end())
5132 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005133
Rafael Espindolaeb265472013-08-21 21:59:03 +00005134 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005135 }
5136
Craig Topper3164f332014-03-11 03:39:26 +00005137 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005138 return llvm::StringSwitch<bool>(Feature)
5139 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005140 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005141 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005142 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005143 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005144 .Case("hwdiv", HWDiv & HWDivThumb)
5145 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005146 .Default(false);
5147 }
Renato Golin15b86152015-07-03 16:41:13 +00005148
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005149 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005150 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005151 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005152
Renato Golin15b86152015-07-03 16:41:13 +00005153 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005154 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005155 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005156 CPU = Name;
5157 return true;
5158 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005159
Craig Topper3164f332014-03-11 03:39:26 +00005160 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005161
Craig Topper3164f332014-03-11 03:39:26 +00005162 void getTargetDefines(const LangOptions &Opts,
5163 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005164 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005165 Builder.defineMacro("__arm");
5166 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005167 // For bare-metal none-eabi.
5168 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5169 getTriple().getEnvironment() == llvm::Triple::EABI)
5170 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005171
Chris Lattnerecd49032009-03-02 22:27:17 +00005172 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005173 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005174
5175 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5176 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005177 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005178 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5179
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005180 if (!CPUAttr.empty())
5181 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005182
5183 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005184 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005185 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005186
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005187 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005188 // ACLE 6.5.7 Crypto Extension
5189 if (Crypto)
5190 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5191 // ACLE 6.5.8 CRC32 Extension
5192 if (CRC)
5193 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5194 // ACLE 6.5.10 Numeric Maximum and Minimum
5195 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5196 // ACLE 6.5.9 Directed Rounding
5197 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005198 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005199
5200 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5201 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005202 // NOTE that the default profile is assumed to be 'A'
5203 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005204 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5205
Bradley Smithf4affc12016-03-03 13:52:22 +00005206 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5207 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5208 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5209 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005210 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005211 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005212 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005213 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5214
5215 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5216 // instruction set such as ARM or Thumb.
5217 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5218
5219 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5220
5221 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005222 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005223 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005224
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005225 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005226 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005227 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005228
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005229 // ACLE 6.4.4 LDREX/STREX
5230 if (LDREX)
5231 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5232
5233 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005234 if (ArchVersion == 5 ||
5235 (ArchVersion == 6 && CPUProfile != "M") ||
5236 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005237 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5238
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005239 // ACLE 6.5.1 Hardware Floating Point
5240 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005241 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005242
Yi Konga44c4d72014-06-27 21:25:42 +00005243 // ACLE predefines.
5244 Builder.defineMacro("__ARM_ACLE", "200");
5245
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005246 // FP16 support (we currently only support IEEE format).
5247 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5248 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5249
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005250 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005251 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005252 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5253
Mike Stump9d54bd72009-04-08 02:07:04 +00005254 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005255
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005256 // FIXME: It's more complicated than this and we don't really support
5257 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005258 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005259 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005260 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005261
David Tweed8f676532012-10-25 13:33:01 +00005262 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005263 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005264 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005265 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005266 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005267 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005268 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005269
Tim Northover28fc0e12016-04-28 13:59:55 +00005270 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5271 ABI == "aapcs16")
5272 Builder.defineMacro("__ARM_PCS_VFP", "1");
5273
Daniel Dunbar893d4752009-12-19 04:15:38 +00005274 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005275 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005276
Zijiao Ma56a83722016-08-17 02:13:33 +00005277 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005278 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005279
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005280 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005281 Builder.defineMacro("__THUMBEL__");
5282 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005283 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005284 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005285 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005286
5287 // ACLE 6.4.9 32-bit SIMD instructions
5288 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5289 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5290
5291 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005292 if (((HWDiv & HWDivThumb) && isThumb()) ||
5293 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005294 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005295 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005296 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005297
5298 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005299 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005300
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005301 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005302 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005303 if (FPU & VFP2FPU)
5304 Builder.defineMacro("__ARM_VFPV2__");
5305 if (FPU & VFP3FPU)
5306 Builder.defineMacro("__ARM_VFPV3__");
5307 if (FPU & VFP4FPU)
5308 Builder.defineMacro("__ARM_VFPV4__");
5309 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005310
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005311 // This only gets set when Neon instructions are actually available, unlike
5312 // the VFP define, hence the soft float and arch check. This is subtly
5313 // different from gcc, we follow the intent which was that it should be set
5314 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005315 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005316 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005317 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005318 // current AArch32 NEON implementations do not support double-precision
5319 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005320 Builder.defineMacro("__ARM_NEON_FP",
5321 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005322 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005323
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005324 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5325 Opts.ShortWChar ? "2" : "4");
5326
5327 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5328 Opts.ShortEnums ? "1" : "4");
5329
Bradley Smithf4affc12016-03-03 13:52:22 +00005330 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5333 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5334 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5335 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005336
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005337 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005338 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005339 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005340 }
5341
5342 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005343 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005344 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5345 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005346 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005347 }
5348
5349 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005350 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005351 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005352
5353 if (Opts.UnsafeFPMath)
5354 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005355
5356 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5357 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005358 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005359
Craig Topper6c03a542015-10-19 04:51:35 +00005360 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5361 return llvm::makeArrayRef(BuiltinInfo,
5362 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005363 }
Craig Topper3164f332014-03-11 03:39:26 +00005364 bool isCLZForZeroUndef() const override { return false; }
5365 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005366 return IsAAPCS
5367 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005368 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5369 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005370 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005371 ArrayRef<const char *> getGCCRegNames() const override;
5372 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005373 bool validateAsmConstraint(const char *&Name,
5374 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005375 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005376 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005377 case 'l': // r0-r7
5378 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005379 case 't': // VFP Floating point register single precision
5380 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005381 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005382 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005383 case 'I':
5384 case 'J':
5385 case 'K':
5386 case 'L':
5387 case 'M':
5388 // FIXME
5389 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005390 case 'Q': // A memory address that is a single base register.
5391 Info.setAllowsMemory();
5392 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005393 case 'U': // a memory reference...
5394 switch (Name[1]) {
5395 case 'q': // ...ARMV4 ldrsb
5396 case 'v': // ...VFP load/store (reg+constant offset)
5397 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005398 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005399 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005400 case 'n': // valid address for Neon doubleword vector load/store
5401 case 'm': // valid address for Neon element and structure load/store
5402 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005403 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005404 Info.setAllowsMemory();
5405 Name++;
5406 return true;
5407 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005408 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005409 return false;
5410 }
Craig Topper3164f332014-03-11 03:39:26 +00005411 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005412 std::string R;
5413 switch (*Constraint) {
5414 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005415 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005416 Constraint++;
5417 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005418 case 'p': // 'p' should be translated to 'r' by default.
5419 R = std::string("r");
5420 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005421 default:
5422 return std::string(1, *Constraint);
5423 }
5424 return R;
5425 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005426 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005427 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005428 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005429 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005430 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005431
Bill Wendling9d1ee112012-10-25 23:28:48 +00005432 // Strip off constraint modifiers.
5433 while (Constraint[0] == '=' ||
5434 Constraint[0] == '+' ||
5435 Constraint[0] == '&')
5436 Constraint = Constraint.substr(1);
5437
5438 switch (Constraint[0]) {
5439 default: break;
5440 case 'r': {
5441 switch (Modifier) {
5442 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005443 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005444 case 'q':
5445 // A register of size 32 cannot fit a vector type.
5446 return false;
5447 }
5448 }
5449 }
5450
5451 return true;
5452 }
Craig Topper3164f332014-03-11 03:39:26 +00005453 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005454 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005455 return "";
5456 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005457
Craig Topper3164f332014-03-11 03:39:26 +00005458 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005459 switch (CC) {
5460 case CC_AAPCS:
5461 case CC_AAPCS_VFP:
5462 case CC_Swift:
5463 return CCCR_OK;
5464 default:
5465 return CCCR_Warning;
5466 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005467 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005468
Craig Topper3164f332014-03-11 03:39:26 +00005469 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005470 if (RegNo == 0) return 0;
5471 if (RegNo == 1) return 1;
5472 return -1;
5473 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005474
5475 bool hasSjLjLowering() const override {
5476 return true;
5477 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005478};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005479
Rafael Espindolaeb265472013-08-21 21:59:03 +00005480bool ARMTargetInfo::setFPMath(StringRef Name) {
5481 if (Name == "neon") {
5482 FPMath = FP_Neon;
5483 return true;
5484 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5485 Name == "vfp4") {
5486 FPMath = FP_VFP;
5487 return true;
5488 }
5489 return false;
5490}
5491
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005492const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005493 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005494 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005495 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5496
5497 // Float registers
5498 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5499 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5500 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005501 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005502
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005503 // Double registers
5504 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5505 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005506 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5507 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005508
5509 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005510 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5511 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005512};
5513
Craig Topperf054e3a2015-10-19 03:52:27 +00005514ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5515 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005516}
5517
5518const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005519 { { "a1" }, "r0" },
5520 { { "a2" }, "r1" },
5521 { { "a3" }, "r2" },
5522 { { "a4" }, "r3" },
5523 { { "v1" }, "r4" },
5524 { { "v2" }, "r5" },
5525 { { "v3" }, "r6" },
5526 { { "v4" }, "r7" },
5527 { { "v5" }, "r8" },
5528 { { "v6", "rfp" }, "r9" },
5529 { { "sl" }, "r10" },
5530 { { "fp" }, "r11" },
5531 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005532 { { "r13" }, "sp" },
5533 { { "r14" }, "lr" },
5534 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005535 // The S, D and Q registers overlap, but aren't really aliases; we
5536 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005537};
5538
Craig Topperf054e3a2015-10-19 03:52:27 +00005539ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5540 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005541}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005542
5543const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005544#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005545 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005546#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5547 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005548#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005549
Craig Topper07d3b622015-08-07 05:14:44 +00005550#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005551 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005552#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005553 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005554#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5555 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005556#include "clang/Basic/BuiltinsARM.def"
5557};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005558
5559class ARMleTargetInfo : public ARMTargetInfo {
5560public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005561 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005562 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005563 void getTargetDefines(const LangOptions &Opts,
5564 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005565 Builder.defineMacro("__ARMEL__");
5566 ARMTargetInfo::getTargetDefines(Opts, Builder);
5567 }
5568};
5569
5570class ARMbeTargetInfo : public ARMTargetInfo {
5571public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005572 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005573 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005574 void getTargetDefines(const LangOptions &Opts,
5575 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005576 Builder.defineMacro("__ARMEB__");
5577 Builder.defineMacro("__ARM_BIG_ENDIAN");
5578 ARMTargetInfo::getTargetDefines(Opts, Builder);
5579 }
5580};
Chris Lattner17df24e2008-04-21 18:56:49 +00005581
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005582class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5583 const llvm::Triple Triple;
5584public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005585 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5586 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005587 WCharType = UnsignedShort;
5588 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005589 }
5590 void getVisualStudioDefines(const LangOptions &Opts,
5591 MacroBuilder &Builder) const {
5592 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5593
5594 // FIXME: this is invalid for WindowsCE
5595 Builder.defineMacro("_M_ARM_NT", "1");
5596 Builder.defineMacro("_M_ARMT", "_M_ARM");
5597 Builder.defineMacro("_M_THUMB", "_M_ARM");
5598
5599 assert((Triple.getArch() == llvm::Triple::arm ||
5600 Triple.getArch() == llvm::Triple::thumb) &&
5601 "invalid architecture for Windows ARM target info");
5602 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5603 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5604
5605 // TODO map the complete set of values
5606 // 31: VFPv3 40: VFPv4
5607 Builder.defineMacro("_M_ARM_FP", "31");
5608 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005609 BuiltinVaListKind getBuiltinVaListKind() const override {
5610 return TargetInfo::CharPtrBuiltinVaList;
5611 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005612 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5613 switch (CC) {
5614 case CC_X86StdCall:
5615 case CC_X86ThisCall:
5616 case CC_X86FastCall:
5617 case CC_X86VectorCall:
5618 return CCCR_Ignore;
5619 case CC_C:
5620 return CCCR_OK;
5621 default:
5622 return CCCR_Warning;
5623 }
5624 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005625};
5626
5627// Windows ARM + Itanium C++ ABI Target
5628class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5629public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005630 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5631 const TargetOptions &Opts)
5632 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005633 TheCXXABI.set(TargetCXXABI::GenericARM);
5634 }
5635
5636 void getTargetDefines(const LangOptions &Opts,
5637 MacroBuilder &Builder) const override {
5638 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5639
5640 if (Opts.MSVCCompat)
5641 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5642 }
5643};
5644
5645// Windows ARM, MS (C++) ABI
5646class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5647public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005648 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5649 const TargetOptions &Opts)
5650 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005651 TheCXXABI.set(TargetCXXABI::Microsoft);
5652 }
5653
5654 void getTargetDefines(const LangOptions &Opts,
5655 MacroBuilder &Builder) const override {
5656 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5657 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5658 }
5659};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005660
Yaron Keren321249c2015-07-15 13:32:23 +00005661// ARM MinGW target
5662class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5663public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005664 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5665 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005666 TheCXXABI.set(TargetCXXABI::GenericARM);
5667 }
5668
5669 void getTargetDefines(const LangOptions &Opts,
5670 MacroBuilder &Builder) const override {
5671 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5672 DefineStd(Builder, "WIN32", Opts);
5673 DefineStd(Builder, "WINNT", Opts);
5674 Builder.defineMacro("_ARM_");
5675 addMinGWDefines(Opts, Builder);
5676 }
5677};
5678
5679// ARM Cygwin target
5680class CygwinARMTargetInfo : public ARMleTargetInfo {
5681public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005682 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5683 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005684 TLSSupported = false;
5685 WCharType = UnsignedShort;
5686 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005687 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005688 }
5689 void getTargetDefines(const LangOptions &Opts,
5690 MacroBuilder &Builder) const override {
5691 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5692 Builder.defineMacro("_ARM_");
5693 Builder.defineMacro("__CYGWIN__");
5694 Builder.defineMacro("__CYGWIN32__");
5695 DefineStd(Builder, "unix", Opts);
5696 if (Opts.CPlusPlus)
5697 Builder.defineMacro("_GNU_SOURCE");
5698 }
5699};
5700
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005701class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005702protected:
Craig Topper3164f332014-03-11 03:39:26 +00005703 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5704 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005705 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005706 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005707
Torok Edwinb2b37c62009-06-30 17:10:35 +00005708public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005709 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5710 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005711 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005712 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005713 // FIXME: This should be based off of the target features in
5714 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005715 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005716
Tim Northoverd88ecb32016-01-27 19:32:40 +00005717 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005718 // Darwin on iOS uses a variant of the ARM C++ ABI.
5719 TheCXXABI.set(TargetCXXABI::WatchOS);
5720
5721 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5722 // size_t is long, it's a bit weird for it to be int.
5723 PtrDiffType = SignedLong;
5724
5725 // BOOL should be a real boolean on the new ABI
5726 UseSignedCharForObjCBool = false;
5727 } else
5728 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005729 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005730};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005731
Tim Northover573cbee2014-05-24 12:52:07 +00005732class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005733 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005734 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5735 static const char *const GCCRegNames[];
5736
James Molloy75f5f9e2014-04-16 15:33:48 +00005737 enum FPUModeEnum {
5738 FPUMode,
5739 NeonMode
5740 };
5741
5742 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005743 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005744 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005745 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005746 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005747
Tim Northovera2ee4332014-03-29 15:09:45 +00005748 static const Builtin::Info BuiltinInfo[];
5749
5750 std::string ABI;
5751
5752public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005753 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005754 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005755 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5756 WCharType = SignedInt;
5757
5758 // NetBSD apparently prefers consistency across ARM targets to consistency
5759 // across 64-bit targets.
5760 Int64Type = SignedLongLong;
5761 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005762 } else {
5763 WCharType = UnsignedInt;
5764 Int64Type = SignedLong;
5765 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005766 }
5767
Tim Northovera2ee4332014-03-29 15:09:45 +00005768 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005769 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005770 MaxAtomicInlineWidth = 128;
5771 MaxAtomicPromoteWidth = 128;
5772
Tim Northovera6a19f12015-02-06 01:25:07 +00005773 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005774 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5775
Tim Northovera2ee4332014-03-29 15:09:45 +00005776 // {} in inline assembly are neon specifiers, not assembly variant
5777 // specifiers.
5778 NoAsmVariants = true;
5779
Tim Northover7ad87af2015-01-16 18:44:04 +00005780 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5781 // contributes to the alignment of the containing aggregate in the same way
5782 // a plain (non bit-field) member of that type would, without exception for
5783 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005784 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005785 UseZeroLengthBitfieldAlignment = true;
5786
Tim Northover573cbee2014-05-24 12:52:07 +00005787 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005788 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005789
5790 if (Triple.getOS() == llvm::Triple::Linux ||
5791 Triple.getOS() == llvm::Triple::UnknownOS)
5792 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005793 }
5794
Alp Toker4925ba72014-06-07 23:30:42 +00005795 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005796 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005797 if (Name != "aapcs" && Name != "darwinpcs")
5798 return false;
5799
5800 ABI = Name;
5801 return true;
5802 }
5803
David Blaikie1cbb9712014-11-14 19:09:44 +00005804 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005805 return Name == "generic" ||
5806 llvm::AArch64::parseCPUArch(Name) !=
5807 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005808 }
5809
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005810 void getTargetDefines(const LangOptions &Opts,
5811 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005812 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005813 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005814
5815 // Target properties.
5816 Builder.defineMacro("_LP64");
5817 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005818
5819 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5820 Builder.defineMacro("__ARM_ACLE", "200");
5821 Builder.defineMacro("__ARM_ARCH", "8");
5822 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5823
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005824 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005825 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005826 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005827
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005828 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5829 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5830 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5831 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005832 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005833 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5834 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005835
5836 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5837
5838 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005839 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005840
5841 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5842 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005843 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5844 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005845
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005846 if (Opts.UnsafeFPMath)
5847 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005848
5849 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5850
5851 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5852 Opts.ShortEnums ? "1" : "4");
5853
James Molloy75f5f9e2014-04-16 15:33:48 +00005854 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005855 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005856 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005857 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005858 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005859
Bradley Smith418c5932014-05-02 15:17:51 +00005860 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005861 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005862
James Molloy75f5f9e2014-04-16 15:33:48 +00005863 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005864 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5865
5866 if (Unaligned)
5867 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005868
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005869 if (V8_1A)
5870 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5871
Reid Klecknerd167d422015-05-06 15:31:46 +00005872 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5873 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5874 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5875 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5876 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005877 }
5878
Craig Topper6c03a542015-10-19 04:51:35 +00005879 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5880 return llvm::makeArrayRef(BuiltinInfo,
5881 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005882 }
5883
David Blaikie1cbb9712014-11-14 19:09:44 +00005884 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005885 return Feature == "aarch64" ||
5886 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005887 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005888 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005889 }
5890
James Molloy5e73df52014-04-16 15:06:20 +00005891 bool handleTargetFeatures(std::vector<std::string> &Features,
5892 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005893 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005894 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005895 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005896 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005897 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005898
Eric Christopher610fe112015-08-26 08:21:55 +00005899 for (const auto &Feature : Features) {
5900 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005901 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005902 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005903 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005904 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005905 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005906 if (Feature == "+strict-align")
5907 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005908 if (Feature == "+v8.1a")
5909 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005910 }
5911
James Y Knightb214cbc2016-03-04 19:00:41 +00005912 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005913
5914 return true;
5915 }
5916
John McCall477f2bb2016-03-03 06:39:32 +00005917 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5918 switch (CC) {
5919 case CC_C:
5920 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005921 case CC_PreserveMost:
5922 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005923 return CCCR_OK;
5924 default:
5925 return CCCR_Warning;
5926 }
5927 }
5928
David Blaikie1cbb9712014-11-14 19:09:44 +00005929 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005930
David Blaikie1cbb9712014-11-14 19:09:44 +00005931 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005932 return TargetInfo::AArch64ABIBuiltinVaList;
5933 }
5934
Craig Topperf054e3a2015-10-19 03:52:27 +00005935 ArrayRef<const char *> getGCCRegNames() const override;
5936 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005937
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005938 bool validateAsmConstraint(const char *&Name,
5939 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005940 switch (*Name) {
5941 default:
5942 return false;
5943 case 'w': // Floating point and SIMD registers (V0-V31)
5944 Info.setAllowsRegister();
5945 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005946 case 'I': // Constant that can be used with an ADD instruction
5947 case 'J': // Constant that can be used with a SUB instruction
5948 case 'K': // Constant that can be used with a 32-bit logical instruction
5949 case 'L': // Constant that can be used with a 64-bit logical instruction
5950 case 'M': // Constant that can be used as a 32-bit MOV immediate
5951 case 'N': // Constant that can be used as a 64-bit MOV immediate
5952 case 'Y': // Floating point constant zero
5953 case 'Z': // Integer constant zero
5954 return true;
5955 case 'Q': // A memory reference with base register and no offset
5956 Info.setAllowsMemory();
5957 return true;
5958 case 'S': // A symbolic address
5959 Info.setAllowsRegister();
5960 return true;
5961 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005962 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5963 // Utf: A memory address suitable for ldp/stp in TF mode.
5964 // Usa: An absolute symbolic address.
5965 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5966 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005967 case 'z': // Zero register, wzr or xzr
5968 Info.setAllowsRegister();
5969 return true;
5970 case 'x': // Floating point and SIMD registers (V0-V15)
5971 Info.setAllowsRegister();
5972 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005973 }
5974 return false;
5975 }
5976
Akira Hatanaka987f1862014-08-22 06:05:21 +00005977 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005978 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005979 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005980 // Strip off constraint modifiers.
5981 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5982 Constraint = Constraint.substr(1);
5983
5984 switch (Constraint[0]) {
5985 default:
5986 return true;
5987 case 'z':
5988 case 'r': {
5989 switch (Modifier) {
5990 case 'x':
5991 case 'w':
5992 // For now assume that the person knows what they're
5993 // doing with the modifier.
5994 return true;
5995 default:
5996 // By default an 'r' constraint will be in the 'x'
5997 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005998 if (Size == 64)
5999 return true;
6000
6001 SuggestedModifier = "w";
6002 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006003 }
6004 }
6005 }
6006 }
6007
David Blaikie1cbb9712014-11-14 19:09:44 +00006008 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006009
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006010 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006011 if (RegNo == 0)
6012 return 0;
6013 if (RegNo == 1)
6014 return 1;
6015 return -1;
6016 }
6017};
6018
Tim Northover573cbee2014-05-24 12:52:07 +00006019const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006020 // 32-bit Integer registers
6021 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6022 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6023 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6024
6025 // 64-bit Integer registers
6026 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6027 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6028 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6029
6030 // 32-bit floating point regsisters
6031 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6032 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6033 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6034
6035 // 64-bit floating point regsisters
6036 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6037 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6038 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6039
6040 // Vector registers
6041 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6042 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6043 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6044};
6045
Craig Topperf054e3a2015-10-19 03:52:27 +00006046ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6047 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006048}
6049
Tim Northover573cbee2014-05-24 12:52:07 +00006050const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006051 { { "w31" }, "wsp" },
6052 { { "x29" }, "fp" },
6053 { { "x30" }, "lr" },
6054 { { "x31" }, "sp" },
6055 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6056 // don't want to substitute one of these for a different-sized one.
6057};
6058
Craig Topperf054e3a2015-10-19 03:52:27 +00006059ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6060 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006061}
6062
Tim Northover573cbee2014-05-24 12:52:07 +00006063const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006064#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006065 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006066#include "clang/Basic/BuiltinsNEON.def"
6067
6068#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006069 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006070#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006071};
James Molloy5e73df52014-04-16 15:06:20 +00006072
Tim Northover573cbee2014-05-24 12:52:07 +00006073class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006074 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006075 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006076 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006077 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006078 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006079 }
6080
6081public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006082 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6083 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006084 }
James Molloy5e73df52014-04-16 15:06:20 +00006085 void getTargetDefines(const LangOptions &Opts,
6086 MacroBuilder &Builder) const override {
6087 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006088 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006089 }
6090};
6091
Tim Northover573cbee2014-05-24 12:52:07 +00006092class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006093 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006094 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006095 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006096 }
6097
6098public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006099 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6100 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006101 void getTargetDefines(const LangOptions &Opts,
6102 MacroBuilder &Builder) const override {
6103 Builder.defineMacro("__AARCH64EB__");
6104 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6105 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006106 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006107 }
6108};
Tim Northovera2ee4332014-03-29 15:09:45 +00006109
Tim Northover573cbee2014-05-24 12:52:07 +00006110class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006111protected:
6112 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6113 MacroBuilder &Builder) const override {
6114 Builder.defineMacro("__AARCH64_SIMD__");
6115 Builder.defineMacro("__ARM64_ARCH_8__");
6116 Builder.defineMacro("__ARM_NEON__");
6117 Builder.defineMacro("__LITTLE_ENDIAN__");
6118 Builder.defineMacro("__REGISTER_PREFIX__", "");
6119 Builder.defineMacro("__arm64", "1");
6120 Builder.defineMacro("__arm64__", "1");
6121
6122 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6123 }
6124
Tim Northovera2ee4332014-03-29 15:09:45 +00006125public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006126 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6127 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006128 Int64Type = SignedLongLong;
6129 WCharType = SignedInt;
6130 UseSignedCharForObjCBool = false;
6131
Tim Northovera6a19f12015-02-06 01:25:07 +00006132 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006133 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6134
6135 TheCXXABI.set(TargetCXXABI::iOS64);
6136 }
6137
David Blaikie1cbb9712014-11-14 19:09:44 +00006138 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006139 return TargetInfo::CharPtrBuiltinVaList;
6140 }
6141};
Tim Northovera2ee4332014-03-29 15:09:45 +00006142
Tony Linthicum76329bf2011-12-12 21:14:55 +00006143// Hexagon abstract base class
6144class HexagonTargetInfo : public TargetInfo {
6145 static const Builtin::Info BuiltinInfo[];
6146 static const char * const GCCRegNames[];
6147 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6148 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006149 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006150 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006151
Tony Linthicum76329bf2011-12-12 21:14:55 +00006152public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006153 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6154 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006155 // Specify the vector alignment explicitly. For v512x1, the calculated
6156 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6157 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006158 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006159 "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 +00006160 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006161 SizeType = UnsignedInt;
6162 PtrDiffType = SignedInt;
6163 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006164
6165 // {} in inline assembly are packet specifiers, not assembly variant
6166 // specifiers.
6167 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006168
6169 LargeArrayMinWidth = 64;
6170 LargeArrayAlign = 64;
6171 UseBitFieldTypeAlignment = true;
6172 ZeroLengthBitfieldBoundary = 32;
6173 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006174 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006175 }
6176
Craig Topper6c03a542015-10-19 04:51:35 +00006177 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6178 return llvm::makeArrayRef(BuiltinInfo,
6179 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006180 }
6181
Craig Topper3164f332014-03-11 03:39:26 +00006182 bool validateAsmConstraint(const char *&Name,
6183 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006184 switch (*Name) {
6185 case 'v':
6186 case 'q':
6187 if (HasHVX) {
6188 Info.setAllowsRegister();
6189 return true;
6190 }
6191 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006192 case 's':
6193 // Relocatable constant.
6194 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006195 }
6196 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006197 }
6198
Craig Topper3164f332014-03-11 03:39:26 +00006199 void getTargetDefines(const LangOptions &Opts,
6200 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006201
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006202 bool isCLZForZeroUndef() const override { return false; }
6203
Craig Topper3164f332014-03-11 03:39:26 +00006204 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006205 return llvm::StringSwitch<bool>(Feature)
6206 .Case("hexagon", true)
6207 .Case("hvx", HasHVX)
6208 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006209 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006210 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006211 }
Craig Topper3164f332014-03-11 03:39:26 +00006212
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006213 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6214 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6215 const override;
6216
6217 bool handleTargetFeatures(std::vector<std::string> &Features,
6218 DiagnosticsEngine &Diags) override;
6219
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006220 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6221 bool Enabled) const override;
6222
Craig Topper3164f332014-03-11 03:39:26 +00006223 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006224 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006225 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006226 ArrayRef<const char *> getGCCRegNames() const override;
6227 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006228 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006229 return "";
6230 }
Sebastian Pop86500282012-01-13 20:37:10 +00006231
6232 static const char *getHexagonCPUSuffix(StringRef Name) {
6233 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006234 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006235 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006236 .Case("hexagonv55", "55")
6237 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006238 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006239 }
6240
Craig Topper3164f332014-03-11 03:39:26 +00006241 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006242 if (!getHexagonCPUSuffix(Name))
6243 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006244 CPU = Name;
6245 return true;
6246 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006247
6248 int getEHDataRegisterNumber(unsigned RegNo) const override {
6249 return RegNo < 2 ? RegNo : -1;
6250 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006251};
6252
6253void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006254 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006255 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006256 Builder.defineMacro("__hexagon__", "1");
6257
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006258 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006259 Builder.defineMacro("__HEXAGON_V4__");
6260 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006261 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006262 Builder.defineMacro("__QDSP6_V4__");
6263 Builder.defineMacro("__QDSP6_ARCH__", "4");
6264 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006265 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006266 Builder.defineMacro("__HEXAGON_V5__");
6267 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6268 if(Opts.HexagonQdsp6Compat) {
6269 Builder.defineMacro("__QDSP6_V5__");
6270 Builder.defineMacro("__QDSP6_ARCH__", "5");
6271 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006272 } else if (CPU == "hexagonv55") {
6273 Builder.defineMacro("__HEXAGON_V55__");
6274 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6275 Builder.defineMacro("__QDSP6_V55__");
6276 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006277 } else if (CPU == "hexagonv60") {
6278 Builder.defineMacro("__HEXAGON_V60__");
6279 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6280 Builder.defineMacro("__QDSP6_V60__");
6281 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006282 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006283
6284 if (hasFeature("hvx")) {
6285 Builder.defineMacro("__HVX__");
6286 if (hasFeature("hvx-double"))
6287 Builder.defineMacro("__HVXDBL__");
6288 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006289}
6290
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006291bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6292 DiagnosticsEngine &Diags, StringRef CPU,
6293 const std::vector<std::string> &FeaturesVec) const {
6294 // Default for v60: -hvx, -hvx-double.
6295 Features["hvx"] = false;
6296 Features["hvx-double"] = false;
6297 Features["long-calls"] = false;
6298
6299 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6300}
6301
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006302bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6303 DiagnosticsEngine &Diags) {
6304 for (auto &F : Features) {
6305 if (F == "+hvx")
6306 HasHVX = true;
6307 else if (F == "-hvx")
6308 HasHVX = HasHVXDouble = false;
6309 else if (F == "+hvx-double")
6310 HasHVX = HasHVXDouble = true;
6311 else if (F == "-hvx-double")
6312 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006313
6314 if (F == "+long-calls")
6315 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006316 else if (F == "-long-calls")
6317 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006318 }
6319 return true;
6320}
6321
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006322void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6323 StringRef Name, bool Enabled) const {
6324 if (Enabled) {
6325 if (Name == "hvx-double")
6326 Features["hvx"] = true;
6327 } else {
6328 if (Name == "hvx")
6329 Features["hvx-double"] = false;
6330 }
6331 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006332}
6333
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006334const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006335 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6336 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6337 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6338 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6339 "p0", "p1", "p2", "p3",
6340 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6341};
6342
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006343ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006344 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006345}
6346
Tony Linthicum76329bf2011-12-12 21:14:55 +00006347const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6348 { { "sp" }, "r29" },
6349 { { "fp" }, "r30" },
6350 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006351};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006352
Craig Topperf054e3a2015-10-19 03:52:27 +00006353ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6354 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006355}
6356
6357
6358const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006359#define BUILTIN(ID, TYPE, ATTRS) \
6360 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6361#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6362 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006363#include "clang/Basic/BuiltinsHexagon.def"
6364};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006365
Jacques Pienaard964cc22016-03-28 21:02:54 +00006366class LanaiTargetInfo : public TargetInfo {
6367 // Class for Lanai (32-bit).
6368 // The CPU profiles supported by the Lanai backend
6369 enum CPUKind {
6370 CK_NONE,
6371 CK_V11,
6372 } CPU;
6373
6374 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6375 static const char *const GCCRegNames[];
6376
6377public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006378 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6379 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006380 // Description string has to be kept in sync with backend.
6381 resetDataLayout("E" // Big endian
6382 "-m:e" // ELF name manging
6383 "-p:32:32" // 32 bit pointers, 32 bit aligned
6384 "-i64:64" // 64 bit integers, 64 bit aligned
6385 "-a:0:32" // 32 bit alignment of objects of aggregate type
6386 "-n32" // 32 bit native integer width
6387 "-S64" // 64 bit natural stack alignment
6388 );
6389
6390 // Setting RegParmMax equal to what mregparm was set to in the old
6391 // toolchain
6392 RegParmMax = 4;
6393
6394 // Set the default CPU to V11
6395 CPU = CK_V11;
6396
6397 // Temporary approach to make everything at least word-aligned and allow for
6398 // safely casting between pointers with different alignment requirements.
6399 // TODO: Remove this when there are no more cast align warnings on the
6400 // firmware.
6401 MinGlobalAlign = 32;
6402 }
6403
6404 void getTargetDefines(const LangOptions &Opts,
6405 MacroBuilder &Builder) const override {
6406 // Define __lanai__ when building for target lanai.
6407 Builder.defineMacro("__lanai__");
6408
6409 // Set define for the CPU specified.
6410 switch (CPU) {
6411 case CK_V11:
6412 Builder.defineMacro("__LANAI_V11__");
6413 break;
6414 case CK_NONE:
6415 llvm_unreachable("Unhandled target CPU");
6416 }
6417 }
6418
6419 bool setCPU(const std::string &Name) override {
6420 CPU = llvm::StringSwitch<CPUKind>(Name)
6421 .Case("v11", CK_V11)
6422 .Default(CK_NONE);
6423
6424 return CPU != CK_NONE;
6425 }
6426
6427 bool hasFeature(StringRef Feature) const override {
6428 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6429 }
6430
6431 ArrayRef<const char *> getGCCRegNames() const override;
6432
6433 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6434
6435 BuiltinVaListKind getBuiltinVaListKind() const override {
6436 return TargetInfo::VoidPtrBuiltinVaList;
6437 }
6438
6439 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6440
6441 bool validateAsmConstraint(const char *&Name,
6442 TargetInfo::ConstraintInfo &info) const override {
6443 return false;
6444 }
6445
6446 const char *getClobbers() const override { return ""; }
6447};
6448
6449const char *const LanaiTargetInfo::GCCRegNames[] = {
6450 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6451 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6452 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6453
6454ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6455 return llvm::makeArrayRef(GCCRegNames);
6456}
6457
6458const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6459 {{"pc"}, "r2"},
6460 {{"sp"}, "r4"},
6461 {{"fp"}, "r5"},
6462 {{"rv"}, "r8"},
6463 {{"rr1"}, "r10"},
6464 {{"rr2"}, "r11"},
6465 {{"rca"}, "r15"},
6466};
6467
6468ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6469 return llvm::makeArrayRef(GCCRegAliases);
6470}
6471
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006472// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6473class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006474 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6475 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006476 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006477public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006478 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006479 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006480
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006481 int getEHDataRegisterNumber(unsigned RegNo) const override {
6482 if (RegNo == 0) return 24;
6483 if (RegNo == 1) return 25;
6484 return -1;
6485 }
6486
Craig Topper3164f332014-03-11 03:39:26 +00006487 bool handleTargetFeatures(std::vector<std::string> &Features,
6488 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006489 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006490 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6491 if (Feature != Features.end()) {
6492 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006493 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006494 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006495 }
Craig Topper3164f332014-03-11 03:39:26 +00006496 void getTargetDefines(const LangOptions &Opts,
6497 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006498 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006499 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006500
6501 if (SoftFloat)
6502 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006503 }
Craig Topper3164f332014-03-11 03:39:26 +00006504
6505 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006506 return llvm::StringSwitch<bool>(Feature)
6507 .Case("softfloat", SoftFloat)
6508 .Case("sparc", true)
6509 .Default(false);
6510 }
Craig Topper3164f332014-03-11 03:39:26 +00006511
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006512 bool hasSjLjLowering() const override {
6513 return true;
6514 }
6515
Craig Topper6c03a542015-10-19 04:51:35 +00006516 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006517 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006518 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006519 }
Craig Topper3164f332014-03-11 03:39:26 +00006520 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006521 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006522 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006523 ArrayRef<const char *> getGCCRegNames() const override;
6524 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006525 bool validateAsmConstraint(const char *&Name,
6526 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006527 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006528 switch (*Name) {
6529 case 'I': // Signed 13-bit constant
6530 case 'J': // Zero
6531 case 'K': // 32-bit constant with the low 12 bits clear
6532 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6533 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6534 case 'N': // Same as 'K' but zext (required for SIMode)
6535 case 'O': // The constant 4096
6536 return true;
6537 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006538 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006539 }
Craig Topper3164f332014-03-11 03:39:26 +00006540 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006541 // FIXME: Implement!
6542 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006543 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006544
6545 // No Sparc V7 for now, the backend doesn't support it anyway.
6546 enum CPUKind {
6547 CK_GENERIC,
6548 CK_V8,
6549 CK_SUPERSPARC,
6550 CK_SPARCLITE,
6551 CK_F934,
6552 CK_HYPERSPARC,
6553 CK_SPARCLITE86X,
6554 CK_SPARCLET,
6555 CK_TSC701,
6556 CK_V9,
6557 CK_ULTRASPARC,
6558 CK_ULTRASPARC3,
6559 CK_NIAGARA,
6560 CK_NIAGARA2,
6561 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006562 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006563 CK_MYRIAD2100,
6564 CK_MYRIAD2150,
6565 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006566 CK_LEON2,
6567 CK_LEON2_AT697E,
6568 CK_LEON2_AT697F,
6569 CK_LEON3,
6570 CK_LEON3_UT699,
6571 CK_LEON3_GR712RC,
6572 CK_LEON4,
6573 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006574 } CPU = CK_GENERIC;
6575
6576 enum CPUGeneration {
6577 CG_V8,
6578 CG_V9,
6579 };
6580
6581 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6582 switch (Kind) {
6583 case CK_GENERIC:
6584 case CK_V8:
6585 case CK_SUPERSPARC:
6586 case CK_SPARCLITE:
6587 case CK_F934:
6588 case CK_HYPERSPARC:
6589 case CK_SPARCLITE86X:
6590 case CK_SPARCLET:
6591 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006592 case CK_MYRIAD2100:
6593 case CK_MYRIAD2150:
6594 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006595 case CK_LEON2:
6596 case CK_LEON2_AT697E:
6597 case CK_LEON2_AT697F:
6598 case CK_LEON3:
6599 case CK_LEON3_UT699:
6600 case CK_LEON3_GR712RC:
6601 case CK_LEON4:
6602 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006603 return CG_V8;
6604 case CK_V9:
6605 case CK_ULTRASPARC:
6606 case CK_ULTRASPARC3:
6607 case CK_NIAGARA:
6608 case CK_NIAGARA2:
6609 case CK_NIAGARA3:
6610 case CK_NIAGARA4:
6611 return CG_V9;
6612 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006613 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006614 }
6615
6616 CPUKind getCPUKind(StringRef Name) const {
6617 return llvm::StringSwitch<CPUKind>(Name)
6618 .Case("v8", CK_V8)
6619 .Case("supersparc", CK_SUPERSPARC)
6620 .Case("sparclite", CK_SPARCLITE)
6621 .Case("f934", CK_F934)
6622 .Case("hypersparc", CK_HYPERSPARC)
6623 .Case("sparclite86x", CK_SPARCLITE86X)
6624 .Case("sparclet", CK_SPARCLET)
6625 .Case("tsc701", CK_TSC701)
6626 .Case("v9", CK_V9)
6627 .Case("ultrasparc", CK_ULTRASPARC)
6628 .Case("ultrasparc3", CK_ULTRASPARC3)
6629 .Case("niagara", CK_NIAGARA)
6630 .Case("niagara2", CK_NIAGARA2)
6631 .Case("niagara3", CK_NIAGARA3)
6632 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006633 .Case("ma2100", CK_MYRIAD2100)
6634 .Case("ma2150", CK_MYRIAD2150)
6635 .Case("ma2450", CK_MYRIAD2450)
6636 // FIXME: the myriad2[.n] spellings are obsolete,
6637 // but a grace period is needed to allow updating dependent builds.
6638 .Case("myriad2", CK_MYRIAD2100)
6639 .Case("myriad2.1", CK_MYRIAD2100)
6640 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006641 .Case("leon2", CK_LEON2)
6642 .Case("at697e", CK_LEON2_AT697E)
6643 .Case("at697f", CK_LEON2_AT697F)
6644 .Case("leon3", CK_LEON3)
6645 .Case("ut699", CK_LEON3_UT699)
6646 .Case("gr712rc", CK_LEON3_GR712RC)
6647 .Case("leon4", CK_LEON4)
6648 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006649 .Default(CK_GENERIC);
6650 }
6651
6652 bool setCPU(const std::string &Name) override {
6653 CPU = getCPUKind(Name);
6654 return CPU != CK_GENERIC;
6655 }
Gabor Greif49991682008-02-21 16:29:08 +00006656};
6657
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006658const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006659 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6660 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6661 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6662 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6663};
6664
Craig Topperf054e3a2015-10-19 03:52:27 +00006665ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6666 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006667}
6668
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006669const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006670 { { "g0" }, "r0" },
6671 { { "g1" }, "r1" },
6672 { { "g2" }, "r2" },
6673 { { "g3" }, "r3" },
6674 { { "g4" }, "r4" },
6675 { { "g5" }, "r5" },
6676 { { "g6" }, "r6" },
6677 { { "g7" }, "r7" },
6678 { { "o0" }, "r8" },
6679 { { "o1" }, "r9" },
6680 { { "o2" }, "r10" },
6681 { { "o3" }, "r11" },
6682 { { "o4" }, "r12" },
6683 { { "o5" }, "r13" },
6684 { { "o6", "sp" }, "r14" },
6685 { { "o7" }, "r15" },
6686 { { "l0" }, "r16" },
6687 { { "l1" }, "r17" },
6688 { { "l2" }, "r18" },
6689 { { "l3" }, "r19" },
6690 { { "l4" }, "r20" },
6691 { { "l5" }, "r21" },
6692 { { "l6" }, "r22" },
6693 { { "l7" }, "r23" },
6694 { { "i0" }, "r24" },
6695 { { "i1" }, "r25" },
6696 { { "i2" }, "r26" },
6697 { { "i3" }, "r27" },
6698 { { "i4" }, "r28" },
6699 { { "i5" }, "r29" },
6700 { { "i6", "fp" }, "r30" },
6701 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006702};
6703
Craig Topperf054e3a2015-10-19 03:52:27 +00006704ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6705 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006706}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006707
6708// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6709class SparcV8TargetInfo : public SparcTargetInfo {
6710public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006711 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6712 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006713 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006714 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6715 switch (getTriple().getOS()) {
6716 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006717 SizeType = UnsignedInt;
6718 IntPtrType = SignedInt;
6719 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006720 break;
6721 case llvm::Triple::NetBSD:
6722 case llvm::Triple::OpenBSD:
6723 SizeType = UnsignedLong;
6724 IntPtrType = SignedLong;
6725 PtrDiffType = SignedLong;
6726 break;
Brad Smith56495d52015-08-13 22:00:53 +00006727 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006728 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006729 }
6730
Craig Topper3164f332014-03-11 03:39:26 +00006731 void getTargetDefines(const LangOptions &Opts,
6732 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006733 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006734 switch (getCPUGeneration(CPU)) {
6735 case CG_V8:
6736 Builder.defineMacro("__sparcv8");
6737 if (getTriple().getOS() != llvm::Triple::Solaris)
6738 Builder.defineMacro("__sparcv8__");
6739 break;
6740 case CG_V9:
6741 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006742 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006743 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006744 Builder.defineMacro("__sparc_v9__");
6745 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006746 break;
6747 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006748 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006749 std::string MyriadArchValue, Myriad2Value;
6750 Builder.defineMacro("__sparc_v8__");
6751 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006752 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006753 case CK_MYRIAD2150:
6754 MyriadArchValue = "__ma2150";
6755 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006756 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006757 case CK_MYRIAD2450:
6758 MyriadArchValue = "__ma2450";
6759 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006760 break;
6761 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006762 MyriadArchValue = "__ma2100";
6763 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006764 break;
6765 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006766 Builder.defineMacro(MyriadArchValue, "1");
6767 Builder.defineMacro(MyriadArchValue+"__", "1");
6768 Builder.defineMacro("__myriad2__", Myriad2Value);
6769 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006770 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006771 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006772
6773 bool hasSjLjLowering() const override {
6774 return true;
6775 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006776};
6777
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006778// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6779class SparcV8elTargetInfo : public SparcV8TargetInfo {
6780 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006781 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6782 : SparcV8TargetInfo(Triple, Opts) {
6783 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006784 }
6785};
6786
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006787// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6788class SparcV9TargetInfo : public SparcTargetInfo {
6789public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006790 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6791 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006792 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006793 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006794 // This is an LP64 platform.
6795 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006796
6797 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006798 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006799 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006800 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006801 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006802 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006803
6804 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6805 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6806 LongDoubleWidth = 128;
6807 LongDoubleAlign = 128;
6808 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006809 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006810 }
6811
Craig Topper3164f332014-03-11 03:39:26 +00006812 void getTargetDefines(const LangOptions &Opts,
6813 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006814 SparcTargetInfo::getTargetDefines(Opts, Builder);
6815 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006816 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006817 // Solaris doesn't need these variants, but the BSDs do.
6818 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006819 Builder.defineMacro("__sparc64__");
6820 Builder.defineMacro("__sparc_v9__");
6821 Builder.defineMacro("__sparcv9__");
6822 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006823 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006824
Craig Topper3164f332014-03-11 03:39:26 +00006825 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006826 if (!SparcTargetInfo::setCPU(Name))
6827 return false;
6828 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006829 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006830};
6831
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006832class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006833 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006834 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006835 std::string CPU;
6836 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006837 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006838
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006839public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006840 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006841 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6842 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006843 IntMaxType = SignedLong;
6844 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006845 TLSSupported = true;
6846 IntWidth = IntAlign = 32;
6847 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6848 PointerWidth = PointerAlign = 64;
6849 LongDoubleWidth = 128;
6850 LongDoubleAlign = 64;
6851 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006852 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006853 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006854 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 +00006855 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6856 }
6857 void getTargetDefines(const LangOptions &Opts,
6858 MacroBuilder &Builder) const override {
6859 Builder.defineMacro("__s390__");
6860 Builder.defineMacro("__s390x__");
6861 Builder.defineMacro("__zarch__");
6862 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006863
6864 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6865 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6866 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6867 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6868
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006869 if (HasTransactionalExecution)
6870 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006871 if (Opts.ZVector)
6872 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006873 }
Craig Topper6c03a542015-10-19 04:51:35 +00006874 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6875 return llvm::makeArrayRef(BuiltinInfo,
6876 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006877 }
6878
Craig Topperf054e3a2015-10-19 03:52:27 +00006879 ArrayRef<const char *> getGCCRegNames() const override;
6880 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006881 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006882 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006883 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006884 bool validateAsmConstraint(const char *&Name,
6885 TargetInfo::ConstraintInfo &info) const override;
6886 const char *getClobbers() const override {
6887 // FIXME: Is this really right?
6888 return "";
6889 }
6890 BuiltinVaListKind getBuiltinVaListKind() const override {
6891 return TargetInfo::SystemZBuiltinVaList;
6892 }
6893 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006894 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006895 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6896 .Case("z10", true)
6897 .Case("z196", true)
6898 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006899 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006900 .Default(false);
6901
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006902 return CPUKnown;
6903 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006904 bool
6905 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6906 StringRef CPU,
6907 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006908 if (CPU == "zEC12")
6909 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006910 if (CPU == "z13") {
6911 Features["transactional-execution"] = true;
6912 Features["vector"] = true;
6913 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006914 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006915 }
6916
6917 bool handleTargetFeatures(std::vector<std::string> &Features,
6918 DiagnosticsEngine &Diags) override {
6919 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006920 for (const auto &Feature : Features) {
6921 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006922 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006923 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006924 HasVector = true;
6925 }
6926 // If we use the vector ABI, vector types are 64-bit aligned.
6927 if (HasVector) {
6928 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006929 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6930 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006931 }
6932 return true;
6933 }
6934
6935 bool hasFeature(StringRef Feature) const override {
6936 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006937 .Case("systemz", true)
6938 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006939 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006940 .Default(false);
6941 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006942
Bryan Chane3f1ed52016-04-28 13:56:43 +00006943 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6944 switch (CC) {
6945 case CC_C:
6946 case CC_Swift:
6947 return CCCR_OK;
6948 default:
6949 return CCCR_Warning;
6950 }
6951 }
6952
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006953 StringRef getABI() const override {
6954 if (HasVector)
6955 return "vector";
6956 return "";
6957 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006958
6959 bool useFloat128ManglingForLongDouble() const override {
6960 return true;
6961 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006962};
6963
6964const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6965#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006966 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006967#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6968 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006969#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006970};
6971
6972const char *const SystemZTargetInfo::GCCRegNames[] = {
6973 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6974 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6975 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6976 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6977};
6978
Craig Topperf054e3a2015-10-19 03:52:27 +00006979ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6980 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006981}
6982
6983bool SystemZTargetInfo::
6984validateAsmConstraint(const char *&Name,
6985 TargetInfo::ConstraintInfo &Info) const {
6986 switch (*Name) {
6987 default:
6988 return false;
6989
6990 case 'a': // Address register
6991 case 'd': // Data register (equivalent to 'r')
6992 case 'f': // Floating-point register
6993 Info.setAllowsRegister();
6994 return true;
6995
6996 case 'I': // Unsigned 8-bit constant
6997 case 'J': // Unsigned 12-bit constant
6998 case 'K': // Signed 16-bit constant
6999 case 'L': // Signed 20-bit displacement (on all targets we support)
7000 case 'M': // 0x7fffffff
7001 return true;
7002
7003 case 'Q': // Memory with base and unsigned 12-bit displacement
7004 case 'R': // Likewise, plus an index
7005 case 'S': // Memory with base and signed 20-bit displacement
7006 case 'T': // Likewise, plus an index
7007 Info.setAllowsMemory();
7008 return true;
7009 }
7010}
Ulrich Weigand47445072013-05-06 16:26:41 +00007011
Eric Christopherc48497a2015-09-18 21:26:24 +00007012class MSP430TargetInfo : public TargetInfo {
7013 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007014
Eric Christopherc48497a2015-09-18 21:26:24 +00007015public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007016 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7017 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007018 TLSSupported = false;
7019 IntWidth = 16;
7020 IntAlign = 16;
7021 LongWidth = 32;
7022 LongLongWidth = 64;
7023 LongAlign = LongLongAlign = 16;
7024 PointerWidth = 16;
7025 PointerAlign = 16;
7026 SuitableAlign = 16;
7027 SizeType = UnsignedInt;
7028 IntMaxType = SignedLongLong;
7029 IntPtrType = SignedInt;
7030 PtrDiffType = SignedInt;
7031 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007032 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007033 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007034 void getTargetDefines(const LangOptions &Opts,
7035 MacroBuilder &Builder) const override {
7036 Builder.defineMacro("MSP430");
7037 Builder.defineMacro("__MSP430__");
7038 // FIXME: defines for different 'flavours' of MCU
7039 }
Craig Topper6c03a542015-10-19 04:51:35 +00007040 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007041 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007042 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007043 }
7044 bool hasFeature(StringRef Feature) const override {
7045 return Feature == "msp430";
7046 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007047 ArrayRef<const char *> getGCCRegNames() const override;
7048 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007049 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007050 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007051 }
7052 bool validateAsmConstraint(const char *&Name,
7053 TargetInfo::ConstraintInfo &info) const override {
7054 // FIXME: implement
7055 switch (*Name) {
7056 case 'K': // the constant 1
7057 case 'L': // constant -1^20 .. 1^19
7058 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007059 return true;
7060 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007061 // No target constraints for now.
7062 return false;
7063 }
7064 const char *getClobbers() const override {
7065 // FIXME: Is this really right?
7066 return "";
7067 }
7068 BuiltinVaListKind getBuiltinVaListKind() const override {
7069 // FIXME: implement
7070 return TargetInfo::CharPtrBuiltinVaList;
7071 }
7072};
7073
7074const char *const MSP430TargetInfo::GCCRegNames[] = {
7075 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7076 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7077
Craig Topperf054e3a2015-10-19 03:52:27 +00007078ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7079 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007080}
7081
7082// LLVM and Clang cannot be used directly to output native binaries for
7083// target, but is used to compile C code to llvm bitcode with correct
7084// type and alignment information.
7085//
7086// TCE uses the llvm bitcode as input and uses it for generating customized
7087// target processor and program binary. TCE co-design environment is
7088// publicly available in http://tce.cs.tut.fi
7089
7090static const unsigned TCEOpenCLAddrSpaceMap[] = {
7091 3, // opencl_global
7092 4, // opencl_local
7093 5, // opencl_constant
7094 // FIXME: generic has to be added to the target
7095 0, // opencl_generic
7096 0, // cuda_device
7097 0, // cuda_constant
7098 0 // cuda_shared
7099};
7100
7101class TCETargetInfo : public TargetInfo {
7102public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007103 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7104 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007105 TLSSupported = false;
7106 IntWidth = 32;
7107 LongWidth = LongLongWidth = 32;
7108 PointerWidth = 32;
7109 IntAlign = 32;
7110 LongAlign = LongLongAlign = 32;
7111 PointerAlign = 32;
7112 SuitableAlign = 32;
7113 SizeType = UnsignedInt;
7114 IntMaxType = SignedLong;
7115 IntPtrType = SignedInt;
7116 PtrDiffType = SignedInt;
7117 FloatWidth = 32;
7118 FloatAlign = 32;
7119 DoubleWidth = 32;
7120 DoubleAlign = 32;
7121 LongDoubleWidth = 32;
7122 LongDoubleAlign = 32;
7123 FloatFormat = &llvm::APFloat::IEEEsingle;
7124 DoubleFormat = &llvm::APFloat::IEEEsingle;
7125 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007126 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7127 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007128 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7129 UseAddrSpaceMapMangling = true;
7130 }
7131
7132 void getTargetDefines(const LangOptions &Opts,
7133 MacroBuilder &Builder) const override {
7134 DefineStd(Builder, "tce", Opts);
7135 Builder.defineMacro("__TCE__");
7136 Builder.defineMacro("__TCE_V1__");
7137 }
7138 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7139
Craig Topper6c03a542015-10-19 04:51:35 +00007140 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007141 const char *getClobbers() const override { return ""; }
7142 BuiltinVaListKind getBuiltinVaListKind() const override {
7143 return TargetInfo::VoidPtrBuiltinVaList;
7144 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007145 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007146 bool validateAsmConstraint(const char *&Name,
7147 TargetInfo::ConstraintInfo &info) const override {
7148 return true;
7149 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007150 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7151 return None;
7152 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007153};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007154
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007155class BPFTargetInfo : public TargetInfo {
7156public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007157 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7158 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007159 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7160 SizeType = UnsignedLong;
7161 PtrDiffType = SignedLong;
7162 IntPtrType = SignedLong;
7163 IntMaxType = SignedLong;
7164 Int64Type = SignedLong;
7165 RegParmMax = 5;
7166 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007167 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007168 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007169 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007170 }
7171 MaxAtomicPromoteWidth = 64;
7172 MaxAtomicInlineWidth = 64;
7173 TLSSupported = false;
7174 }
7175 void getTargetDefines(const LangOptions &Opts,
7176 MacroBuilder &Builder) const override {
7177 DefineStd(Builder, "bpf", Opts);
7178 Builder.defineMacro("__BPF__");
7179 }
7180 bool hasFeature(StringRef Feature) const override {
7181 return Feature == "bpf";
7182 }
7183
Craig Topper6c03a542015-10-19 04:51:35 +00007184 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007185 const char *getClobbers() const override {
7186 return "";
7187 }
7188 BuiltinVaListKind getBuiltinVaListKind() const override {
7189 return TargetInfo::VoidPtrBuiltinVaList;
7190 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007191 ArrayRef<const char *> getGCCRegNames() const override {
7192 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007193 }
7194 bool validateAsmConstraint(const char *&Name,
7195 TargetInfo::ConstraintInfo &info) const override {
7196 return true;
7197 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007198 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7199 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007200 }
7201};
7202
Daniel Sanders4672af62016-05-27 11:51:02 +00007203class MipsTargetInfo : public TargetInfo {
7204 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007205 StringRef Layout;
7206
7207 if (ABI == "o32")
7208 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7209 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007210 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007211 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007212 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007213 else
7214 llvm_unreachable("Invalid ABI");
7215
7216 if (BigEndian)
7217 resetDataLayout(("E-" + Layout).str());
7218 else
7219 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007220 }
7221
Akira Hatanaka9064e362013-10-29 18:30:33 +00007222
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007223 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007224 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007225 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007226 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007227 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007228 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007229 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007230 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007231 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007232 enum DspRevEnum {
7233 NoDSP, DSP1, DSP2
7234 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007235 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007236
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007237protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007238 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007239 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007240
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007241public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007242 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007243 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7244 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7245 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007246 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007247
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007248 setABI((getTriple().getArch() == llvm::Triple::mips ||
7249 getTriple().getArch() == llvm::Triple::mipsel)
7250 ? "o32"
7251 : "n64");
7252
7253 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007254 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007255
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007256 bool isNaN2008Default() const {
7257 return CPU == "mips32r6" || CPU == "mips64r6";
7258 }
7259
7260 bool isFP64Default() const {
7261 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7262 }
7263
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007264 bool isNan2008() const override {
7265 return IsNan2008;
7266 }
7267
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007268 bool processorSupportsGPR64() const {
7269 return llvm::StringSwitch<bool>(CPU)
7270 .Case("mips3", true)
7271 .Case("mips4", true)
7272 .Case("mips5", true)
7273 .Case("mips64", true)
7274 .Case("mips64r2", true)
7275 .Case("mips64r3", true)
7276 .Case("mips64r5", true)
7277 .Case("mips64r6", true)
7278 .Case("octeon", true)
7279 .Default(false);
7280 return false;
7281 }
7282
Alp Toker4925ba72014-06-07 23:30:42 +00007283 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007284 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007285 if (Name == "o32") {
7286 setO32ABITypes();
7287 ABI = Name;
7288 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007289 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007290
7291 if (Name == "n32") {
7292 setN32ABITypes();
7293 ABI = Name;
7294 return true;
7295 }
7296 if (Name == "n64") {
7297 setN64ABITypes();
7298 ABI = Name;
7299 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007300 }
7301 return false;
7302 }
7303
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007304 void setO32ABITypes() {
7305 Int64Type = SignedLongLong;
7306 IntMaxType = Int64Type;
7307 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7308 LongDoubleWidth = LongDoubleAlign = 64;
7309 LongWidth = LongAlign = 32;
7310 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7311 PointerWidth = PointerAlign = 32;
7312 PtrDiffType = SignedInt;
7313 SizeType = UnsignedInt;
7314 SuitableAlign = 64;
7315 }
7316
7317 void setN32N64ABITypes() {
7318 LongDoubleWidth = LongDoubleAlign = 128;
7319 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7320 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7321 LongDoubleWidth = LongDoubleAlign = 64;
7322 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7323 }
7324 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7325 SuitableAlign = 128;
7326 }
7327
Daniel Sanders4672af62016-05-27 11:51:02 +00007328 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007329 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007330 Int64Type = SignedLong;
7331 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007332 LongWidth = LongAlign = 64;
7333 PointerWidth = PointerAlign = 64;
7334 PtrDiffType = SignedLong;
7335 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007336 }
7337
7338 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007339 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007340 Int64Type = SignedLongLong;
7341 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007342 LongWidth = LongAlign = 32;
7343 PointerWidth = PointerAlign = 32;
7344 PtrDiffType = SignedInt;
7345 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007346 }
7347
Craig Topper3164f332014-03-11 03:39:26 +00007348 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007349 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007350 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007351 .Case("mips1", true)
7352 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007353 .Case("mips3", true)
7354 .Case("mips4", true)
7355 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007356 .Case("mips32", true)
7357 .Case("mips32r2", true)
7358 .Case("mips32r3", true)
7359 .Case("mips32r5", true)
7360 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007361 .Case("mips64", true)
7362 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007363 .Case("mips64r3", true)
7364 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007365 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007366 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007367 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007368 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007369 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007370 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007371 bool
7372 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7373 StringRef CPU,
7374 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007375 if (CPU.empty())
7376 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007377 if (CPU == "octeon")
7378 Features["mips64r2"] = Features["cnmips"] = true;
7379 else
7380 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007381 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007382 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007383
Craig Topper3164f332014-03-11 03:39:26 +00007384 void getTargetDefines(const LangOptions &Opts,
7385 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007386 if (BigEndian) {
7387 DefineStd(Builder, "MIPSEB", Opts);
7388 Builder.defineMacro("_MIPSEB");
7389 } else {
7390 DefineStd(Builder, "MIPSEL", Opts);
7391 Builder.defineMacro("_MIPSEL");
7392 }
7393
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007394 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007395 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007396 if (Opts.GNUMode)
7397 Builder.defineMacro("mips");
7398
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007399 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007400 Builder.defineMacro("__mips", "32");
7401 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7402 } else {
7403 Builder.defineMacro("__mips", "64");
7404 Builder.defineMacro("__mips64");
7405 Builder.defineMacro("__mips64__");
7406 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7407 }
7408
7409 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7410 .Cases("mips32", "mips64", "1")
7411 .Cases("mips32r2", "mips64r2", "2")
7412 .Cases("mips32r3", "mips64r3", "3")
7413 .Cases("mips32r5", "mips64r5", "5")
7414 .Cases("mips32r6", "mips64r6", "6")
7415 .Default("");
7416 if (!ISARev.empty())
7417 Builder.defineMacro("__mips_isa_rev", ISARev);
7418
7419 if (ABI == "o32") {
7420 Builder.defineMacro("__mips_o32");
7421 Builder.defineMacro("_ABIO32", "1");
7422 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007423 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007424 Builder.defineMacro("__mips_n32");
7425 Builder.defineMacro("_ABIN32", "2");
7426 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7427 } else if (ABI == "n64") {
7428 Builder.defineMacro("__mips_n64");
7429 Builder.defineMacro("_ABI64", "3");
7430 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7431 } else
7432 llvm_unreachable("Invalid ABI.");
7433
Simon Atanasyan683535b2012-08-29 19:14:58 +00007434 Builder.defineMacro("__REGISTER_PREFIX__", "");
7435
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007436 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007437 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007438 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007439 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007440 case SoftFloat:
7441 Builder.defineMacro("__mips_soft_float", Twine(1));
7442 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007443 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007444
Simon Atanasyan16071912013-04-14 14:07:30 +00007445 if (IsSingleFloat)
7446 Builder.defineMacro("__mips_single_float", Twine(1));
7447
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007448 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7449 Builder.defineMacro("_MIPS_FPSET",
7450 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7451
Simon Atanasyan72244b62012-07-05 16:06:06 +00007452 if (IsMips16)
7453 Builder.defineMacro("__mips16", Twine(1));
7454
Simon Atanasyan60777612013-04-14 14:07:51 +00007455 if (IsMicromips)
7456 Builder.defineMacro("__mips_micromips", Twine(1));
7457
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007458 if (IsNan2008)
7459 Builder.defineMacro("__mips_nan2008", Twine(1));
7460
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007461 switch (DspRev) {
7462 default:
7463 break;
7464 case DSP1:
7465 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7466 Builder.defineMacro("__mips_dsp", Twine(1));
7467 break;
7468 case DSP2:
7469 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7470 Builder.defineMacro("__mips_dspr2", Twine(1));
7471 Builder.defineMacro("__mips_dsp", Twine(1));
7472 break;
7473 }
7474
Jack Carter44ff1e52013-08-12 17:20:29 +00007475 if (HasMSA)
7476 Builder.defineMacro("__mips_msa", Twine(1));
7477
Simon Atanasyan26f19672012-04-05 19:28:31 +00007478 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7479 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7480 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007481
7482 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7483 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007484
7485 // These shouldn't be defined for MIPS-I but there's no need to check
7486 // for that since MIPS-I isn't supported.
7487 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7488 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7489 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007490
7491 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7492 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7493 // the instructions exist but using them violates the ABI since they
7494 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7495 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007496 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007497 }
7498
Craig Topper6c03a542015-10-19 04:51:35 +00007499 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7500 return llvm::makeArrayRef(BuiltinInfo,
7501 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007502 }
Craig Topper3164f332014-03-11 03:39:26 +00007503 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007504 return llvm::StringSwitch<bool>(Feature)
7505 .Case("mips", true)
7506 .Case("fp64", HasFP64)
7507 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007508 }
Craig Topper3164f332014-03-11 03:39:26 +00007509 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007510 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007511 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007512 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007513 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007514 // CPU register names
7515 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007516 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7517 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7518 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007519 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7520 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007521 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7522 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7523 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7524 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007525 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007526 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007527 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7528 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007529 // MSA register names
7530 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7531 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7532 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7533 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7534 // MSA control register names
7535 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7536 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007537 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007538 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007539 }
Craig Topper3164f332014-03-11 03:39:26 +00007540 bool validateAsmConstraint(const char *&Name,
7541 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007542 switch (*Name) {
7543 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007544 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007545 case 'r': // CPU registers.
7546 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007547 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007548 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007549 case 'c': // $25 for indirect jumps
7550 case 'l': // lo register
7551 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007552 Info.setAllowsRegister();
7553 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007554 case 'I': // Signed 16-bit constant
7555 case 'J': // Integer 0
7556 case 'K': // Unsigned 16-bit constant
7557 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7558 case 'M': // Constants not loadable via lui, addiu, or ori
7559 case 'N': // Constant -1 to -65535
7560 case 'O': // A signed 15-bit constant
7561 case 'P': // A constant between 1 go 65535
7562 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007563 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007564 Info.setAllowsMemory();
7565 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007566 case 'Z':
7567 if (Name[1] == 'C') { // An address usable by ll, and sc.
7568 Info.setAllowsMemory();
7569 Name++; // Skip over 'Z'.
7570 return true;
7571 }
7572 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007573 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007574 }
7575
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007576 std::string convertConstraint(const char *&Constraint) const override {
7577 std::string R;
7578 switch (*Constraint) {
7579 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7580 if (Constraint[1] == 'C') {
7581 R = std::string("^") + std::string(Constraint, 2);
7582 Constraint++;
7583 return R;
7584 }
7585 break;
7586 }
7587 return TargetInfo::convertConstraint(Constraint);
7588 }
7589
Craig Topper3164f332014-03-11 03:39:26 +00007590 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007591 // In GCC, $1 is not widely used in generated code (it's used only in a few
7592 // specific situations), so there is no real need for users to add it to
7593 // the clobbers list if they want to use it in their inline assembly code.
7594 //
7595 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7596 // code generation, so using it in inline assembly without adding it to the
7597 // clobbers list can cause conflicts between the inline assembly code and
7598 // the surrounding generated code.
7599 //
7600 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7601 // operands, which will conflict with the ".set at" assembler option (which
7602 // we use only for inline assembly, in order to maintain compatibility with
7603 // GCC) and will also conflict with the user's usage of $1.
7604 //
7605 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7606 // register for generated code is to automatically clobber $1 for all inline
7607 // assembly code.
7608 //
7609 // FIXME: We should automatically clobber $1 only for inline assembly code
7610 // which actually uses it. This would allow LLVM to use $1 for inline
7611 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007612 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007613 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007614
Craig Topper3164f332014-03-11 03:39:26 +00007615 bool handleTargetFeatures(std::vector<std::string> &Features,
7616 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007617 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007618 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007619 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007620 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007621 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007622 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007623 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007624
Eric Christopher610fe112015-08-26 08:21:55 +00007625 for (const auto &Feature : Features) {
7626 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007627 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007628 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007629 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007630 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007631 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007632 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007633 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007634 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007635 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007636 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007637 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007638 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007639 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007640 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007641 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007642 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007643 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007644 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007645 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007646 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007647 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007648 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007649
James Y Knightb214cbc2016-03-04 19:00:41 +00007650 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007651
Rafael Espindolaeb265472013-08-21 21:59:03 +00007652 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007653 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007654
Craig Topper3164f332014-03-11 03:39:26 +00007655 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007656 if (RegNo == 0) return 4;
7657 if (RegNo == 1) return 5;
7658 return -1;
7659 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007660
7661 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007662
7663 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7664 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7665 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7666 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7667 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7668 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7669 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7670 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7671 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7672 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7673 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7674 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7675 {{"ra"}, "$31"}};
7676 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7677 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7678 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7679 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7680 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7681 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7682 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7683 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7684 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7685 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7686 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7687 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007688 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007689 return llvm::makeArrayRef(O32RegAliases);
7690 return llvm::makeArrayRef(NewABIRegAliases);
7691 }
7692
7693 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007694 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007695 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007696
7697 bool validateTarget(DiagnosticsEngine &Diags) const override {
7698 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7699 // this yet. It's better to fail here than on the backend assertion.
7700 if (processorSupportsGPR64() && ABI == "o32") {
7701 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7702 return false;
7703 }
7704
7705 // 64-bit ABI's require 64-bit CPU's.
7706 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7707 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7708 return false;
7709 }
7710
7711 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7712 // can't handle this yet. It's better to fail here than on the
7713 // backend assertion.
7714 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7715 getTriple().getArch() == llvm::Triple::mips64el) &&
7716 ABI == "o32") {
7717 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7718 << ABI << getTriple().str();
7719 return false;
7720 }
7721
7722 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7723 // can't handle this yet. It's better to fail here than on the
7724 // backend assertion.
7725 if ((getTriple().getArch() == llvm::Triple::mips ||
7726 getTriple().getArch() == llvm::Triple::mipsel) &&
7727 (ABI == "n32" || ABI == "n64")) {
7728 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7729 << ABI << getTriple().str();
7730 return false;
7731 }
7732
7733 return true;
7734 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007735};
7736
Daniel Sanders4672af62016-05-27 11:51:02 +00007737const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007738#define BUILTIN(ID, TYPE, ATTRS) \
7739 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7740#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7741 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007742#include "clang/Basic/BuiltinsMips.def"
7743};
7744
Ivan Krasindd7403e2011-08-24 20:22:22 +00007745class PNaClTargetInfo : public TargetInfo {
7746public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007747 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7748 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007749 this->LongAlign = 32;
7750 this->LongWidth = 32;
7751 this->PointerAlign = 32;
7752 this->PointerWidth = 32;
7753 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007754 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007755 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007756 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007757 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007758 this->SizeType = TargetInfo::UnsignedInt;
7759 this->PtrDiffType = TargetInfo::SignedInt;
7760 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007761 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007762 }
7763
Craig Toppere6f17d02014-03-11 04:07:52 +00007764 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007765 Builder.defineMacro("__le32__");
7766 Builder.defineMacro("__pnacl__");
7767 }
Craig Topper3164f332014-03-11 03:39:26 +00007768 void getTargetDefines(const LangOptions &Opts,
7769 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007770 getArchDefines(Opts, Builder);
7771 }
Craig Topper3164f332014-03-11 03:39:26 +00007772 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007773 return Feature == "pnacl";
7774 }
Craig Topper6c03a542015-10-19 04:51:35 +00007775 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007776 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007777 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007778 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007779 ArrayRef<const char *> getGCCRegNames() const override;
7780 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007781 bool validateAsmConstraint(const char *&Name,
7782 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007783 return false;
7784 }
7785
Craig Topper3164f332014-03-11 03:39:26 +00007786 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007787 return "";
7788 }
7789};
7790
Craig Topperf054e3a2015-10-19 03:52:27 +00007791ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7792 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007793}
7794
Craig Topperf054e3a2015-10-19 03:52:27 +00007795ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7796 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007797}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007798
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007799// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007800class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007801public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007802 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7803 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007804
7805 BuiltinVaListKind getBuiltinVaListKind() const override {
7806 return TargetInfo::PNaClABIBuiltinVaList;
7807 }
7808};
7809
JF Bastien643817d2014-09-12 17:52:47 +00007810class Le64TargetInfo : public TargetInfo {
7811 static const Builtin::Info BuiltinInfo[];
7812
7813public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007814 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7815 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007816 NoAsmVariants = true;
7817 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7818 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007819 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007820 }
7821
7822 void getTargetDefines(const LangOptions &Opts,
7823 MacroBuilder &Builder) const override {
7824 DefineStd(Builder, "unix", Opts);
7825 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7826 Builder.defineMacro("__ELF__");
7827 }
Craig Topper6c03a542015-10-19 04:51:35 +00007828 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7829 return llvm::makeArrayRef(BuiltinInfo,
7830 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007831 }
7832 BuiltinVaListKind getBuiltinVaListKind() const override {
7833 return TargetInfo::PNaClABIBuiltinVaList;
7834 }
7835 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007836 ArrayRef<const char *> getGCCRegNames() const override {
7837 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007838 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007839 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7840 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007841 }
7842 bool validateAsmConstraint(const char *&Name,
7843 TargetInfo::ConstraintInfo &Info) const override {
7844 return false;
7845 }
7846
7847 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007848};
Dan Gohmanc2853072015-09-03 22:51:53 +00007849
7850class WebAssemblyTargetInfo : public TargetInfo {
7851 static const Builtin::Info BuiltinInfo[];
7852
7853 enum SIMDEnum {
7854 NoSIMD,
7855 SIMD128,
7856 } SIMDLevel;
7857
7858public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007859 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007860 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007861 NoAsmVariants = true;
7862 SuitableAlign = 128;
7863 LargeArrayMinWidth = 128;
7864 LargeArrayAlign = 128;
7865 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007866 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007867 LongDoubleWidth = LongDoubleAlign = 128;
7868 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007869 SizeType = UnsignedInt;
7870 PtrDiffType = SignedInt;
7871 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007872 }
7873
7874protected:
7875 void getTargetDefines(const LangOptions &Opts,
7876 MacroBuilder &Builder) const override {
7877 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7878 if (SIMDLevel >= SIMD128)
7879 Builder.defineMacro("__wasm_simd128__");
7880 }
7881
7882private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007883 bool
7884 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7885 StringRef CPU,
7886 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007887 if (CPU == "bleeding-edge")
7888 Features["simd128"] = true;
7889 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7890 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007891 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007892 return llvm::StringSwitch<bool>(Feature)
7893 .Case("simd128", SIMDLevel >= SIMD128)
7894 .Default(false);
7895 }
7896 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007897 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007898 for (const auto &Feature : Features) {
7899 if (Feature == "+simd128") {
7900 SIMDLevel = std::max(SIMDLevel, SIMD128);
7901 continue;
7902 }
7903 if (Feature == "-simd128") {
7904 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7905 continue;
7906 }
7907
7908 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7909 << "-target-feature";
7910 return false;
7911 }
7912 return true;
7913 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007914 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007915 return llvm::StringSwitch<bool>(Name)
7916 .Case("mvp", true)
7917 .Case("bleeding-edge", true)
7918 .Case("generic", true)
7919 .Default(false);
7920 }
Craig Topper6c03a542015-10-19 04:51:35 +00007921 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7922 return llvm::makeArrayRef(BuiltinInfo,
7923 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007924 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007925 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007926 return VoidPtrBuiltinVaList;
7927 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007928 ArrayRef<const char *> getGCCRegNames() const final {
7929 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007930 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007931 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7932 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007933 }
7934 bool
7935 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007936 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007937 return false;
7938 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007939 const char *getClobbers() const final { return ""; }
7940 bool isCLZForZeroUndef() const final { return false; }
7941 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007942 IntType getIntTypeByWidth(unsigned BitWidth,
7943 bool IsSigned) const final {
7944 // WebAssembly prefers long long for explicitly 64-bit integers.
7945 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7946 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7947 }
7948 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7949 bool IsSigned) const final {
7950 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7951 return BitWidth == 64
7952 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7953 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7954 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007955};
7956
7957const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7958#define BUILTIN(ID, TYPE, ATTRS) \
7959 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7960#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7961 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7962#include "clang/Basic/BuiltinsWebAssembly.def"
7963};
7964
7965class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7966public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007967 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7968 const TargetOptions &Opts)
7969 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007970 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007971 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007972 }
7973
7974protected:
7975 void getTargetDefines(const LangOptions &Opts,
7976 MacroBuilder &Builder) const override {
7977 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7978 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7979 }
7980};
7981
7982class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7983public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007984 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7985 const TargetOptions &Opts)
7986 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007987 LongAlign = LongWidth = 64;
7988 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007989 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007990 SizeType = UnsignedLong;
7991 PtrDiffType = SignedLong;
7992 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007993 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007994 }
7995
7996protected:
7997 void getTargetDefines(const LangOptions &Opts,
7998 MacroBuilder &Builder) const override {
7999 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8000 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8001 }
8002};
8003
JF Bastien643817d2014-09-12 17:52:47 +00008004const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8005#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008006 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008007#include "clang/Basic/BuiltinsLe64.def"
8008};
8009
Eric Christopherc48497a2015-09-18 21:26:24 +00008010static const unsigned SPIRAddrSpaceMap[] = {
8011 1, // opencl_global
8012 3, // opencl_local
8013 2, // opencl_constant
8014 4, // opencl_generic
8015 0, // cuda_device
8016 0, // cuda_constant
8017 0 // cuda_shared
8018};
8019class SPIRTargetInfo : public TargetInfo {
8020public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008021 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8022 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008023 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8024 "SPIR target must use unknown OS");
8025 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8026 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008027 TLSSupported = false;
8028 LongWidth = LongAlign = 64;
8029 AddrSpaceMap = &SPIRAddrSpaceMap;
8030 UseAddrSpaceMapMangling = true;
8031 // Define available target features
8032 // These must be defined in sorted order!
8033 NoAsmVariants = true;
8034 }
8035 void getTargetDefines(const LangOptions &Opts,
8036 MacroBuilder &Builder) const override {
8037 DefineStd(Builder, "SPIR", Opts);
8038 }
8039 bool hasFeature(StringRef Feature) const override {
8040 return Feature == "spir";
8041 }
Craig Topper3164f332014-03-11 03:39:26 +00008042
Craig Topper6c03a542015-10-19 04:51:35 +00008043 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008044 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008045 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008046 bool validateAsmConstraint(const char *&Name,
8047 TargetInfo::ConstraintInfo &info) const override {
8048 return true;
8049 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008050 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8051 return None;
8052 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008053 BuiltinVaListKind getBuiltinVaListKind() const override {
8054 return TargetInfo::VoidPtrBuiltinVaList;
8055 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008056
Eric Christopherc48497a2015-09-18 21:26:24 +00008057 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008058 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8059 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008060 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008061
Eric Christopherc48497a2015-09-18 21:26:24 +00008062 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8063 return CC_SpirFunction;
8064 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008065
8066 void setSupportedOpenCLOpts() override {
8067 // Assume all OpenCL extensions and optional core features are supported
8068 // for SPIR since it is a generic target.
8069 getSupportedOpenCLOpts().setAll();
8070 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008071};
Guy Benyeib798fc92012-12-11 21:38:14 +00008072
Eric Christopherc48497a2015-09-18 21:26:24 +00008073class SPIR32TargetInfo : public SPIRTargetInfo {
8074public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008075 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8076 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008077 PointerWidth = PointerAlign = 32;
8078 SizeType = TargetInfo::UnsignedInt;
8079 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008080 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8081 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008082 }
8083 void getTargetDefines(const LangOptions &Opts,
8084 MacroBuilder &Builder) const override {
8085 DefineStd(Builder, "SPIR32", Opts);
8086 }
8087};
Guy Benyeib798fc92012-12-11 21:38:14 +00008088
Eric Christopherc48497a2015-09-18 21:26:24 +00008089class SPIR64TargetInfo : public SPIRTargetInfo {
8090public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008091 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8092 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008093 PointerWidth = PointerAlign = 64;
8094 SizeType = TargetInfo::UnsignedLong;
8095 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008096 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8097 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008098 }
8099 void getTargetDefines(const LangOptions &Opts,
8100 MacroBuilder &Builder) const override {
8101 DefineStd(Builder, "SPIR64", Opts);
8102 }
8103};
Guy Benyeib798fc92012-12-11 21:38:14 +00008104
Robert Lytton0e076492013-08-13 09:43:10 +00008105class XCoreTargetInfo : public TargetInfo {
8106 static const Builtin::Info BuiltinInfo[];
8107public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008108 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8109 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008110 NoAsmVariants = true;
8111 LongLongAlign = 32;
8112 SuitableAlign = 32;
8113 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008114 SizeType = UnsignedInt;
8115 PtrDiffType = SignedInt;
8116 IntPtrType = SignedInt;
8117 WCharType = UnsignedChar;
8118 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008119 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008120 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8121 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008122 }
Craig Topper3164f332014-03-11 03:39:26 +00008123 void getTargetDefines(const LangOptions &Opts,
8124 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008125 Builder.defineMacro("__XS1B__");
8126 }
Craig Topper6c03a542015-10-19 04:51:35 +00008127 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8128 return llvm::makeArrayRef(BuiltinInfo,
8129 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008130 }
Craig Topper3164f332014-03-11 03:39:26 +00008131 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008132 return TargetInfo::VoidPtrBuiltinVaList;
8133 }
Craig Topper3164f332014-03-11 03:39:26 +00008134 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008135 return "";
8136 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008137 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008138 static const char * const GCCRegNames[] = {
8139 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8140 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8141 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008142 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008143 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008144 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8145 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008146 }
Craig Topper3164f332014-03-11 03:39:26 +00008147 bool validateAsmConstraint(const char *&Name,
8148 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008149 return false;
8150 }
Craig Topper3164f332014-03-11 03:39:26 +00008151 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008152 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8153 return (RegNo < 2)? RegNo : -1;
8154 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008155 bool allowsLargerPreferedTypeAlignment() const override {
8156 return false;
8157 }
Robert Lytton0e076492013-08-13 09:43:10 +00008158};
8159
8160const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008161#define BUILTIN(ID, TYPE, ATTRS) \
8162 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8163#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8164 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008165#include "clang/Basic/BuiltinsXCore.def"
8166};
Robert Lytton0e076492013-08-13 09:43:10 +00008167
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008168// x86_32 Android target
8169class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8170public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008171 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8172 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008173 SuitableAlign = 32;
8174 LongDoubleWidth = 64;
8175 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8176 }
8177};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008178
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008179// x86_64 Android target
8180class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8181public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008182 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8183 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008184 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8185 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008186
8187 bool useFloat128ManglingForLongDouble() const override {
8188 return true;
8189 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008190};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008191
8192// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8193class RenderScript32TargetInfo : public ARMleTargetInfo {
8194public:
8195 RenderScript32TargetInfo(const llvm::Triple &Triple,
8196 const TargetOptions &Opts)
8197 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8198 Triple.getOSName(),
8199 Triple.getEnvironmentName()),
8200 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008201 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008202 LongWidth = LongAlign = 64;
8203 }
8204 void getTargetDefines(const LangOptions &Opts,
8205 MacroBuilder &Builder) const override {
8206 Builder.defineMacro("__RENDERSCRIPT__");
8207 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8208 }
8209};
8210
8211// 64-bit RenderScript is aarch64
8212class RenderScript64TargetInfo : public AArch64leTargetInfo {
8213public:
8214 RenderScript64TargetInfo(const llvm::Triple &Triple,
8215 const TargetOptions &Opts)
8216 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8217 Triple.getOSName(),
8218 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008219 Opts) {
8220 IsRenderScriptTarget = true;
8221 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008222
8223 void getTargetDefines(const LangOptions &Opts,
8224 MacroBuilder &Builder) const override {
8225 Builder.defineMacro("__RENDERSCRIPT__");
8226 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8227 }
8228};
8229
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008230} // end anonymous namespace
8231
Chris Lattner5ba61f02006-10-14 07:39:34 +00008232//===----------------------------------------------------------------------===//
8233// Driver code
8234//===----------------------------------------------------------------------===//
8235
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008236static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8237 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008238 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008239
Daniel Dunbar52322032009-08-18 05:47:58 +00008240 switch (Triple.getArch()) {
8241 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008242 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008243
Tim Northover2a0783d2014-05-30 14:14:07 +00008244 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008245 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008246
8247 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008248 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008249
Jacques Pienaard964cc22016-03-28 21:02:54 +00008250 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008251 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008252
Tim Northover2a0783d2014-05-30 14:14:07 +00008253 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008254 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008256
8257 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008258 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008260 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008262 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008264 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008265 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008266 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008267 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008268 }
8269
Christian Pirker9b019ae2014-02-25 13:51:00 +00008270 case llvm::Triple::aarch64_be:
8271 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008272 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008274 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008275 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008276 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008277 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008278 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008279 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008280 }
8281
Daniel Dunbar52322032009-08-18 05:47:58 +00008282 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008283 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008284 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008285 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008286
Daniel Dunbar52322032009-08-18 05:47:58 +00008287 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008288 case llvm::Triple::CloudABI:
8289 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008290 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008291 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008292 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008293 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008294 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008295 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008296 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008297 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008298 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008299 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008300 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008302 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008304 case llvm::Triple::Win32:
8305 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008306 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008308 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008309 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008310 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008312 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008313 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008314 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008315 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008316 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008317 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008318 }
8319
8320 case llvm::Triple::armeb:
8321 case llvm::Triple::thumbeb:
8322 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008323 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008324
8325 switch (os) {
8326 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008328 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008329 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008330 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008331 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008332 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008333 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008334 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008336 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008337 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008338 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008339 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008340 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008341 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008342 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008343
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008344 case llvm::Triple::bpfeb:
8345 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008346 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008347
Daniel Dunbar52322032009-08-18 05:47:58 +00008348 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008350
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008351 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008352 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008353 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008354 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008355 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008356 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008357 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008358 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008359 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008360 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008361 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008362 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008363 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008364
8365 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008366 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008367 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008368 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008369 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008370 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008371 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008372 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008373 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008374 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008375 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008376 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008377 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008378 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008379 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008380
Akira Hatanakabef17452011-09-20 19:21:49 +00008381 case llvm::Triple::mips64:
8382 switch (os) {
8383 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008384 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008385 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008386 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008387 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008388 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008389 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008390 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008391 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008392 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008393 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008394 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008395 }
8396
8397 case llvm::Triple::mips64el:
8398 switch (os) {
8399 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008400 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008401 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008402 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008403 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008404 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008405 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008406 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008407 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008408 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008409 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008410 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008411 }
8412
Ivan Krasindd7403e2011-08-24 20:22:22 +00008413 case llvm::Triple::le32:
8414 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008415 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008416 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008417 default:
8418 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008419 }
8420
JF Bastien643817d2014-09-12 17:52:47 +00008421 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008422 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008423
Daniel Dunbar52322032009-08-18 05:47:58 +00008424 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008425 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008426 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008427 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008428 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008430 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008431 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008432 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008433 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008434 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008436 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008437 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008438 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008440 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008441
8442 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008443 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008444 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008445 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008446 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008447 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008448 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008449 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008450 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008451 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008452 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008453 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008454 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008455 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008456 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008457
Bill Schmidt778d3872013-07-26 01:36:11 +00008458 case llvm::Triple::ppc64le:
8459 switch (os) {
8460 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008461 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008462 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008464 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008466 }
8467
Peter Collingbournec947aae2012-05-20 23:28:41 +00008468 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008469 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008470 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008471 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008472
Tom Stellardd8e38a32015-01-06 20:34:47 +00008473 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008474 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008475 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008476
Daniel Dunbar52322032009-08-18 05:47:58 +00008477 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008478 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008479 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008480 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008481 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008482 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008483 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008484 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008485 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008486 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008487 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008488 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008489 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008490 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008491 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008492
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008493 // The 'sparcel' architecture copies all the above cases except for Solaris.
8494 case llvm::Triple::sparcel:
8495 switch (os) {
8496 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008497 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008498 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008499 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008500 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008501 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008502 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008503 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008504 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008505 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008506 }
8507
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008508 case llvm::Triple::sparcv9:
8509 switch (os) {
8510 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008511 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008512 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008513 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008514 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008515 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008516 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008517 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008518 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008520 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008521 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008522 }
8523
Ulrich Weigand47445072013-05-06 16:26:41 +00008524 case llvm::Triple::systemz:
8525 switch (os) {
8526 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008527 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008528 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008529 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008530 }
8531
Eli Friedmana9c3d712009-08-19 20:47:07 +00008532 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008533 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008534
Daniel Dunbar52322032009-08-18 05:47:58 +00008535 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008536 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008537 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008538
Daniel Dunbar52322032009-08-18 05:47:58 +00008539 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008540 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008541 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008542 case llvm::Triple::Linux: {
8543 switch (Triple.getEnvironment()) {
8544 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008545 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008546 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008547 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008548 }
8549 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008550 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008551 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008552 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008553 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008554 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008555 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008556 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008557 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008558 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008559 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008560 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008561 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008562 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008563 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008564 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008565 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008566 case llvm::Triple::Win32: {
8567 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008568 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008569 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008570 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008571 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008572 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008573 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008574 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008575 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008576 }
8577 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008578 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008579 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008580 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008581 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008582 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008583 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008584 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008585 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008586 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008587 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008588 }
8589
8590 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008591 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008592 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008593
Daniel Dunbar52322032009-08-18 05:47:58 +00008594 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008595 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008596 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008597 case llvm::Triple::Linux: {
8598 switch (Triple.getEnvironment()) {
8599 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008600 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008601 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008602 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008603 }
8604 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008605 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008606 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008607 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008608 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008609 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008610 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008611 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008612 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008613 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008614 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008615 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008616 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008617 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008618 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008619 case llvm::Triple::Win32: {
8620 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008621 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008622 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008623 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008624 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008625 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008626 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008627 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008628 }
8629 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008630 case llvm::Triple::Haiku:
8631 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008632 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008633 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008634 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008635 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008636 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008637 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008638 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008639
Douglas Katzman78d7c542015-05-12 21:18:10 +00008640 case llvm::Triple::spir: {
8641 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8642 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8643 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008644 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008645 }
8646 case llvm::Triple::spir64: {
8647 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8648 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8649 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008650 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008651 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008652 case llvm::Triple::wasm32:
8653 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8654 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008655 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008656 case llvm::Triple::wasm64:
8657 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8658 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008659 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008660
8661 case llvm::Triple::renderscript32:
8662 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8663 case llvm::Triple::renderscript64:
8664 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008665 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008666}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008667
8668/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008669/// options.
Alp Toker80758082014-07-06 05:26:44 +00008670TargetInfo *
8671TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008672 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008673 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008674
8675 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008676 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008677 if (!Target) {
8678 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008679 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008680 }
Alp Toker80758082014-07-06 05:26:44 +00008681 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008682
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008683 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008684 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8685 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008686 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008687 }
8688
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008689 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008690 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8691 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008692 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008693 }
8694
Rafael Espindolaeb265472013-08-21 21:59:03 +00008695 // Set the fp math unit.
8696 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8697 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008698 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008699 }
8700
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008701 // Compute the default target features, we need the target to handle this
8702 // because features may have dependencies on one another.
8703 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008704 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8705 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008706 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008707
8708 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008709 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008710 for (const auto &F : Features)
8711 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8712
Eric Christopher3ff21b32013-10-16 21:26:26 +00008713 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008714 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008715
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008716 Target->setSupportedOpenCLOpts();
8717
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008718 if (!Target->validateTarget(Diags))
8719 return nullptr;
8720
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008721 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008722}