blob: 92d07e189cb48f71f133701868ec4ac29d0f7ecc [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
Petr Hosek62e1d232016-10-06 06:08:09 +0000826// Fuchsia Target
827template<typename Target>
828class FuchsiaTargetInfo : public OSTargetInfo<Target> {
829protected:
830 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
831 MacroBuilder &Builder) const override {
832 Builder.defineMacro("__Fuchsia__");
833 Builder.defineMacro("__ELF__");
834 if (Opts.POSIXThreads)
835 Builder.defineMacro("_REENTRANT");
836 // Required by the libc++ locale support.
837 if (Opts.CPlusPlus)
838 Builder.defineMacro("_GNU_SOURCE");
839 }
840public:
841 FuchsiaTargetInfo(const llvm::Triple &Triple,
842 const TargetOptions &Opts)
843 : OSTargetInfo<Target>(Triple, Opts) {
844 this->MCountName = "__mcount";
845 }
846};
847
Dan Gohmanc2853072015-09-03 22:51:53 +0000848// WebAssembly target
849template <typename Target>
850class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
851 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000852 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000853 // A common platform macro.
854 if (Opts.POSIXThreads)
855 Builder.defineMacro("_REENTRANT");
856 // Follow g++ convention and predefine _GNU_SOURCE for C++.
857 if (Opts.CPlusPlus)
858 Builder.defineMacro("_GNU_SOURCE");
859 }
860
861 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000862 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000863 return ".text.__startup";
864 }
865
866public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000867 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
868 const TargetOptions &Opts)
869 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000870 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000871 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
872 }
873};
Dan Gohmanc2853072015-09-03 22:51:53 +0000874
Chris Lattner09d98f52008-10-05 21:50:58 +0000875//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000876// Specific target implementations.
877//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000878
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000879// PPC abstract base class
880class PPCTargetInfo : public TargetInfo {
881 static const Builtin::Info BuiltinInfo[];
882 static const char * const GCCRegNames[];
883 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000884 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000885
886 // Target cpu features.
887 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000888 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000889 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000890 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000891 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000892 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000893 bool HasBPERMD;
894 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000895 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000896
Ulrich Weigand8afad612014-07-28 13:17:52 +0000897protected:
898 std::string ABI;
899
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000900public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000901 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000902 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
903 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000904 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000905 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000906 LongDoubleWidth = LongDoubleAlign = 128;
907 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
908 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000909
Hal Finkel6b984f02012-07-03 16:51:04 +0000910 /// \brief Flags for architecture specific defines.
911 typedef enum {
912 ArchDefineNone = 0,
913 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
914 ArchDefinePpcgr = 1 << 1,
915 ArchDefinePpcsq = 1 << 2,
916 ArchDefine440 = 1 << 3,
917 ArchDefine603 = 1 << 4,
918 ArchDefine604 = 1 << 5,
919 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000920 ArchDefinePwr5 = 1 << 7,
921 ArchDefinePwr5x = 1 << 8,
922 ArchDefinePwr6 = 1 << 9,
923 ArchDefinePwr6x = 1 << 10,
924 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000925 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000926 ArchDefinePwr9 = 1 << 13,
927 ArchDefineA2 = 1 << 14,
928 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000929 } ArchDefineTypes;
930
Bill Schmidt38378a02013-02-01 20:23:10 +0000931 // Note: GCC recognizes the following additional cpus:
932 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
933 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
934 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000935 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000936 bool CPUKnown = llvm::StringSwitch<bool>(Name)
937 .Case("generic", true)
938 .Case("440", true)
939 .Case("450", true)
940 .Case("601", true)
941 .Case("602", true)
942 .Case("603", true)
943 .Case("603e", true)
944 .Case("603ev", true)
945 .Case("604", true)
946 .Case("604e", true)
947 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000948 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000949 .Case("g3", true)
950 .Case("7400", true)
951 .Case("g4", true)
952 .Case("7450", true)
953 .Case("g4+", true)
954 .Case("750", true)
955 .Case("970", true)
956 .Case("g5", true)
957 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000958 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000959 .Case("e500mc", true)
960 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000961 .Case("power3", true)
962 .Case("pwr3", true)
963 .Case("power4", true)
964 .Case("pwr4", true)
965 .Case("power5", true)
966 .Case("pwr5", true)
967 .Case("power5x", true)
968 .Case("pwr5x", true)
969 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000970 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000971 .Case("power6x", true)
972 .Case("pwr6x", true)
973 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000974 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000975 .Case("power8", true)
976 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000977 .Case("power9", true)
978 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000979 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000980 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000981 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000982 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000983 .Case("powerpc64le", true)
984 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000985 .Default(false);
986
987 if (CPUKnown)
988 CPU = Name;
989
990 return CPUKnown;
991 }
992
Ulrich Weigand8afad612014-07-28 13:17:52 +0000993
994 StringRef getABI() const override { return ABI; }
995
Craig Topper6c03a542015-10-19 04:51:35 +0000996 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
997 return llvm::makeArrayRef(BuiltinInfo,
998 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000999 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001000
Craig Topper3164f332014-03-11 03:39:26 +00001001 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001002
Craig Topper3164f332014-03-11 03:39:26 +00001003 void getTargetDefines(const LangOptions &Opts,
1004 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001005
Eric Christopher8c47b422015-10-09 18:39:55 +00001006 bool
1007 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1008 StringRef CPU,
1009 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001010
Craig Topper3164f332014-03-11 03:39:26 +00001011 bool handleTargetFeatures(std::vector<std::string> &Features,
1012 DiagnosticsEngine &Diags) override;
1013 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001014 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1015 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001016
Craig Topperf054e3a2015-10-19 03:52:27 +00001017 ArrayRef<const char *> getGCCRegNames() const override;
1018 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001019 bool validateAsmConstraint(const char *&Name,
1020 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001021 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001022 default: return false;
1023 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001024 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001025 case 'b': // Base register
1026 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001027 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001028 break;
1029 // FIXME: The following are added to allow parsing.
1030 // I just took a guess at what the actions should be.
1031 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001032 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001033 case 'v': // Altivec vector register
1034 Info.setAllowsRegister();
1035 break;
1036 case 'w':
1037 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 case 'd':// VSX vector register to hold vector double data
1039 case 'f':// VSX vector register to hold vector float data
1040 case 's':// VSX vector register to hold scalar float data
1041 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001042 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001043 break;
1044 default:
1045 return false;
1046 }
1047 Info.setAllowsRegister();
1048 Name++; // Skip over 'w'.
1049 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001050 case 'h': // `MQ', `CTR', or `LINK' register
1051 case 'q': // `MQ' register
1052 case 'c': // `CTR' register
1053 case 'l': // `LINK' register
1054 case 'x': // `CR' register (condition register) number 0
1055 case 'y': // `CR' register (condition register)
1056 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001057 Info.setAllowsRegister();
1058 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001059 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001060 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // (use `L' instead for SImode constants)
1062 case 'K': // Unsigned 16-bit constant
1063 case 'L': // Signed 16-bit constant shifted left 16 bits
1064 case 'M': // Constant larger than 31
1065 case 'N': // Exact power of 2
1066 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001067 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001068 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001069 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001070 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001071 break;
1072 case 'm': // Memory operand. Note that on PowerPC targets, m can
1073 // include addresses that update the base register. It
1074 // is therefore only safe to use `m' in an asm statement
1075 // if that asm statement accesses the operand exactly once.
1076 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001077 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001078 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001079 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001081 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1082 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // register to be updated.
1084 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001085 if (Name[1] != 's')
1086 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001087 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001088 // include any automodification of the base register. Unlike
1089 // `m', this constraint can be used in asm statements that
1090 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001091 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001092 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001093 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001094 break;
1095 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001096 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001097 case 'Z': // Memory operand that is an indexed or indirect from a
1098 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001099 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001100 Info.setAllowsMemory();
1101 Info.setAllowsRegister();
1102 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001103 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001104 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001105 // register (`p' is preferable for asm statements)
1106 case 'S': // Constant suitable as a 64-bit mask operand
1107 case 'T': // Constant suitable as a 32-bit mask operand
1108 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001109 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001110 // instructions
1111 case 'W': // Vector constant that does not require memory
1112 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001113 break;
1114 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001115 }
John Thompson07a61a42010-06-24 22:44:13 +00001116 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001117 }
Craig Topper3164f332014-03-11 03:39:26 +00001118 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001119 std::string R;
1120 switch (*Constraint) {
1121 case 'e':
1122 case 'w':
1123 // Two-character constraint; add "^" hint for later parsing.
1124 R = std::string("^") + std::string(Constraint, 2);
1125 Constraint++;
1126 break;
1127 default:
1128 return TargetInfo::convertConstraint(Constraint);
1129 }
1130 return R;
1131 }
Craig Topper3164f332014-03-11 03:39:26 +00001132 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001133 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001134 }
Craig Topper3164f332014-03-11 03:39:26 +00001135 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001136 if (RegNo == 0) return 3;
1137 if (RegNo == 1) return 4;
1138 return -1;
1139 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001140
1141 bool hasSjLjLowering() const override {
1142 return true;
1143 }
David Majnemer2617ea62015-06-09 18:05:33 +00001144
1145 bool useFloat128ManglingForLongDouble() const override {
1146 return LongDoubleWidth == 128 &&
1147 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1148 getTriple().isOSBinFormatELF();
1149 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001150};
Anders Carlssonf511f642007-11-27 04:11:28 +00001151
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001152const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001153#define BUILTIN(ID, TYPE, ATTRS) \
1154 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1155#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1156 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001157#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001158};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001159
Eric Christopher917e9522014-11-18 22:36:15 +00001160/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001161/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001162bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001163 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001164 for (const auto &Feature : Features) {
1165 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001166 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001167 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001168 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001169 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001170 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001171 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001172 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001173 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001174 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001175 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001176 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001177 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001178 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001179 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001180 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001181 } else if (Feature == "+float128") {
1182 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001183 } else if (Feature == "+power9-vector") {
1184 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001185 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001186 // TODO: Finish this list and add an assert that we've handled them
1187 // all.
1188 }
Eric Christopher02c33352015-08-25 00:59:11 +00001189
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001190 return true;
1191}
1192
Chris Lattnerecd49032009-03-02 22:27:17 +00001193/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1194/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001195void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001196 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001197 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001198 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001199 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001200 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001201 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001203 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001205 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001206 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001207 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001208 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001209
Chris Lattnerecd49032009-03-02 22:27:17 +00001210 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001211 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1212 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001213 } else {
1214 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1215 getTriple().getOS() != llvm::Triple::OpenBSD)
1216 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001217 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001218
Ulrich Weigand8afad612014-07-28 13:17:52 +00001219 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001220 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001221 Builder.defineMacro("_CALL_ELF", "1");
1222 if (ABI == "elfv2")
1223 Builder.defineMacro("_CALL_ELF", "2");
1224
Chris Lattnerecd49032009-03-02 22:27:17 +00001225 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001226 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1227 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001228
Chris Lattnerecd49032009-03-02 22:27:17 +00001229 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001230 if (LongDoubleWidth == 128)
1231 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001232
John Thompsone467e192009-11-19 17:18:50 +00001233 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001234 Builder.defineMacro("__VEC__", "10206");
1235 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001236 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001237
1238 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001239 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1240 .Case("440", ArchDefineName)
1241 .Case("450", ArchDefineName | ArchDefine440)
1242 .Case("601", ArchDefineName)
1243 .Case("602", ArchDefineName | ArchDefinePpcgr)
1244 .Case("603", ArchDefineName | ArchDefinePpcgr)
1245 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1246 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1247 .Case("604", ArchDefineName | ArchDefinePpcgr)
1248 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1249 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001250 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001251 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1252 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1253 .Case("750", ArchDefineName | ArchDefinePpcgr)
1254 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1255 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001256 .Case("a2", ArchDefineA2)
1257 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001258 .Case("pwr3", ArchDefinePpcgr)
1259 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1260 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1261 | ArchDefinePpcsq)
1262 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1263 | ArchDefinePpcgr | ArchDefinePpcsq)
1264 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1265 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1266 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1267 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1268 | ArchDefinePpcsq)
1269 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1270 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001271 | ArchDefinePpcgr | ArchDefinePpcsq)
1272 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1273 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1274 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001275 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1276 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1277 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1278 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001279 .Case("power3", ArchDefinePpcgr)
1280 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1281 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1282 | ArchDefinePpcsq)
1283 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1284 | ArchDefinePpcgr | ArchDefinePpcsq)
1285 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1286 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1287 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1288 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1289 | ArchDefinePpcsq)
1290 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1291 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001292 | ArchDefinePpcgr | ArchDefinePpcsq)
1293 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1294 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1295 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001296 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1297 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1298 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1299 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001300 .Default(ArchDefineNone);
1301
1302 if (defs & ArchDefineName)
1303 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1304 if (defs & ArchDefinePpcgr)
1305 Builder.defineMacro("_ARCH_PPCGR");
1306 if (defs & ArchDefinePpcsq)
1307 Builder.defineMacro("_ARCH_PPCSQ");
1308 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001309 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001310 if (defs & ArchDefine603)
1311 Builder.defineMacro("_ARCH_603");
1312 if (defs & ArchDefine604)
1313 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001314 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001315 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001316 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001317 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001318 if (defs & ArchDefinePwr5x)
1319 Builder.defineMacro("_ARCH_PWR5X");
1320 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001321 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001322 if (defs & ArchDefinePwr6x)
1323 Builder.defineMacro("_ARCH_PWR6X");
1324 if (defs & ArchDefinePwr7)
1325 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001326 if (defs & ArchDefinePwr8)
1327 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001328 if (defs & ArchDefinePwr9)
1329 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001330 if (defs & ArchDefineA2)
1331 Builder.defineMacro("_ARCH_A2");
1332 if (defs & ArchDefineA2q) {
1333 Builder.defineMacro("_ARCH_A2Q");
1334 Builder.defineMacro("_ARCH_QP");
1335 }
1336
1337 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1338 Builder.defineMacro("__bg__");
1339 Builder.defineMacro("__THW_BLUEGENE__");
1340 Builder.defineMacro("__bgq__");
1341 Builder.defineMacro("__TOS_BGQ__");
1342 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001343
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001344 if (HasVSX)
1345 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001346 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001347 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001348 if (HasP8Crypto)
1349 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001350 if (HasHTM)
1351 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001352 if (HasFloat128)
1353 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001354 if (HasP9Vector)
1355 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001356
1357 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1358 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1360 if (PointerWidth == 64)
1361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001362
Bill Schmidt38378a02013-02-01 20:23:10 +00001363 // FIXME: The following are not yet generated here by Clang, but are
1364 // generated by GCC:
1365 //
1366 // _SOFT_FLOAT_
1367 // __RECIP_PRECISION__
1368 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001369 // __RECIP__
1370 // __RECIPF__
1371 // __RSQRTE__
1372 // __RSQRTEF__
1373 // _SOFT_DOUBLE_
1374 // __NO_LWSYNC__
1375 // __HAVE_BSWAP__
1376 // __LONGDOUBLE128
1377 // __CMODEL_MEDIUM__
1378 // __CMODEL_LARGE__
1379 // _CALL_SYSV
1380 // _CALL_DARWIN
1381 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001382}
1383
Eric Christophera8a14c32015-08-31 18:39:16 +00001384// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001385// explicitly turned off vsx and turned on any of:
1386// - power8-vector
1387// - direct-move
1388// - float128
1389// - power9-vector
1390// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001391// set of options.
1392static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001393 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001394
1395 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1396 FeaturesVec.end()) {
1397 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1398 FeaturesVec.end()) {
1399 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1400 << "-mno-vsx";
1401 return false;
1402 }
1403
1404 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1405 FeaturesVec.end()) {
1406 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1407 << "-mno-vsx";
1408 return false;
1409 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001410
1411 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1412 FeaturesVec.end()) {
1413 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1414 << "-mno-vsx";
1415 return false;
1416 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001417
1418 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1419 FeaturesVec.end()) {
1420 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1421 << "-mno-vsx";
1422 return false;
1423 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001424 }
1425
1426 return true;
1427}
1428
Eric Christopher8c47b422015-10-09 18:39:55 +00001429bool PPCTargetInfo::initFeatureMap(
1430 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1431 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001432 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1433 .Case("7400", true)
1434 .Case("g4", true)
1435 .Case("7450", true)
1436 .Case("g4+", true)
1437 .Case("970", true)
1438 .Case("g5", true)
1439 .Case("pwr6", true)
1440 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001441 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001442 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001443 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001444 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001445 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001446
1447 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001448 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001449 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1450 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001451 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001452 .Case("pwr8", true)
1453 .Default(false);
1454 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1455 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001456 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001457 .Case("pwr8", true)
1458 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001459 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1460 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001461 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001462 .Case("pwr8", true)
1463 .Case("pwr7", true)
1464 .Default(false);
1465 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1466 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001467 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001468 .Case("pwr8", true)
1469 .Case("pwr7", true)
1470 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001471 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1472 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001473 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001474 .Case("pwr8", true)
1475 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001476 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1477 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001478 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001479 .Case("pwr8", true)
1480 .Case("pwr7", true)
1481 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001482
Eric Christophera8a14c32015-08-31 18:39:16 +00001483 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1484 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001485
Eric Christopher007b0a02015-08-28 22:32:01 +00001486 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001487}
1488
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001489bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001490 return llvm::StringSwitch<bool>(Feature)
1491 .Case("powerpc", true)
1492 .Case("vsx", HasVSX)
1493 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001494 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001495 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001496 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001497 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001498 .Case("bpermd", HasBPERMD)
1499 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001500 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001501 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001502 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001503}
Chris Lattner17df24e2008-04-21 18:56:49 +00001504
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001505void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1506 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001507 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1508 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1509 // incompatible options.
1510 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001511 if (Name == "direct-move" ||
1512 Name == "power8-vector" ||
1513 Name == "float128" ||
1514 Name == "power9-vector") {
1515 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001516 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001517 if (Name == "power9-vector")
1518 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001519 } else {
1520 Features[Name] = true;
1521 }
1522 } else {
1523 if (Name == "vsx") {
1524 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001525 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001526 } else {
1527 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001528 }
1529 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001530}
1531
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001532const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001533 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1534 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1535 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1536 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1537 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1538 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1539 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1540 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001541 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001542 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001543 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001544 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1545 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1546 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1547 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001548 "vrsave", "vscr",
1549 "spe_acc", "spefscr",
1550 "sfp"
1551};
Chris Lattner10a5b382007-01-29 05:24:35 +00001552
Craig Topperf054e3a2015-10-19 03:52:27 +00001553ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1554 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001555}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001556
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1558 // While some of these aliases do map to different registers
1559 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001560 { { "0" }, "r0" },
1561 { { "1"}, "r1" },
1562 { { "2" }, "r2" },
1563 { { "3" }, "r3" },
1564 { { "4" }, "r4" },
1565 { { "5" }, "r5" },
1566 { { "6" }, "r6" },
1567 { { "7" }, "r7" },
1568 { { "8" }, "r8" },
1569 { { "9" }, "r9" },
1570 { { "10" }, "r10" },
1571 { { "11" }, "r11" },
1572 { { "12" }, "r12" },
1573 { { "13" }, "r13" },
1574 { { "14" }, "r14" },
1575 { { "15" }, "r15" },
1576 { { "16" }, "r16" },
1577 { { "17" }, "r17" },
1578 { { "18" }, "r18" },
1579 { { "19" }, "r19" },
1580 { { "20" }, "r20" },
1581 { { "21" }, "r21" },
1582 { { "22" }, "r22" },
1583 { { "23" }, "r23" },
1584 { { "24" }, "r24" },
1585 { { "25" }, "r25" },
1586 { { "26" }, "r26" },
1587 { { "27" }, "r27" },
1588 { { "28" }, "r28" },
1589 { { "29" }, "r29" },
1590 { { "30" }, "r30" },
1591 { { "31" }, "r31" },
1592 { { "fr0" }, "f0" },
1593 { { "fr1" }, "f1" },
1594 { { "fr2" }, "f2" },
1595 { { "fr3" }, "f3" },
1596 { { "fr4" }, "f4" },
1597 { { "fr5" }, "f5" },
1598 { { "fr6" }, "f6" },
1599 { { "fr7" }, "f7" },
1600 { { "fr8" }, "f8" },
1601 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001602 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001603 { { "fr11" }, "f11" },
1604 { { "fr12" }, "f12" },
1605 { { "fr13" }, "f13" },
1606 { { "fr14" }, "f14" },
1607 { { "fr15" }, "f15" },
1608 { { "fr16" }, "f16" },
1609 { { "fr17" }, "f17" },
1610 { { "fr18" }, "f18" },
1611 { { "fr19" }, "f19" },
1612 { { "fr20" }, "f20" },
1613 { { "fr21" }, "f21" },
1614 { { "fr22" }, "f22" },
1615 { { "fr23" }, "f23" },
1616 { { "fr24" }, "f24" },
1617 { { "fr25" }, "f25" },
1618 { { "fr26" }, "f26" },
1619 { { "fr27" }, "f27" },
1620 { { "fr28" }, "f28" },
1621 { { "fr29" }, "f29" },
1622 { { "fr30" }, "f30" },
1623 { { "fr31" }, "f31" },
1624 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001625};
1626
Craig Topperf054e3a2015-10-19 03:52:27 +00001627ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1628 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001629}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001630
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001631class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001632public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001633 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1634 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001635 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001636
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001637 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001638 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001639 case llvm::Triple::FreeBSD:
1640 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001641 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001642 PtrDiffType = SignedInt;
1643 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001644 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001645 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001646 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001647 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001648
Roman Divacky3ffe7462012-03-13 19:20:17 +00001649 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1650 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001651 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001652 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001653
1654 // PPC32 supports atomics up to 4 bytes.
1655 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001656 }
1657
Craig Topper3164f332014-03-11 03:39:26 +00001658 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001659 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001660 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001661 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001662};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001663
Bill Schmidt778d3872013-07-26 01:36:11 +00001664// Note: ABI differences may eventually require us to have a separate
1665// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001666class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001667public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001668 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1669 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001670 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001671 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001672 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001673
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001674 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001675 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001676 ABI = "elfv2";
1677 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001678 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001679 ABI = "elfv1";
1680 }
1681
1682 switch (getTriple().getOS()) {
1683 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001684 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001685 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001686 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001687 case llvm::Triple::NetBSD:
1688 IntMaxType = SignedLongLong;
1689 Int64Type = SignedLongLong;
1690 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001691 default:
1692 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001693 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001694
1695 // PPC64 supports atomics up to 8 bytes.
1696 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001697 }
Craig Topper3164f332014-03-11 03:39:26 +00001698 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001699 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001700 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001701 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001702 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001703 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001704 ABI = Name;
1705 return true;
1706 }
1707 return false;
1708 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001709};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001710
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001711class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001712public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1714 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001715 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001716 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001717 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001718 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001719 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001720 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001721 }
Craig Topper3164f332014-03-11 03:39:26 +00001722 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001723 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001724 }
1725};
1726
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001727class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001728public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001729 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1730 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001731 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001732 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001733 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001734 }
1735};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001736
Eric Christopherc48497a2015-09-18 21:26:24 +00001737static const unsigned NVPTXAddrSpaceMap[] = {
1738 1, // opencl_global
1739 3, // opencl_local
1740 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001741 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001742 0, // opencl_generic
1743 1, // cuda_device
1744 4, // cuda_constant
1745 3, // cuda_shared
1746};
1747
1748class NVPTXTargetInfo : public TargetInfo {
1749 static const char *const GCCRegNames[];
1750 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001751 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001752
Eric Christopherc48497a2015-09-18 21:26:24 +00001753public:
Justin Lebar76945b22016-04-29 23:05:19 +00001754 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001755 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001756 TLSSupported = false;
1757 LongWidth = LongAlign = 64;
1758 AddrSpaceMap = &NVPTXAddrSpaceMap;
1759 UseAddrSpaceMapMangling = true;
1760 // Define available target features
1761 // These must be defined in sorted order!
1762 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001763 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001764
1765 // If possible, get a TargetInfo for our host triple, so we can match its
1766 // types.
1767 llvm::Triple HostTriple(Opts.HostTriple);
1768 if (HostTriple.isNVPTX())
1769 return;
1770 std::unique_ptr<TargetInfo> HostTarget(
1771 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1772 if (!HostTarget) {
1773 return;
1774 }
1775
1776 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1777 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1778 BoolWidth = HostTarget->getBoolWidth();
1779 BoolAlign = HostTarget->getBoolAlign();
1780 IntWidth = HostTarget->getIntWidth();
1781 IntAlign = HostTarget->getIntAlign();
1782 HalfWidth = HostTarget->getHalfWidth();
1783 HalfAlign = HostTarget->getHalfAlign();
1784 FloatWidth = HostTarget->getFloatWidth();
1785 FloatAlign = HostTarget->getFloatAlign();
1786 DoubleWidth = HostTarget->getDoubleWidth();
1787 DoubleAlign = HostTarget->getDoubleAlign();
1788 LongWidth = HostTarget->getLongWidth();
1789 LongAlign = HostTarget->getLongAlign();
1790 LongLongWidth = HostTarget->getLongLongWidth();
1791 LongLongAlign = HostTarget->getLongLongAlign();
1792 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001793 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001794 DefaultAlignForAttributeAligned =
1795 HostTarget->getDefaultAlignForAttributeAligned();
1796 SizeType = HostTarget->getSizeType();
1797 IntMaxType = HostTarget->getIntMaxType();
1798 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1799 IntPtrType = HostTarget->getIntPtrType();
1800 WCharType = HostTarget->getWCharType();
1801 WIntType = HostTarget->getWIntType();
1802 Char16Type = HostTarget->getChar16Type();
1803 Char32Type = HostTarget->getChar32Type();
1804 Int64Type = HostTarget->getInt64Type();
1805 SigAtomicType = HostTarget->getSigAtomicType();
1806 ProcessIDType = HostTarget->getProcessIDType();
1807
1808 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1809 UseZeroLengthBitfieldAlignment =
1810 HostTarget->useZeroLengthBitfieldAlignment();
1811 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1812 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1813
Justin Lebar5057f172016-09-09 20:35:43 +00001814 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1815 // we need those macros to be identical on host and device, because (among
1816 // other things) they affect which standard library classes are defined, and
1817 // we need all classes to be defined on both the host and device.
1818 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1819
Justin Lebar76945b22016-04-29 23:05:19 +00001820 // Properties intentionally not copied from host:
1821 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1822 // host/device boundary.
1823 // - SuitableAlign: Not visible across the host/device boundary, and may
1824 // correctly be different on host/device, e.g. if host has wider vector
1825 // types than device.
1826 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1827 // as its double type, but that's not necessarily true on the host.
1828 // TODO: nvcc emits a warning when using long double on device; we should
1829 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001830 }
1831 void getTargetDefines(const LangOptions &Opts,
1832 MacroBuilder &Builder) const override {
1833 Builder.defineMacro("__PTX__");
1834 Builder.defineMacro("__NVPTX__");
1835 if (Opts.CUDAIsDevice) {
1836 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001837 std::string CUDAArchCode = [this] {
1838 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001839 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001840 assert(false && "No GPU arch when compiling CUDA device code.");
1841 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001842 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001843 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001844 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001845 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001846 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001847 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001848 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001849 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001850 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001851 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001852 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001853 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001854 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001855 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001856 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001857 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001858 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001859 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001860 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001861 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001862 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001863 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001864 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001865 return "620";
1866 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001867 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001868 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001869 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001870 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001871 }
Craig Topper6c03a542015-10-19 04:51:35 +00001872 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1873 return llvm::makeArrayRef(BuiltinInfo,
1874 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001875 }
Artem Belevichfda99052016-09-28 17:47:35 +00001876 bool
1877 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1878 StringRef CPU,
1879 const std::vector<std::string> &FeaturesVec) const override {
1880 Features["satom"] = GPU >= CudaArch::SM_60;
1881 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1882 }
1883
Eric Christopherc48497a2015-09-18 21:26:24 +00001884 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001885 return llvm::StringSwitch<bool>(Feature)
1886 .Cases("ptx", "nvptx", true)
1887 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1888 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001889 }
1890
Craig Topperf054e3a2015-10-19 03:52:27 +00001891 ArrayRef<const char *> getGCCRegNames() const override;
1892 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001893 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001894 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001895 }
1896 bool validateAsmConstraint(const char *&Name,
1897 TargetInfo::ConstraintInfo &Info) const override {
1898 switch (*Name) {
1899 default:
1900 return false;
1901 case 'c':
1902 case 'h':
1903 case 'r':
1904 case 'l':
1905 case 'f':
1906 case 'd':
1907 Info.setAllowsRegister();
1908 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001909 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001910 }
1911 const char *getClobbers() const override {
1912 // FIXME: Is this really right?
1913 return "";
1914 }
1915 BuiltinVaListKind getBuiltinVaListKind() const override {
1916 // FIXME: implement
1917 return TargetInfo::CharPtrBuiltinVaList;
1918 }
1919 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001920 GPU = StringToCudaArch(Name);
1921 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001922 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001923 void setSupportedOpenCLOpts() override {
1924 auto &Opts = getSupportedOpenCLOpts();
1925 Opts.cl_clang_storage_class_specifiers = 1;
1926 Opts.cl_khr_gl_sharing = 1;
1927 Opts.cl_khr_icd = 1;
1928
1929 Opts.cl_khr_fp64 = 1;
1930 Opts.cl_khr_byte_addressable_store = 1;
1931 Opts.cl_khr_global_int32_base_atomics = 1;
1932 Opts.cl_khr_global_int32_extended_atomics = 1;
1933 Opts.cl_khr_local_int32_base_atomics = 1;
1934 Opts.cl_khr_local_int32_extended_atomics = 1;
1935 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001936};
1937
1938const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1939#define BUILTIN(ID, TYPE, ATTRS) \
1940 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1941#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1942 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001943#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1944 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001945#include "clang/Basic/BuiltinsNVPTX.def"
1946};
1947
1948const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1949
Craig Topperf054e3a2015-10-19 03:52:27 +00001950ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1951 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001952}
1953
1954class NVPTX32TargetInfo : public NVPTXTargetInfo {
1955public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001956 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1957 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001958 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001959 PointerWidth = PointerAlign = 32;
1960 SizeType = TargetInfo::UnsignedInt;
1961 PtrDiffType = TargetInfo::SignedInt;
1962 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001963 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001964 }
1965};
1966
1967class NVPTX64TargetInfo : public NVPTXTargetInfo {
1968public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001969 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1970 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001971 PointerWidth = PointerAlign = 64;
1972 SizeType = TargetInfo::UnsignedLong;
1973 PtrDiffType = TargetInfo::SignedLong;
1974 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001975 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001976 }
1977};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001978
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001979static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001980 1, // opencl_global
1981 3, // opencl_local
1982 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001983 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001984 1, // cuda_device
1985 2, // cuda_constant
1986 3 // cuda_shared
1987};
1988
Tom Stellarda96344b2014-08-21 13:58:40 +00001989// If you edit the description strings, make sure you update
1990// getPointerWidthV().
1991
Craig Topper273dbc62015-10-18 05:29:26 +00001992static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001993 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1994 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001995
Craig Topper273dbc62015-10-18 05:29:26 +00001996static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001997 "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 +00001998 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1999 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002000
Matt Arsenault250024f2016-06-08 01:56:42 +00002001class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002002 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002003 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002004
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002005 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002006 enum GPUKind {
2007 GK_NONE,
2008 GK_R600,
2009 GK_R600_DOUBLE_OPS,
2010 GK_R700,
2011 GK_R700_DOUBLE_OPS,
2012 GK_EVERGREEN,
2013 GK_EVERGREEN_DOUBLE_OPS,
2014 GK_NORTHERN_ISLANDS,
2015 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002016 GK_GFX6,
2017 GK_GFX7,
2018 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00002019 } GPU;
2020
Jan Veselyeebeaea2015-05-04 19:53:36 +00002021 bool hasFP64:1;
2022 bool hasFMAF:1;
2023 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002024 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002025
Matt Arsenault250024f2016-06-08 01:56:42 +00002026 static bool isAMDGCN(const llvm::Triple &TT) {
2027 return TT.getArch() == llvm::Triple::amdgcn;
2028 }
2029
Eli Friedmand13b41e2012-10-12 23:32:00 +00002030public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002031 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002032 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002033 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002034 hasFP64(false),
2035 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002036 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002037 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002038 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002039 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002040 hasFMAF = true;
2041 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002042 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002043
2044 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2045 DataLayoutStringSI : DataLayoutStringR600);
2046
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002047 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002048 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002049 }
2050
Tom Stellarda96344b2014-08-21 13:58:40 +00002051 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2052 if (GPU <= GK_CAYMAN)
2053 return 32;
2054
2055 switch(AddrSpace) {
2056 default:
2057 return 64;
2058 case 0:
2059 case 3:
2060 case 5:
2061 return 32;
2062 }
2063 }
2064
Yaxun Liu26f75662016-08-19 05:17:25 +00002065 uint64_t getMaxPointerWidth() const override {
2066 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2067 }
2068
Craig Topper3164f332014-03-11 03:39:26 +00002069 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002070 return "";
2071 }
2072
Craig Topperf054e3a2015-10-19 03:52:27 +00002073 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002074
Craig Topperf054e3a2015-10-19 03:52:27 +00002075 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2076 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002077 }
2078
Craig Topper3164f332014-03-11 03:39:26 +00002079 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002080 TargetInfo::ConstraintInfo &Info) const override {
2081 switch (*Name) {
2082 default: break;
2083 case 'v': // vgpr
2084 case 's': // sgpr
2085 Info.setAllowsRegister();
2086 return true;
2087 }
2088 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002089 }
2090
Matt Arsenault250024f2016-06-08 01:56:42 +00002091 bool initFeatureMap(llvm::StringMap<bool> &Features,
2092 DiagnosticsEngine &Diags, StringRef CPU,
2093 const std::vector<std::string> &FeatureVec) const override;
2094
Yaxun Liu2c17e822016-08-09 19:43:38 +00002095 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2096 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002097 bool hasFP32Denormals = false;
2098 bool hasFP64Denormals = false;
2099 for (auto &I : TargetOpts.FeaturesAsWritten) {
2100 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2101 hasFP32Denormals = true;
2102 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2103 hasFP64Denormals = true;
2104 }
2105 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002106 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2107 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2108 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002109 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002110 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002111 }
2112
Craig Topper6c03a542015-10-19 04:51:35 +00002113 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2114 return llvm::makeArrayRef(BuiltinInfo,
2115 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002116 }
2117
Craig Topper3164f332014-03-11 03:39:26 +00002118 void getTargetDefines(const LangOptions &Opts,
2119 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002120 if (getTriple().getArch() == llvm::Triple::amdgcn)
2121 Builder.defineMacro("__AMDGCN__");
2122 else
2123 Builder.defineMacro("__R600__");
2124
Jan Veselyeebeaea2015-05-04 19:53:36 +00002125 if (hasFMAF)
2126 Builder.defineMacro("__HAS_FMAF__");
2127 if (hasLDEXPF)
2128 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002129 if (hasFP64)
2130 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002131 }
2132
Craig Topper3164f332014-03-11 03:39:26 +00002133 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002134 return TargetInfo::CharPtrBuiltinVaList;
2135 }
2136
Matt Arsenault250024f2016-06-08 01:56:42 +00002137 static GPUKind parseR600Name(StringRef Name) {
2138 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002139 .Case("r600" , GK_R600)
2140 .Case("rv610", GK_R600)
2141 .Case("rv620", GK_R600)
2142 .Case("rv630", GK_R600)
2143 .Case("rv635", GK_R600)
2144 .Case("rs780", GK_R600)
2145 .Case("rs880", GK_R600)
2146 .Case("rv670", GK_R600_DOUBLE_OPS)
2147 .Case("rv710", GK_R700)
2148 .Case("rv730", GK_R700)
2149 .Case("rv740", GK_R700_DOUBLE_OPS)
2150 .Case("rv770", GK_R700_DOUBLE_OPS)
2151 .Case("palm", GK_EVERGREEN)
2152 .Case("cedar", GK_EVERGREEN)
2153 .Case("sumo", GK_EVERGREEN)
2154 .Case("sumo2", GK_EVERGREEN)
2155 .Case("redwood", GK_EVERGREEN)
2156 .Case("juniper", GK_EVERGREEN)
2157 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2158 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2159 .Case("barts", GK_NORTHERN_ISLANDS)
2160 .Case("turks", GK_NORTHERN_ISLANDS)
2161 .Case("caicos", GK_NORTHERN_ISLANDS)
2162 .Case("cayman", GK_CAYMAN)
2163 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002164 .Default(GK_NONE);
2165 }
2166
2167 static GPUKind parseAMDGCNName(StringRef Name) {
2168 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002169 .Case("tahiti", GK_GFX6)
2170 .Case("pitcairn", GK_GFX6)
2171 .Case("verde", GK_GFX6)
2172 .Case("oland", GK_GFX6)
2173 .Case("hainan", GK_GFX6)
2174 .Case("bonaire", GK_GFX7)
2175 .Case("kabini", GK_GFX7)
2176 .Case("kaveri", GK_GFX7)
2177 .Case("hawaii", GK_GFX7)
2178 .Case("mullins", GK_GFX7)
2179 .Case("tonga", GK_GFX8)
2180 .Case("iceland", GK_GFX8)
2181 .Case("carrizo", GK_GFX8)
2182 .Case("fiji", GK_GFX8)
2183 .Case("stoney", GK_GFX8)
2184 .Case("polaris10", GK_GFX8)
2185 .Case("polaris11", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002186 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002187 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002188
Matt Arsenault250024f2016-06-08 01:56:42 +00002189 bool setCPU(const std::string &Name) override {
2190 if (getTriple().getArch() == llvm::Triple::amdgcn)
2191 GPU = parseAMDGCNName(Name);
2192 else
2193 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002194
Matt Arsenault250024f2016-06-08 01:56:42 +00002195 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002196 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002197
Jan Vesely211ba782016-06-17 02:25:03 +00002198 void setSupportedOpenCLOpts() override {
2199 auto &Opts = getSupportedOpenCLOpts();
2200 Opts.cl_clang_storage_class_specifiers = 1;
2201 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002202
Jan Vesely211ba782016-06-17 02:25:03 +00002203 if (hasFP64)
2204 Opts.cl_khr_fp64 = 1;
2205 if (GPU >= GK_EVERGREEN) {
2206 Opts.cl_khr_byte_addressable_store = 1;
2207 Opts.cl_khr_global_int32_base_atomics = 1;
2208 Opts.cl_khr_global_int32_extended_atomics = 1;
2209 Opts.cl_khr_local_int32_base_atomics = 1;
2210 Opts.cl_khr_local_int32_extended_atomics = 1;
2211 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002212 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002213 Opts.cl_khr_fp16 = 1;
2214 Opts.cl_khr_int64_base_atomics = 1;
2215 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002216 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002217 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002218 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002219 Opts.cl_amd_media_ops = 1;
2220 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002221 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002222 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002223
Yaxun Liu99444cb2016-08-03 20:38:06 +00002224 LangAS::ID getOpenCLImageAddrSpace() const override {
2225 return LangAS::opencl_constant;
2226 }
2227
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002228 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2229 switch (CC) {
2230 default:
2231 return CCCR_Warning;
2232 case CC_C:
2233 case CC_OpenCLKernel:
2234 return CCCR_OK;
2235 }
2236 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002237};
2238
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002239const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002240#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002241 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002242#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2243 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002244#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002245};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002246const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002247 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2248 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2249 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2250 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2251 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2252 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2253 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2254 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2255 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2256 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2257 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2258 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2259 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2260 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2261 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2262 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2263 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2264 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2265 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2266 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2267 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2268 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2269 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2270 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2271 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2272 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2273 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2274 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2275 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2276 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2277 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2278 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2279 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2280 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2281 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2282 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2283 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2284 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2285 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2286 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2287 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2288 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2289 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2290 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2291 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2292 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2293 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002294 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002295 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2296 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002297};
2298
Craig Topperf054e3a2015-10-19 03:52:27 +00002299ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2300 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002301}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002302
Matt Arsenault250024f2016-06-08 01:56:42 +00002303bool AMDGPUTargetInfo::initFeatureMap(
2304 llvm::StringMap<bool> &Features,
2305 DiagnosticsEngine &Diags, StringRef CPU,
2306 const std::vector<std::string> &FeatureVec) const {
2307
2308 // XXX - What does the member GPU mean if device name string passed here?
2309 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2310 if (CPU.empty())
2311 CPU = "tahiti";
2312
2313 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002314 case GK_GFX6:
2315 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002316 break;
2317
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002318 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002319 Features["s-memrealtime"] = true;
2320 Features["16-bit-insts"] = true;
2321 break;
2322
2323 case GK_NONE:
2324 return false;
2325 default:
2326 llvm_unreachable("unhandled subtarget");
2327 }
2328 } else {
2329 if (CPU.empty())
2330 CPU = "r600";
2331
2332 switch (parseR600Name(CPU)) {
2333 case GK_R600:
2334 case GK_R700:
2335 case GK_EVERGREEN:
2336 case GK_NORTHERN_ISLANDS:
2337 break;
2338 case GK_R600_DOUBLE_OPS:
2339 case GK_R700_DOUBLE_OPS:
2340 case GK_EVERGREEN_DOUBLE_OPS:
2341 case GK_CAYMAN:
2342 Features["fp64"] = true;
2343 break;
2344 case GK_NONE:
2345 return false;
2346 default:
2347 llvm_unreachable("unhandled subtarget");
2348 }
2349 }
2350
2351 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2352}
2353
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002354const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002355#define BUILTIN(ID, TYPE, ATTRS) \
2356 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002357#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002358 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002359#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2360 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002361#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002362
2363#define BUILTIN(ID, TYPE, ATTRS) \
2364 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002365#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2366 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002367#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2368 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2369#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002370};
Eli Friedmanb5366062008-05-20 14:21:01 +00002371
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002372
Nuno Lopescfca1f02009-12-23 17:49:57 +00002373static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002374 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2375 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002376 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002377 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2378 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2379 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002380 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002381 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2382 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002383 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2384 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2385 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2386 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2387 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2388 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2389 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2390 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002391};
2392
Eric Christophercdd36352011-06-21 00:05:20 +00002393const TargetInfo::AddlRegName AddlRegNames[] = {
2394 { { "al", "ah", "eax", "rax" }, 0 },
2395 { { "bl", "bh", "ebx", "rbx" }, 3 },
2396 { { "cl", "ch", "ecx", "rcx" }, 2 },
2397 { { "dl", "dh", "edx", "rdx" }, 1 },
2398 { { "esi", "rsi" }, 4 },
2399 { { "edi", "rdi" }, 5 },
2400 { { "esp", "rsp" }, 7 },
2401 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002402 { { "r8d", "r8w", "r8b" }, 38 },
2403 { { "r9d", "r9w", "r9b" }, 39 },
2404 { { "r10d", "r10w", "r10b" }, 40 },
2405 { { "r11d", "r11w", "r11b" }, 41 },
2406 { { "r12d", "r12w", "r12b" }, 42 },
2407 { { "r13d", "r13w", "r13b" }, 43 },
2408 { { "r14d", "r14w", "r14b" }, 44 },
2409 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002410};
2411
2412// X86 target abstract base class; x86-32 and x86-64 are very close, so
2413// most of the implementation can be shared.
2414class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002415 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002416 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002417 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002418 enum MMX3DNowEnum {
2419 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002420 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002421 enum XOPEnum {
2422 NoXOP,
2423 SSE4A,
2424 FMA4,
2425 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002426 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002427
Craig Topper543f3bd2015-10-14 23:47:57 +00002428 bool HasAES = false;
2429 bool HasPCLMUL = false;
2430 bool HasLZCNT = false;
2431 bool HasRDRND = false;
2432 bool HasFSGSBASE = false;
2433 bool HasBMI = false;
2434 bool HasBMI2 = false;
2435 bool HasPOPCNT = false;
2436 bool HasRTM = false;
2437 bool HasPRFCHW = false;
2438 bool HasRDSEED = false;
2439 bool HasADX = false;
2440 bool HasTBM = false;
2441 bool HasFMA = false;
2442 bool HasF16C = false;
2443 bool HasAVX512CD = false;
2444 bool HasAVX512ER = false;
2445 bool HasAVX512PF = false;
2446 bool HasAVX512DQ = false;
2447 bool HasAVX512BW = false;
2448 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002449 bool HasAVX512VBMI = false;
2450 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002451 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002452 bool HasMPX = false;
2453 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002454 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002455 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002456 bool HasXSAVE = false;
2457 bool HasXSAVEOPT = false;
2458 bool HasXSAVEC = false;
2459 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002460 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002461 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002462 bool HasCLFLUSHOPT = false;
2463 bool HasPCOMMIT = false;
2464 bool HasCLWB = false;
2465 bool HasUMIP = false;
2466 bool HasMOVBE = false;
2467 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002468
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002469 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2470 ///
2471 /// Each enumeration represents a particular CPU supported by Clang. These
2472 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2473 enum CPUKind {
2474 CK_Generic,
2475
2476 /// \name i386
2477 /// i386-generation processors.
2478 //@{
2479 CK_i386,
2480 //@}
2481
2482 /// \name i486
2483 /// i486-generation processors.
2484 //@{
2485 CK_i486,
2486 CK_WinChipC6,
2487 CK_WinChip2,
2488 CK_C3,
2489 //@}
2490
2491 /// \name i586
2492 /// i586-generation processors, P5 microarchitecture based.
2493 //@{
2494 CK_i586,
2495 CK_Pentium,
2496 CK_PentiumMMX,
2497 //@}
2498
2499 /// \name i686
2500 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2501 //@{
2502 CK_i686,
2503 CK_PentiumPro,
2504 CK_Pentium2,
2505 CK_Pentium3,
2506 CK_Pentium3M,
2507 CK_PentiumM,
2508 CK_C3_2,
2509
2510 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2511 /// Clang however has some logic to suport this.
2512 // FIXME: Warn, deprecate, and potentially remove this.
2513 CK_Yonah,
2514 //@}
2515
2516 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002517 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002518 //@{
2519 CK_Pentium4,
2520 CK_Pentium4M,
2521 CK_Prescott,
2522 CK_Nocona,
2523 //@}
2524
2525 /// \name Core
2526 /// Core microarchitecture based processors.
2527 //@{
2528 CK_Core2,
2529
2530 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2531 /// codename which GCC no longer accepts as an option to -march, but Clang
2532 /// has some logic for recognizing it.
2533 // FIXME: Warn, deprecate, and potentially remove this.
2534 CK_Penryn,
2535 //@}
2536
2537 /// \name Atom
2538 /// Atom processors
2539 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002540 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002541 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002542 //@}
2543
2544 /// \name Nehalem
2545 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002546 CK_Nehalem,
2547
2548 /// \name Westmere
2549 /// Westmere microarchitecture based processors.
2550 CK_Westmere,
2551
2552 /// \name Sandy Bridge
2553 /// Sandy Bridge microarchitecture based processors.
2554 CK_SandyBridge,
2555
2556 /// \name Ivy Bridge
2557 /// Ivy Bridge microarchitecture based processors.
2558 CK_IvyBridge,
2559
2560 /// \name Haswell
2561 /// Haswell microarchitecture based processors.
2562 CK_Haswell,
2563
2564 /// \name Broadwell
2565 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002566 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002567
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002568 /// \name Skylake Client
2569 /// Skylake client microarchitecture based processors.
2570 CK_SkylakeClient,
2571
2572 /// \name Skylake Server
2573 /// Skylake server microarchitecture based processors.
2574 CK_SkylakeServer,
2575
2576 /// \name Cannonlake Client
2577 /// Cannonlake client microarchitecture based processors.
2578 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002579
Craig Topper449314e2013-08-20 07:09:39 +00002580 /// \name Knights Landing
2581 /// Knights Landing processor.
2582 CK_KNL,
2583
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002584 /// \name Lakemont
2585 /// Lakemont microarchitecture based processors.
2586 CK_Lakemont,
2587
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002588 /// \name K6
2589 /// K6 architecture processors.
2590 //@{
2591 CK_K6,
2592 CK_K6_2,
2593 CK_K6_3,
2594 //@}
2595
2596 /// \name K7
2597 /// K7 architecture processors.
2598 //@{
2599 CK_Athlon,
2600 CK_AthlonThunderbird,
2601 CK_Athlon4,
2602 CK_AthlonXP,
2603 CK_AthlonMP,
2604 //@}
2605
2606 /// \name K8
2607 /// K8 architecture processors.
2608 //@{
2609 CK_Athlon64,
2610 CK_Athlon64SSE3,
2611 CK_AthlonFX,
2612 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002613 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002614 CK_Opteron,
2615 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002616 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002617 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002618
Benjamin Kramer569f2152012-01-10 11:50:18 +00002619 /// \name Bobcat
2620 /// Bobcat architecture processors.
2621 //@{
2622 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002623 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002624 //@}
2625
2626 /// \name Bulldozer
2627 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002628 //@{
2629 CK_BDVER1,
2630 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002631 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002632 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002633 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002634
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002635 /// This specification is deprecated and will be removed in the future.
2636 /// Users should prefer \see CK_K8.
2637 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002638 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002639 CK_x86_64,
2640 //@}
2641
2642 /// \name Geode
2643 /// Geode processors.
2644 //@{
2645 CK_Geode
2646 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002647 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002648
Eric Christopherc50738f2015-08-27 00:05:50 +00002649 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002650 return llvm::StringSwitch<CPUKind>(CPU)
2651 .Case("i386", CK_i386)
2652 .Case("i486", CK_i486)
2653 .Case("winchip-c6", CK_WinChipC6)
2654 .Case("winchip2", CK_WinChip2)
2655 .Case("c3", CK_C3)
2656 .Case("i586", CK_i586)
2657 .Case("pentium", CK_Pentium)
2658 .Case("pentium-mmx", CK_PentiumMMX)
2659 .Case("i686", CK_i686)
2660 .Case("pentiumpro", CK_PentiumPro)
2661 .Case("pentium2", CK_Pentium2)
2662 .Case("pentium3", CK_Pentium3)
2663 .Case("pentium3m", CK_Pentium3M)
2664 .Case("pentium-m", CK_PentiumM)
2665 .Case("c3-2", CK_C3_2)
2666 .Case("yonah", CK_Yonah)
2667 .Case("pentium4", CK_Pentium4)
2668 .Case("pentium4m", CK_Pentium4M)
2669 .Case("prescott", CK_Prescott)
2670 .Case("nocona", CK_Nocona)
2671 .Case("core2", CK_Core2)
2672 .Case("penryn", CK_Penryn)
2673 .Case("bonnell", CK_Bonnell)
2674 .Case("atom", CK_Bonnell) // Legacy name.
2675 .Case("silvermont", CK_Silvermont)
2676 .Case("slm", CK_Silvermont) // Legacy name.
2677 .Case("nehalem", CK_Nehalem)
2678 .Case("corei7", CK_Nehalem) // Legacy name.
2679 .Case("westmere", CK_Westmere)
2680 .Case("sandybridge", CK_SandyBridge)
2681 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2682 .Case("ivybridge", CK_IvyBridge)
2683 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2684 .Case("haswell", CK_Haswell)
2685 .Case("core-avx2", CK_Haswell) // Legacy name.
2686 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002687 .Case("skylake", CK_SkylakeClient)
2688 .Case("skylake-avx512", CK_SkylakeServer)
2689 .Case("skx", CK_SkylakeServer) // Legacy name.
2690 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002691 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002692 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002693 .Case("k6", CK_K6)
2694 .Case("k6-2", CK_K6_2)
2695 .Case("k6-3", CK_K6_3)
2696 .Case("athlon", CK_Athlon)
2697 .Case("athlon-tbird", CK_AthlonThunderbird)
2698 .Case("athlon-4", CK_Athlon4)
2699 .Case("athlon-xp", CK_AthlonXP)
2700 .Case("athlon-mp", CK_AthlonMP)
2701 .Case("athlon64", CK_Athlon64)
2702 .Case("athlon64-sse3", CK_Athlon64SSE3)
2703 .Case("athlon-fx", CK_AthlonFX)
2704 .Case("k8", CK_K8)
2705 .Case("k8-sse3", CK_K8SSE3)
2706 .Case("opteron", CK_Opteron)
2707 .Case("opteron-sse3", CK_OpteronSSE3)
2708 .Case("barcelona", CK_AMDFAM10)
2709 .Case("amdfam10", CK_AMDFAM10)
2710 .Case("btver1", CK_BTVER1)
2711 .Case("btver2", CK_BTVER2)
2712 .Case("bdver1", CK_BDVER1)
2713 .Case("bdver2", CK_BDVER2)
2714 .Case("bdver3", CK_BDVER3)
2715 .Case("bdver4", CK_BDVER4)
2716 .Case("x86-64", CK_x86_64)
2717 .Case("geode", CK_Geode)
2718 .Default(CK_Generic);
2719 }
2720
Rafael Espindolaeb265472013-08-21 21:59:03 +00002721 enum FPMathKind {
2722 FP_Default,
2723 FP_SSE,
2724 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002725 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002726
Eli Friedman3fd920a2008-08-20 02:34:37 +00002727public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002728 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2729 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002730 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002731 }
Craig Topper3164f332014-03-11 03:39:26 +00002732 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002733 // X87 evaluates with 80 bits "long double" precision.
2734 return SSELevel == NoSSE ? 2 : 0;
2735 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002736 ArrayRef<const char *> getGCCRegNames() const override {
2737 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002738 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002739 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2740 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002741 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002742 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2743 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002744 }
Eric Christopherd9832702015-06-29 21:00:05 +00002745 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002746 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002747 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002748
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002749 bool validateGlobalRegisterVariable(StringRef RegName,
2750 unsigned RegSize,
2751 bool &HasSizeMismatch) const override {
2752 // esp and ebp are the only 32-bit registers the x86 backend can currently
2753 // handle.
2754 if (RegName.equals("esp") || RegName.equals("ebp")) {
2755 // Check that the register size is 32-bit.
2756 HasSizeMismatch = RegSize != 32;
2757 return true;
2758 }
2759
2760 return false;
2761 }
2762
Akira Hatanaka974131e2014-09-18 18:17:18 +00002763 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2764
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002765 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2766
Akira Hatanaka974131e2014-09-18 18:17:18 +00002767 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2768
Craig Topper3164f332014-03-11 03:39:26 +00002769 std::string convertConstraint(const char *&Constraint) const override;
2770 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002771 return "~{dirflag},~{fpsr},~{flags}";
2772 }
Craig Topper3164f332014-03-11 03:39:26 +00002773 void getTargetDefines(const LangOptions &Opts,
2774 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002775 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2776 bool Enabled);
2777 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2778 bool Enabled);
2779 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2780 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002781 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2782 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002783 setFeatureEnabledImpl(Features, Name, Enabled);
2784 }
2785 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002786 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002787 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2788 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002789 bool
2790 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2791 StringRef CPU,
2792 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002793 bool hasFeature(StringRef Feature) const override;
2794 bool handleTargetFeatures(std::vector<std::string> &Features,
2795 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002796 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002797 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2798 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002799 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002800 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002801 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002802 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002803 return "no-mmx";
2804 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002805 }
Craig Topper3164f332014-03-11 03:39:26 +00002806 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002807 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002808
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002809 // Perform any per-CPU checks necessary to determine if this CPU is
2810 // acceptable.
2811 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2812 // invalid without explaining *why*.
2813 switch (CPU) {
2814 case CK_Generic:
2815 // No processor selected!
2816 return false;
2817
2818 case CK_i386:
2819 case CK_i486:
2820 case CK_WinChipC6:
2821 case CK_WinChip2:
2822 case CK_C3:
2823 case CK_i586:
2824 case CK_Pentium:
2825 case CK_PentiumMMX:
2826 case CK_i686:
2827 case CK_PentiumPro:
2828 case CK_Pentium2:
2829 case CK_Pentium3:
2830 case CK_Pentium3M:
2831 case CK_PentiumM:
2832 case CK_Yonah:
2833 case CK_C3_2:
2834 case CK_Pentium4:
2835 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002836 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002837 case CK_Prescott:
2838 case CK_K6:
2839 case CK_K6_2:
2840 case CK_K6_3:
2841 case CK_Athlon:
2842 case CK_AthlonThunderbird:
2843 case CK_Athlon4:
2844 case CK_AthlonXP:
2845 case CK_AthlonMP:
2846 case CK_Geode:
2847 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002848 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002849 return false;
2850
2851 // Fallthrough
2852 case CK_Nocona:
2853 case CK_Core2:
2854 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002855 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002856 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002857 case CK_Nehalem:
2858 case CK_Westmere:
2859 case CK_SandyBridge:
2860 case CK_IvyBridge:
2861 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002862 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002863 case CK_SkylakeClient:
2864 case CK_SkylakeServer:
2865 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002866 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002867 case CK_Athlon64:
2868 case CK_Athlon64SSE3:
2869 case CK_AthlonFX:
2870 case CK_K8:
2871 case CK_K8SSE3:
2872 case CK_Opteron:
2873 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002874 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002875 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002876 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002877 case CK_BDVER1:
2878 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002879 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002880 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002881 case CK_x86_64:
2882 return true;
2883 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002884 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002885 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002886
Craig Topper3164f332014-03-11 03:39:26 +00002887 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002888
Craig Topper3164f332014-03-11 03:39:26 +00002889 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002890 // Most of the non-ARM calling conventions are i386 conventions.
2891 switch (CC) {
2892 case CC_X86ThisCall:
2893 case CC_X86FastCall:
2894 case CC_X86StdCall:
2895 case CC_X86VectorCall:
2896 case CC_C:
2897 case CC_Swift:
2898 case CC_X86Pascal:
2899 case CC_IntelOclBicc:
2900 return CCCR_OK;
2901 default:
2902 return CCCR_Warning;
2903 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002904 }
2905
Craig Topper3164f332014-03-11 03:39:26 +00002906 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002907 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002908 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002909
2910 bool hasSjLjLowering() const override {
2911 return true;
2912 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002913
2914 void setSupportedOpenCLOpts() override {
2915 getSupportedOpenCLOpts().setAll();
2916 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002917};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002918
Rafael Espindolaeb265472013-08-21 21:59:03 +00002919bool X86TargetInfo::setFPMath(StringRef Name) {
2920 if (Name == "387") {
2921 FPMath = FP_387;
2922 return true;
2923 }
2924 if (Name == "sse") {
2925 FPMath = FP_SSE;
2926 return true;
2927 }
2928 return false;
2929}
2930
Eric Christopher007b0a02015-08-28 22:32:01 +00002931bool X86TargetInfo::initFeatureMap(
2932 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002933 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002934 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002935 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002936 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002937 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002938
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002939 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002940
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002941 // Enable X87 for all X86 processors but Lakemont.
2942 if (Kind != CK_Lakemont)
2943 setFeatureEnabledImpl(Features, "x87", true);
2944
2945 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002946 case CK_Generic:
2947 case CK_i386:
2948 case CK_i486:
2949 case CK_i586:
2950 case CK_Pentium:
2951 case CK_i686:
2952 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002953 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002954 break;
2955 case CK_PentiumMMX:
2956 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002957 case CK_K6:
2958 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002959 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002960 break;
2961 case CK_Pentium3:
2962 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002963 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002964 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002965 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002966 break;
2967 case CK_PentiumM:
2968 case CK_Pentium4:
2969 case CK_Pentium4M:
2970 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002971 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002972 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002973 break;
2974 case CK_Yonah:
2975 case CK_Prescott:
2976 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002977 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002978 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002979 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002980 break;
2981 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002982 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002983 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002984 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002985 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002986 break;
2987 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002988 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002989 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002990 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002991 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002992 case CK_Cannonlake:
2993 setFeatureEnabledImpl(Features, "avx512ifma", true);
2994 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2995 setFeatureEnabledImpl(Features, "sha", true);
2996 setFeatureEnabledImpl(Features, "umip", true);
2997 // FALLTHROUGH
2998 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002999 setFeatureEnabledImpl(Features, "avx512f", true);
3000 setFeatureEnabledImpl(Features, "avx512cd", true);
3001 setFeatureEnabledImpl(Features, "avx512dq", true);
3002 setFeatureEnabledImpl(Features, "avx512bw", true);
3003 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003004 setFeatureEnabledImpl(Features, "pku", true);
3005 setFeatureEnabledImpl(Features, "pcommit", true);
3006 setFeatureEnabledImpl(Features, "clwb", true);
3007 // FALLTHROUGH
3008 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003009 setFeatureEnabledImpl(Features, "xsavec", true);
3010 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003011 setFeatureEnabledImpl(Features, "mpx", true);
3012 setFeatureEnabledImpl(Features, "sgx", true);
3013 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003014 // FALLTHROUGH
3015 case CK_Broadwell:
3016 setFeatureEnabledImpl(Features, "rdseed", true);
3017 setFeatureEnabledImpl(Features, "adx", true);
3018 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003019 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003020 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003021 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003022 setFeatureEnabledImpl(Features, "bmi", true);
3023 setFeatureEnabledImpl(Features, "bmi2", true);
3024 setFeatureEnabledImpl(Features, "rtm", true);
3025 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003026 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003027 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003028 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003029 setFeatureEnabledImpl(Features, "rdrnd", true);
3030 setFeatureEnabledImpl(Features, "f16c", true);
3031 setFeatureEnabledImpl(Features, "fsgsbase", true);
3032 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003033 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003034 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003035 setFeatureEnabledImpl(Features, "xsave", true);
3036 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003037 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003038 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003039 case CK_Silvermont:
3040 setFeatureEnabledImpl(Features, "aes", true);
3041 setFeatureEnabledImpl(Features, "pclmul", true);
3042 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003043 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003044 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003045 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003046 setFeatureEnabledImpl(Features, "cx16", true);
3047 break;
3048 case CK_KNL:
3049 setFeatureEnabledImpl(Features, "avx512f", true);
3050 setFeatureEnabledImpl(Features, "avx512cd", true);
3051 setFeatureEnabledImpl(Features, "avx512er", true);
3052 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003053 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003054 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003055 setFeatureEnabledImpl(Features, "rdseed", true);
3056 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003057 setFeatureEnabledImpl(Features, "lzcnt", true);
3058 setFeatureEnabledImpl(Features, "bmi", true);
3059 setFeatureEnabledImpl(Features, "bmi2", true);
3060 setFeatureEnabledImpl(Features, "rtm", true);
3061 setFeatureEnabledImpl(Features, "fma", true);
3062 setFeatureEnabledImpl(Features, "rdrnd", true);
3063 setFeatureEnabledImpl(Features, "f16c", true);
3064 setFeatureEnabledImpl(Features, "fsgsbase", true);
3065 setFeatureEnabledImpl(Features, "aes", true);
3066 setFeatureEnabledImpl(Features, "pclmul", true);
3067 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003068 setFeatureEnabledImpl(Features, "xsaveopt", true);
3069 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003070 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003071 break;
3072 case CK_K6_2:
3073 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003074 case CK_WinChip2:
3075 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003076 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003077 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003078 case CK_Athlon:
3079 case CK_AthlonThunderbird:
3080 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003081 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003082 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003083 case CK_Athlon4:
3084 case CK_AthlonXP:
3085 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003086 setFeatureEnabledImpl(Features, "sse", true);
3087 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003088 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003089 break;
3090 case CK_K8:
3091 case CK_Opteron:
3092 case CK_Athlon64:
3093 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003094 setFeatureEnabledImpl(Features, "sse2", true);
3095 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003096 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003097 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003098 case CK_AMDFAM10:
3099 setFeatureEnabledImpl(Features, "sse4a", true);
3100 setFeatureEnabledImpl(Features, "lzcnt", true);
3101 setFeatureEnabledImpl(Features, "popcnt", true);
3102 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003103 case CK_K8SSE3:
3104 case CK_OpteronSSE3:
3105 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003106 setFeatureEnabledImpl(Features, "sse3", true);
3107 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003108 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003109 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003110 case CK_BTVER2:
3111 setFeatureEnabledImpl(Features, "avx", true);
3112 setFeatureEnabledImpl(Features, "aes", true);
3113 setFeatureEnabledImpl(Features, "pclmul", true);
3114 setFeatureEnabledImpl(Features, "bmi", true);
3115 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003116 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003117 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003118 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003119 setFeatureEnabledImpl(Features, "ssse3", true);
3120 setFeatureEnabledImpl(Features, "sse4a", true);
3121 setFeatureEnabledImpl(Features, "lzcnt", true);
3122 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003123 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003124 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003125 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003126 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003127 case CK_BDVER4:
3128 setFeatureEnabledImpl(Features, "avx2", true);
3129 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003130 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003131 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003132 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003133 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003134 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003135 // FALLTHROUGH
3136 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003137 setFeatureEnabledImpl(Features, "bmi", true);
3138 setFeatureEnabledImpl(Features, "fma", true);
3139 setFeatureEnabledImpl(Features, "f16c", true);
3140 setFeatureEnabledImpl(Features, "tbm", true);
3141 // FALLTHROUGH
3142 case CK_BDVER1:
3143 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003144 setFeatureEnabledImpl(Features, "xop", true);
3145 setFeatureEnabledImpl(Features, "lzcnt", true);
3146 setFeatureEnabledImpl(Features, "aes", true);
3147 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003148 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003149 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003150 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003151 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003152 break;
Eli Friedman33465822011-07-08 23:31:17 +00003153 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003154 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3155 return false;
3156
3157 // Can't do this earlier because we need to be able to explicitly enable
3158 // or disable these features and the things that they depend upon.
3159
3160 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3161 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003162 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003163 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3164 FeaturesVec.end())
3165 Features["popcnt"] = true;
3166
3167 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3168 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003169 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003170 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3171 FeaturesVec.end())
3172 Features["prfchw"] = true;
3173
Eric Christophera7260af2015-10-08 20:10:18 +00003174 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3175 // then enable MMX.
3176 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003177 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003178 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3179 FeaturesVec.end())
3180 Features["mmx"] = true;
3181
Eric Christopherbbd746d2015-10-08 20:10:14 +00003182 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003183}
3184
Rafael Espindolae62e2792013-08-20 13:44:29 +00003185void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003186 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003187 if (Enabled) {
3188 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003189 case AVX512F:
3190 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003191 case AVX2:
3192 Features["avx2"] = true;
3193 case AVX:
3194 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003195 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003196 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003197 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003198 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003199 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003200 case SSSE3:
3201 Features["ssse3"] = true;
3202 case SSE3:
3203 Features["sse3"] = true;
3204 case SSE2:
3205 Features["sse2"] = true;
3206 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003207 Features["sse"] = true;
3208 case NoSSE:
3209 break;
3210 }
3211 return;
3212 }
3213
3214 switch (Level) {
3215 case NoSSE:
3216 case SSE1:
3217 Features["sse"] = false;
3218 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003219 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3220 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003221 case SSE3:
3222 Features["sse3"] = false;
3223 setXOPLevel(Features, NoXOP, false);
3224 case SSSE3:
3225 Features["ssse3"] = false;
3226 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003227 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003228 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003229 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003230 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003231 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3232 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003233 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003234 case AVX2:
3235 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003236 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003237 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003238 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003239 Features["avx512vl"] = Features["avx512vbmi"] =
3240 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003241 }
3242}
3243
3244void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003245 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003246 if (Enabled) {
3247 switch (Level) {
3248 case AMD3DNowAthlon:
3249 Features["3dnowa"] = true;
3250 case AMD3DNow:
3251 Features["3dnow"] = true;
3252 case MMX:
3253 Features["mmx"] = true;
3254 case NoMMX3DNow:
3255 break;
3256 }
3257 return;
3258 }
3259
3260 switch (Level) {
3261 case NoMMX3DNow:
3262 case MMX:
3263 Features["mmx"] = false;
3264 case AMD3DNow:
3265 Features["3dnow"] = false;
3266 case AMD3DNowAthlon:
3267 Features["3dnowa"] = false;
3268 }
3269}
3270
3271void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003272 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003273 if (Enabled) {
3274 switch (Level) {
3275 case XOP:
3276 Features["xop"] = true;
3277 case FMA4:
3278 Features["fma4"] = true;
3279 setSSELevel(Features, AVX, true);
3280 case SSE4A:
3281 Features["sse4a"] = true;
3282 setSSELevel(Features, SSE3, true);
3283 case NoXOP:
3284 break;
3285 }
3286 return;
3287 }
3288
3289 switch (Level) {
3290 case NoXOP:
3291 case SSE4A:
3292 Features["sse4a"] = false;
3293 case FMA4:
3294 Features["fma4"] = false;
3295 case XOP:
3296 Features["xop"] = false;
3297 }
3298}
3299
Craig Topper86d79ef2013-09-17 04:51:29 +00003300void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3301 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003302 // This is a bit of a hack to deal with the sse4 target feature when used
3303 // as part of the target attribute. We handle sse4 correctly everywhere
3304 // else. See below for more information on how we handle the sse4 options.
3305 if (Name != "sse4")
3306 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003307
Craig Topper29561122013-09-19 01:13:07 +00003308 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003309 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003310 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003311 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003312 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003313 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003314 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003315 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003316 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003317 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003318 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003319 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003320 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003321 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003322 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003323 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003324 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003325 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003326 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003327 if (Enabled)
3328 setSSELevel(Features, SSE2, Enabled);
3329 } else if (Name == "pclmul") {
3330 if (Enabled)
3331 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003332 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003333 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003334 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003335 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003336 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003337 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003338 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3339 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3340 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003341 if (Enabled)
3342 setSSELevel(Features, AVX512F, Enabled);
3343 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003344 if (Enabled)
3345 setSSELevel(Features, AVX, Enabled);
3346 } else if (Name == "fma4") {
3347 setXOPLevel(Features, FMA4, Enabled);
3348 } else if (Name == "xop") {
3349 setXOPLevel(Features, XOP, Enabled);
3350 } else if (Name == "sse4a") {
3351 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003352 } else if (Name == "f16c") {
3353 if (Enabled)
3354 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003355 } else if (Name == "sha") {
3356 if (Enabled)
3357 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003358 } else if (Name == "sse4") {
3359 // We can get here via the __target__ attribute since that's not controlled
3360 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3361 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3362 // disabled.
3363 if (Enabled)
3364 setSSELevel(Features, SSE42, Enabled);
3365 else
3366 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003367 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003368 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003369 Features["xsaveopt"] = false;
3370 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003371 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003372 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003373 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003374}
3375
Eric Christopher3ff21b32013-10-16 21:26:26 +00003376/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003377/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003378bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003379 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003380 for (const auto &Feature : Features) {
3381 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003382 continue;
3383
Eric Christopher610fe112015-08-26 08:21:55 +00003384 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003385 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003386 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003387 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003388 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003389 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003390 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003391 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003392 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003393 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003394 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003395 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003396 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003397 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003398 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003399 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003400 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003401 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003402 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003403 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003404 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003405 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003406 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003407 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003408 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003409 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003410 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003411 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003412 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003413 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003414 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003415 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003416 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003417 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003418 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003419 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003420 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003421 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003422 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003423 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003424 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003425 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003426 } else if (Feature == "+avx512vbmi") {
3427 HasAVX512VBMI = true;
3428 } else if (Feature == "+avx512ifma") {
3429 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003430 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003431 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003432 } else if (Feature == "+mpx") {
3433 HasMPX = true;
3434 } else if (Feature == "+movbe") {
3435 HasMOVBE = true;
3436 } else if (Feature == "+sgx") {
3437 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003438 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003439 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003440 } else if (Feature == "+fxsr") {
3441 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003442 } else if (Feature == "+xsave") {
3443 HasXSAVE = true;
3444 } else if (Feature == "+xsaveopt") {
3445 HasXSAVEOPT = true;
3446 } else if (Feature == "+xsavec") {
3447 HasXSAVEC = true;
3448 } else if (Feature == "+xsaves") {
3449 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003450 } else if (Feature == "+mwaitx") {
3451 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003452 } else if (Feature == "+pku") {
3453 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003454 } else if (Feature == "+clflushopt") {
3455 HasCLFLUSHOPT = true;
3456 } else if (Feature == "+pcommit") {
3457 HasPCOMMIT = true;
3458 } else if (Feature == "+clwb") {
3459 HasCLWB = true;
3460 } else if (Feature == "+umip") {
3461 HasUMIP = true;
3462 } else if (Feature == "+prefetchwt1") {
3463 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003464 }
3465
Benjamin Kramer27402c62012-03-05 15:10:44 +00003466 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003467 .Case("+avx512f", AVX512F)
3468 .Case("+avx2", AVX2)
3469 .Case("+avx", AVX)
3470 .Case("+sse4.2", SSE42)
3471 .Case("+sse4.1", SSE41)
3472 .Case("+ssse3", SSSE3)
3473 .Case("+sse3", SSE3)
3474 .Case("+sse2", SSE2)
3475 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003476 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003477 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003478
Eli Friedman33465822011-07-08 23:31:17 +00003479 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003480 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003481 .Case("+3dnowa", AMD3DNowAthlon)
3482 .Case("+3dnow", AMD3DNow)
3483 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003484 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003485 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003486
3487 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003488 .Case("+xop", XOP)
3489 .Case("+fma4", FMA4)
3490 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003491 .Default(NoXOP);
3492 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003493 }
Eli Friedman33465822011-07-08 23:31:17 +00003494
Rafael Espindolaeb265472013-08-21 21:59:03 +00003495 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3496 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003497 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3498 (FPMath == FP_387 && SSELevel >= SSE1)) {
3499 Diags.Report(diag::err_target_unsupported_fpmath) <<
3500 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003501 return false;
3502 }
3503
Alexey Bataev00396512015-07-02 03:40:19 +00003504 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003505 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003506 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003507}
Chris Lattnerecd49032009-03-02 22:27:17 +00003508
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003509/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3510/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003511void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003512 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003513 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003514 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003515 Builder.defineMacro("__amd64__");
3516 Builder.defineMacro("__amd64");
3517 Builder.defineMacro("__x86_64");
3518 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003519 if (getTriple().getArchName() == "x86_64h") {
3520 Builder.defineMacro("__x86_64h");
3521 Builder.defineMacro("__x86_64h__");
3522 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003523 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003524 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003525 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003526
Chris Lattnerecd49032009-03-02 22:27:17 +00003527 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003528 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3529 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003530 switch (CPU) {
3531 case CK_Generic:
3532 break;
3533 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003534 // The rest are coming from the i386 define above.
3535 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003536 break;
3537 case CK_i486:
3538 case CK_WinChipC6:
3539 case CK_WinChip2:
3540 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003541 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003542 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003543 case CK_PentiumMMX:
3544 Builder.defineMacro("__pentium_mmx__");
3545 Builder.defineMacro("__tune_pentium_mmx__");
3546 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003547 case CK_i586:
3548 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003549 defineCPUMacros(Builder, "i586");
3550 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003551 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003552 case CK_Pentium3:
3553 case CK_Pentium3M:
3554 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003555 Builder.defineMacro("__tune_pentium3__");
3556 // Fallthrough
3557 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003558 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003559 Builder.defineMacro("__tune_pentium2__");
3560 // Fallthrough
3561 case CK_PentiumPro:
3562 Builder.defineMacro("__tune_i686__");
3563 Builder.defineMacro("__tune_pentiumpro__");
3564 // Fallthrough
3565 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003566 Builder.defineMacro("__i686");
3567 Builder.defineMacro("__i686__");
3568 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3569 Builder.defineMacro("__pentiumpro");
3570 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003571 break;
3572 case CK_Pentium4:
3573 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003574 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003575 break;
3576 case CK_Yonah:
3577 case CK_Prescott:
3578 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003579 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003580 break;
3581 case CK_Core2:
3582 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003583 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003584 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003585 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003586 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003587 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003588 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003589 defineCPUMacros(Builder, "slm");
3590 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003591 case CK_Nehalem:
3592 case CK_Westmere:
3593 case CK_SandyBridge:
3594 case CK_IvyBridge:
3595 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003596 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003597 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003598 // FIXME: Historically, we defined this legacy name, it would be nice to
3599 // remove it at some point. We've never exposed fine-grained names for
3600 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003601 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003602 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003603 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003604 defineCPUMacros(Builder, "skx");
3605 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003606 case CK_Cannonlake:
3607 break;
Craig Topper449314e2013-08-20 07:09:39 +00003608 case CK_KNL:
3609 defineCPUMacros(Builder, "knl");
3610 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003611 case CK_Lakemont:
3612 Builder.defineMacro("__tune_lakemont__");
3613 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003614 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003615 Builder.defineMacro("__k6_2__");
3616 Builder.defineMacro("__tune_k6_2__");
3617 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003618 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003619 if (CPU != CK_K6_2) { // In case of fallthrough
3620 // FIXME: GCC may be enabling these in cases where some other k6
3621 // architecture is specified but -m3dnow is explicitly provided. The
3622 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003623 Builder.defineMacro("__k6_3__");
3624 Builder.defineMacro("__tune_k6_3__");
3625 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003626 // Fallthrough
3627 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003628 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003629 break;
3630 case CK_Athlon:
3631 case CK_AthlonThunderbird:
3632 case CK_Athlon4:
3633 case CK_AthlonXP:
3634 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003635 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003636 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003637 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003638 Builder.defineMacro("__tune_athlon_sse__");
3639 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003640 break;
3641 case CK_K8:
3642 case CK_K8SSE3:
3643 case CK_x86_64:
3644 case CK_Opteron:
3645 case CK_OpteronSSE3:
3646 case CK_Athlon64:
3647 case CK_Athlon64SSE3:
3648 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003649 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003650 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003651 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003652 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003653 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003654 case CK_BTVER1:
3655 defineCPUMacros(Builder, "btver1");
3656 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003657 case CK_BTVER2:
3658 defineCPUMacros(Builder, "btver2");
3659 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003660 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003661 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003662 break;
3663 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003664 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003665 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003666 case CK_BDVER3:
3667 defineCPUMacros(Builder, "bdver3");
3668 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003669 case CK_BDVER4:
3670 defineCPUMacros(Builder, "bdver4");
3671 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003672 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003673 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003674 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003675 }
Chris Lattner96e43572009-03-02 22:40:39 +00003676
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003677 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003678 Builder.defineMacro("__REGISTER_PREFIX__", "");
3679
Chris Lattner6df41af2009-04-19 17:32:33 +00003680 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3681 // functions in glibc header files that use FP Stack inline asm which the
3682 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003683 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003684
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003685 if (HasAES)
3686 Builder.defineMacro("__AES__");
3687
Craig Topper3f122a72012-05-31 05:18:48 +00003688 if (HasPCLMUL)
3689 Builder.defineMacro("__PCLMUL__");
3690
Craig Topper22967d42011-12-25 05:06:45 +00003691 if (HasLZCNT)
3692 Builder.defineMacro("__LZCNT__");
3693
Benjamin Kramer1e250392012-07-07 09:39:18 +00003694 if (HasRDRND)
3695 Builder.defineMacro("__RDRND__");
3696
Craig Topper8c7f2512014-11-03 06:51:41 +00003697 if (HasFSGSBASE)
3698 Builder.defineMacro("__FSGSBASE__");
3699
Craig Topper22967d42011-12-25 05:06:45 +00003700 if (HasBMI)
3701 Builder.defineMacro("__BMI__");
3702
3703 if (HasBMI2)
3704 Builder.defineMacro("__BMI2__");
3705
Craig Topper1de83482011-12-29 16:10:46 +00003706 if (HasPOPCNT)
3707 Builder.defineMacro("__POPCNT__");
3708
Michael Liao625a8752012-11-10 05:17:46 +00003709 if (HasRTM)
3710 Builder.defineMacro("__RTM__");
3711
Michael Liao74f4eaf2013-03-26 17:52:08 +00003712 if (HasPRFCHW)
3713 Builder.defineMacro("__PRFCHW__");
3714
Michael Liaoffaae352013-03-29 05:17:55 +00003715 if (HasRDSEED)
3716 Builder.defineMacro("__RDSEED__");
3717
Robert Khasanov50e6f582014-09-19 09:53:48 +00003718 if (HasADX)
3719 Builder.defineMacro("__ADX__");
3720
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003721 if (HasTBM)
3722 Builder.defineMacro("__TBM__");
3723
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003724 if (HasMWAITX)
3725 Builder.defineMacro("__MWAITX__");
3726
Rafael Espindolae62e2792013-08-20 13:44:29 +00003727 switch (XOPLevel) {
3728 case XOP:
3729 Builder.defineMacro("__XOP__");
3730 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003731 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003732 case SSE4A:
3733 Builder.defineMacro("__SSE4A__");
3734 case NoXOP:
3735 break;
3736 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003737
Craig Topperbba778b2012-06-03 21:46:30 +00003738 if (HasFMA)
3739 Builder.defineMacro("__FMA__");
3740
Manman Rena45358c2012-10-11 00:59:55 +00003741 if (HasF16C)
3742 Builder.defineMacro("__F16C__");
3743
Craig Topper679b53a2013-08-21 05:29:10 +00003744 if (HasAVX512CD)
3745 Builder.defineMacro("__AVX512CD__");
3746 if (HasAVX512ER)
3747 Builder.defineMacro("__AVX512ER__");
3748 if (HasAVX512PF)
3749 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003750 if (HasAVX512DQ)
3751 Builder.defineMacro("__AVX512DQ__");
3752 if (HasAVX512BW)
3753 Builder.defineMacro("__AVX512BW__");
3754 if (HasAVX512VL)
3755 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003756 if (HasAVX512VBMI)
3757 Builder.defineMacro("__AVX512VBMI__");
3758 if (HasAVX512IFMA)
3759 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003760
Ben Langmuir58078d02013-09-19 13:22:04 +00003761 if (HasSHA)
3762 Builder.defineMacro("__SHA__");
3763
Craig Toppere33f51f2015-10-16 06:22:36 +00003764 if (HasFXSR)
3765 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003766 if (HasXSAVE)
3767 Builder.defineMacro("__XSAVE__");
3768 if (HasXSAVEOPT)
3769 Builder.defineMacro("__XSAVEOPT__");
3770 if (HasXSAVEC)
3771 Builder.defineMacro("__XSAVEC__");
3772 if (HasXSAVES)
3773 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003774 if (HasPKU)
3775 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003776 if (HasCX16)
3777 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3778
Chris Lattner96e43572009-03-02 22:40:39 +00003779 // Each case falls through to the previous one here.
3780 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003781 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003782 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003783 case AVX2:
3784 Builder.defineMacro("__AVX2__");
3785 case AVX:
3786 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003787 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003788 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003789 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003790 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003791 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003792 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003793 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003794 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003795 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003796 Builder.defineMacro("__SSE2__");
3797 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003798 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003799 Builder.defineMacro("__SSE__");
3800 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003801 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003802 break;
3803 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003804
Derek Schuffc7dd7222012-10-11 15:52:22 +00003805 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003806 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003807 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003808 case AVX2:
3809 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003810 case SSE42:
3811 case SSE41:
3812 case SSSE3:
3813 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003814 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003815 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003816 break;
3817 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003818 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003819 break;
3820 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003821 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003822 }
3823 }
3824
Anders Carlssone437c682010-01-27 03:47:49 +00003825 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003826 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003827 case AMD3DNowAthlon:
3828 Builder.defineMacro("__3dNOW_A__");
3829 case AMD3DNow:
3830 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003831 case MMX:
3832 Builder.defineMacro("__MMX__");
3833 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003834 break;
3835 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003836
3837 if (CPU >= CK_i486) {
3838 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3839 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3840 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3841 }
3842 if (CPU >= CK_i586)
3843 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003844}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003845
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003846bool X86TargetInfo::hasFeature(StringRef Feature) const {
3847 return llvm::StringSwitch<bool>(Feature)
3848 .Case("aes", HasAES)
3849 .Case("avx", SSELevel >= AVX)
3850 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003851 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003852 .Case("avx512cd", HasAVX512CD)
3853 .Case("avx512er", HasAVX512ER)
3854 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003855 .Case("avx512dq", HasAVX512DQ)
3856 .Case("avx512bw", HasAVX512BW)
3857 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003858 .Case("avx512vbmi", HasAVX512VBMI)
3859 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003860 .Case("bmi", HasBMI)
3861 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003862 .Case("clflushopt", HasCLFLUSHOPT)
3863 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003864 .Case("cx16", HasCX16)
3865 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003866 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003867 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003868 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003869 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003870 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003871 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3872 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3873 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003874 .Case("movbe", HasMOVBE)
3875 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003876 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003877 .Case("pcommit", HasPCOMMIT)
3878 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003879 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003880 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003881 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003882 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003883 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003884 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003885 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003886 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003887 .Case("sse", SSELevel >= SSE1)
3888 .Case("sse2", SSELevel >= SSE2)
3889 .Case("sse3", SSELevel >= SSE3)
3890 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003891 .Case("sse4.1", SSELevel >= SSE41)
3892 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003893 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003894 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003895 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003896 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003897 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3898 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003899 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003900 .Case("xsave", HasXSAVE)
3901 .Case("xsavec", HasXSAVEC)
3902 .Case("xsaves", HasXSAVES)
3903 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003904 .Default(false);
3905}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003906
Eric Christopherd9832702015-06-29 21:00:05 +00003907// We can't use a generic validation scheme for the features accepted here
3908// versus subtarget features accepted in the target attribute because the
3909// bitfield structure that's initialized in the runtime only supports the
3910// below currently rather than the full range of subtarget features. (See
3911// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3912bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3913 return llvm::StringSwitch<bool>(FeatureStr)
3914 .Case("cmov", true)
3915 .Case("mmx", true)
3916 .Case("popcnt", true)
3917 .Case("sse", true)
3918 .Case("sse2", true)
3919 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003920 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003921 .Case("sse4.1", true)
3922 .Case("sse4.2", true)
3923 .Case("avx", true)
3924 .Case("avx2", true)
3925 .Case("sse4a", true)
3926 .Case("fma4", true)
3927 .Case("xop", true)
3928 .Case("fma", true)
3929 .Case("avx512f", true)
3930 .Case("bmi", true)
3931 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003932 .Case("aes", true)
3933 .Case("pclmul", true)
3934 .Case("avx512vl", true)
3935 .Case("avx512bw", true)
3936 .Case("avx512dq", true)
3937 .Case("avx512cd", true)
3938 .Case("avx512er", true)
3939 .Case("avx512pf", true)
3940 .Case("avx512vbmi", true)
3941 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003942 .Default(false);
3943}
3944
Eli Friedman3fd920a2008-08-20 02:34:37 +00003945bool
Anders Carlsson58436352009-02-28 17:11:49 +00003946X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003947 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003948 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003949 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003950 // Constant constraints.
3951 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3952 // instructions.
3953 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3954 // x86_64 instructions.
3955 case 's':
3956 Info.setRequiresImmediate();
3957 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003958 case 'I':
3959 Info.setRequiresImmediate(0, 31);
3960 return true;
3961 case 'J':
3962 Info.setRequiresImmediate(0, 63);
3963 return true;
3964 case 'K':
3965 Info.setRequiresImmediate(-128, 127);
3966 return true;
3967 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003968 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003969 return true;
3970 case 'M':
3971 Info.setRequiresImmediate(0, 3);
3972 return true;
3973 case 'N':
3974 Info.setRequiresImmediate(0, 255);
3975 return true;
3976 case 'O':
3977 Info.setRequiresImmediate(0, 127);
3978 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003979 // Register constraints.
3980 case 'Y': // 'Y' is the first character for several 2-character constraints.
3981 // Shift the pointer to the second character of the constraint.
3982 Name++;
3983 switch (*Name) {
3984 default:
3985 return false;
3986 case '0': // First SSE register.
3987 case 't': // Any SSE register, when SSE2 is enabled.
3988 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3989 case 'm': // Any MMX register, when inter-unit moves enabled.
3990 Info.setAllowsRegister();
3991 return true;
3992 }
3993 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003994 // Constraint 'f' cannot be used for output operands.
3995 if (Info.ConstraintStr[0] == '=')
3996 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003997 Info.setAllowsRegister();
3998 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003999 case 'a': // eax.
4000 case 'b': // ebx.
4001 case 'c': // ecx.
4002 case 'd': // edx.
4003 case 'S': // esi.
4004 case 'D': // edi.
4005 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004006 case 't': // Top of floating point stack.
4007 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004008 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004009 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004010 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004011 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004012 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4013 case 'l': // "Index" registers: any general register that can be used as an
4014 // index in a base+index memory access.
4015 Info.setAllowsRegister();
4016 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004017 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004018 case 'C': // SSE floating point constant.
4019 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004020 return true;
4021 }
4022}
4023
Akira Hatanaka974131e2014-09-18 18:17:18 +00004024bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4025 unsigned Size) const {
4026 // Strip off constraint modifiers.
4027 while (Constraint[0] == '=' ||
4028 Constraint[0] == '+' ||
4029 Constraint[0] == '&')
4030 Constraint = Constraint.substr(1);
4031
4032 return validateOperandSize(Constraint, Size);
4033}
4034
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004035bool X86TargetInfo::validateInputSize(StringRef Constraint,
4036 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004037 return validateOperandSize(Constraint, Size);
4038}
4039
4040bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4041 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004042 switch (Constraint[0]) {
4043 default: break;
4044 case 'y':
4045 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004046 case 'f':
4047 case 't':
4048 case 'u':
4049 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00004050 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004051 if (SSELevel >= AVX512F)
4052 // 512-bit zmm registers can be used if target supports AVX512F.
4053 return Size <= 512U;
4054 else if (SSELevel >= AVX)
4055 // 256-bit ymm registers can be used if target supports AVX.
4056 return Size <= 256U;
4057 return Size <= 128U;
4058 case 'Y':
4059 // 'Y' is the first character for several 2-character constraints.
4060 switch (Constraint[1]) {
4061 default: break;
4062 case 'm':
4063 // 'Ym' is synonymous with 'y'.
4064 return Size <= 64;
4065 case 'i':
4066 case 't':
4067 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4068 if (SSELevel >= AVX512F)
4069 return Size <= 512U;
4070 else if (SSELevel >= AVX)
4071 return Size <= 256U;
4072 return SSELevel >= SSE2 && Size <= 128U;
4073 }
4074
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004075 }
4076
4077 return true;
4078}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004079
Eli Friedman3fd920a2008-08-20 02:34:37 +00004080std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004081X86TargetInfo::convertConstraint(const char *&Constraint) const {
4082 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004083 case 'a': return std::string("{ax}");
4084 case 'b': return std::string("{bx}");
4085 case 'c': return std::string("{cx}");
4086 case 'd': return std::string("{dx}");
4087 case 'S': return std::string("{si}");
4088 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004089 case 'p': // address
4090 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004091 case 't': // top of floating point stack.
4092 return std::string("{st}");
4093 case 'u': // second from top of floating point stack.
4094 return std::string("{st(1)}"); // second from top of floating point stack.
4095 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004096 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004097 }
4098}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004099
Eli Friedman3fd920a2008-08-20 02:34:37 +00004100// X86-32 generic target
4101class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004102public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004103 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4104 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004105 DoubleAlign = LongLongAlign = 32;
4106 LongDoubleWidth = 96;
4107 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004108 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004109 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004110 SizeType = UnsignedInt;
4111 PtrDiffType = SignedInt;
4112 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004113 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004114
4115 // Use fpret for all types.
4116 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4117 (1 << TargetInfo::Double) |
4118 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004119
4120 // x86-32 has atomics up to 8 bytes
4121 // FIXME: Check that we actually have cmpxchg8b before setting
4122 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4123 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004124 }
Craig Topper3164f332014-03-11 03:39:26 +00004125 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004126 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004127 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004128
Craig Topper3164f332014-03-11 03:39:26 +00004129 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004130 if (RegNo == 0) return 0;
4131 if (RegNo == 1) return 2;
4132 return -1;
4133 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004134 bool validateOperandSize(StringRef Constraint,
4135 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004136 switch (Constraint[0]) {
4137 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004138 case 'R':
4139 case 'q':
4140 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004141 case 'a':
4142 case 'b':
4143 case 'c':
4144 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004145 case 'S':
4146 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004147 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004148 case 'A':
4149 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004150 }
4151
Akira Hatanaka974131e2014-09-18 18:17:18 +00004152 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004153 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004154 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4155 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4156 Builtin::FirstTSBuiltin + 1);
4157 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004158};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004159
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004160class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4161public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004162 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4163 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004164
Craig Topper3164f332014-03-11 03:39:26 +00004165 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004166 unsigned Major, Minor, Micro;
4167 getTriple().getOSVersion(Major, Minor, Micro);
4168 // New NetBSD uses the default rounding mode.
4169 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4170 return X86_32TargetInfo::getFloatEvalMethod();
4171 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004172 return 1;
4173 }
4174};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004175
Eli Friedmane3aa4542009-07-05 18:47:56 +00004176class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4177public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004178 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4179 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004180 SizeType = UnsignedLong;
4181 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004182 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004183 }
4184};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004185
Eli Friedman9fa28852012-08-08 23:57:20 +00004186class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4187public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004188 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4189 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004190 SizeType = UnsignedLong;
4191 IntPtrType = SignedLong;
4192 PtrDiffType = SignedLong;
4193 }
4194};
Eli Friedman9fa28852012-08-08 23:57:20 +00004195
Torok Edwinb2b37c62009-06-30 17:10:35 +00004196class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004197public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004198 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4199 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004200 LongDoubleWidth = 128;
4201 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004202 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004203 MaxVectorAlign = 256;
4204 // The watchOS simulator uses the builtin bool type for Objective-C.
4205 llvm::Triple T = llvm::Triple(Triple);
4206 if (T.isWatchOS())
4207 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004208 SizeType = UnsignedLong;
4209 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004210 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004211 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004212 }
4213
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004214 bool handleTargetFeatures(std::vector<std::string> &Features,
4215 DiagnosticsEngine &Diags) override {
4216 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4217 Diags))
4218 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004219 // We now know the features we have: we can decide how to align vectors.
4220 MaxVectorAlign =
4221 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004222 return true;
4223 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004224};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004225
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004226// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004227class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004228public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004229 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4230 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004231 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004232 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004233 bool IsWinCOFF =
4234 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004235 resetDataLayout(IsWinCOFF
4236 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4237 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004238 }
Craig Topper3164f332014-03-11 03:39:26 +00004239 void getTargetDefines(const LangOptions &Opts,
4240 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004241 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4242 }
4243};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004244
4245// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004246class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004247public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004248 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4249 const TargetOptions &Opts)
4250 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004251 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004252 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4253 }
Craig Topper3164f332014-03-11 03:39:26 +00004254 void getTargetDefines(const LangOptions &Opts,
4255 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004256 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4257 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4258 // The value of the following reflects processor type.
4259 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4260 // We lost the original triple, so we use the default.
4261 Builder.defineMacro("_M_IX86", "600");
4262 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004263};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004264
David Majnemerae1ed0e2015-05-28 04:36:18 +00004265static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004266 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4267 // supports __declspec natively under -fms-extensions, but we define a no-op
4268 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004269 if (Opts.MicrosoftExt)
4270 Builder.defineMacro("__declspec", "__declspec");
4271 else
4272 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4273
4274 if (!Opts.MicrosoftExt) {
4275 // Provide macros for all the calling convention keywords. Provide both
4276 // single and double underscore prefixed variants. These are available on
4277 // x64 as well as x86, even though they have no effect.
4278 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4279 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004280 std::string GCCSpelling = "__attribute__((__";
4281 GCCSpelling += CC;
4282 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004283 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4284 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4285 }
4286 }
4287}
4288
David Majnemerae1ed0e2015-05-28 04:36:18 +00004289static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4290 Builder.defineMacro("__MSVCRT__");
4291 Builder.defineMacro("__MINGW32__");
4292 addCygMingDefines(Opts, Builder);
4293}
4294
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004295// x86-32 MinGW target
4296class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4297public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004298 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4299 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004300 void getTargetDefines(const LangOptions &Opts,
4301 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004302 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004303 DefineStd(Builder, "WIN32", Opts);
4304 DefineStd(Builder, "WINNT", Opts);
4305 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004306 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004307 }
4308};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004309
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004310// x86-32 Cygwin target
4311class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4312public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004313 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4314 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004315 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004316 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004317 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 +00004318 }
Craig Topper3164f332014-03-11 03:39:26 +00004319 void getTargetDefines(const LangOptions &Opts,
4320 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004321 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004322 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004323 Builder.defineMacro("__CYGWIN__");
4324 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004325 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004326 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004327 if (Opts.CPlusPlus)
4328 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004329 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004330};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004331
Chris Lattnerb986aba2010-04-11 19:29:39 +00004332// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004333class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004334public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004335 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004336 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004337 }
Craig Topper3164f332014-03-11 03:39:26 +00004338 void getTargetDefines(const LangOptions &Opts,
4339 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004340 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004341 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004342 }
4343};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004344
Alexey Bataevc99b0492015-11-25 09:24:26 +00004345// X86-32 MCU target
4346class MCUX86_32TargetInfo : public X86_32TargetInfo {
4347public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004348 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4349 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004350 LongDoubleWidth = 64;
4351 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004352 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 +00004353 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004354 }
4355
4356 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4357 // On MCU we support only C calling convention.
4358 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4359 }
4360
4361 void getTargetDefines(const LangOptions &Opts,
4362 MacroBuilder &Builder) const override {
4363 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4364 Builder.defineMacro("__iamcu");
4365 Builder.defineMacro("__iamcu__");
4366 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004367
4368 bool allowsLargerPreferedTypeAlignment() const override {
4369 return false;
4370 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004371};
4372
Douglas Gregor9fabd852011-07-01 22:41:14 +00004373// RTEMS Target
4374template<typename Target>
4375class RTEMSTargetInfo : public OSTargetInfo<Target> {
4376protected:
Craig Topper3164f332014-03-11 03:39:26 +00004377 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4378 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004379 // RTEMS defines; list based off of gcc output
4380
Douglas Gregor9fabd852011-07-01 22:41:14 +00004381 Builder.defineMacro("__rtems__");
4382 Builder.defineMacro("__ELF__");
4383 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004384
Douglas Gregor9fabd852011-07-01 22:41:14 +00004385public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004386 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4387 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004388 switch (Triple.getArch()) {
4389 default:
4390 case llvm::Triple::x86:
4391 // this->MCountName = ".mcount";
4392 break;
4393 case llvm::Triple::mips:
4394 case llvm::Triple::mipsel:
4395 case llvm::Triple::ppc:
4396 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004397 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004398 // this->MCountName = "_mcount";
4399 break;
4400 case llvm::Triple::arm:
4401 // this->MCountName = "__mcount";
4402 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004403 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004404 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004405};
4406
Douglas Gregor9fabd852011-07-01 22:41:14 +00004407// x86-32 RTEMS target
4408class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4409public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004410 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4411 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004412 SizeType = UnsignedLong;
4413 IntPtrType = SignedLong;
4414 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004415 }
Craig Topper3164f332014-03-11 03:39:26 +00004416 void getTargetDefines(const LangOptions &Opts,
4417 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004418 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4419 Builder.defineMacro("__INTEL__");
4420 Builder.defineMacro("__rtems__");
4421 }
4422};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004423
Eli Friedman3fd920a2008-08-20 02:34:37 +00004424// x86-64 generic target
4425class X86_64TargetInfo : public X86TargetInfo {
4426public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004427 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4428 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004429 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004430 bool IsWinCOFF =
4431 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004432 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004433 LongDoubleWidth = 128;
4434 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004435 LargeArrayMinWidth = 128;
4436 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004437 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004438 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4439 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4440 IntPtrType = IsX32 ? SignedInt : SignedLong;
4441 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004442 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004443 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004444
Eric Christopher917e9522014-11-18 22:36:15 +00004445 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004446 resetDataLayout(IsX32
4447 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4448 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4449 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004450
4451 // Use fpret only for long double.
4452 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004453
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004454 // Use fp2ret for _Complex long double.
4455 ComplexLongDoubleUsesFP2Ret = true;
4456
Charles Davisc7d5c942015-09-17 20:55:33 +00004457 // Make __builtin_ms_va_list available.
4458 HasBuiltinMSVaList = true;
4459
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004460 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004461 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004462 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004463 }
Craig Topper3164f332014-03-11 03:39:26 +00004464 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004465 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004466 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004467
Craig Topper3164f332014-03-11 03:39:26 +00004468 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004469 if (RegNo == 0) return 0;
4470 if (RegNo == 1) return 1;
4471 return -1;
4472 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004473
Craig Topper3164f332014-03-11 03:39:26 +00004474 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004475 switch (CC) {
4476 case CC_C:
4477 case CC_Swift:
4478 case CC_X86VectorCall:
4479 case CC_IntelOclBicc:
4480 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004481 case CC_PreserveMost:
4482 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004483 return CCCR_OK;
4484 default:
4485 return CCCR_Warning;
4486 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004487 }
4488
Craig Topper3164f332014-03-11 03:39:26 +00004489 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004490 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004491 }
4492
Pavel Chupinfd223e12014-08-04 12:39:43 +00004493 // for x32 we need it here explicitly
4494 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004495 unsigned getUnwindWordWidth() const override { return 64; }
4496 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004497
4498 bool validateGlobalRegisterVariable(StringRef RegName,
4499 unsigned RegSize,
4500 bool &HasSizeMismatch) const override {
4501 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4502 // handle.
4503 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4504 // Check that the register size is 64-bit.
4505 HasSizeMismatch = RegSize != 64;
4506 return true;
4507 }
4508
4509 // Check if the register is a 32-bit register the backend can handle.
4510 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4511 HasSizeMismatch);
4512 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004513 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4514 return llvm::makeArrayRef(BuiltinInfoX86,
4515 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4516 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004517};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004518
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004519// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004520class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004521public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004522 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4523 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004524 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004525 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004526 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004527 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004528 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004529 SizeType = UnsignedLongLong;
4530 PtrDiffType = SignedLongLong;
4531 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004532 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004533
Craig Topper3164f332014-03-11 03:39:26 +00004534 void getTargetDefines(const LangOptions &Opts,
4535 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004536 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004537 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004538 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004539
Craig Topper3164f332014-03-11 03:39:26 +00004540 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004541 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004542 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004543
Craig Topper3164f332014-03-11 03:39:26 +00004544 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004545 switch (CC) {
4546 case CC_X86StdCall:
4547 case CC_X86ThisCall:
4548 case CC_X86FastCall:
4549 return CCCR_Ignore;
4550 case CC_C:
4551 case CC_X86VectorCall:
4552 case CC_IntelOclBicc:
4553 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004554 case CC_Swift:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004555 return CCCR_OK;
4556 default:
4557 return CCCR_Warning;
4558 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004559 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004560};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004561
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004562// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004563class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004564public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004565 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4566 const TargetOptions &Opts)
4567 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004568 LongDoubleWidth = LongDoubleAlign = 64;
4569 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004570 }
Craig Topper3164f332014-03-11 03:39:26 +00004571 void getTargetDefines(const LangOptions &Opts,
4572 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004573 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4574 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004575 Builder.defineMacro("_M_X64", "100");
4576 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004577 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004578};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004579
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004580// x86-64 MinGW target
4581class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4582public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004583 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4584 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004585 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4586 // with x86 FP ops. Weird.
4587 LongDoubleWidth = LongDoubleAlign = 128;
4588 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4589 }
4590
Craig Topper3164f332014-03-11 03:39:26 +00004591 void getTargetDefines(const LangOptions &Opts,
4592 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004593 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004594 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004595 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004596 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004597
4598 // GCC defines this macro when it is using __gxx_personality_seh0.
4599 if (!Opts.SjLjExceptions)
4600 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004601 }
4602};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004603
Yaron Kerend030d112015-07-22 17:38:19 +00004604// x86-64 Cygwin target
4605class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4606public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004607 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4608 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004609 TLSSupported = false;
4610 WCharType = UnsignedShort;
4611 }
4612 void getTargetDefines(const LangOptions &Opts,
4613 MacroBuilder &Builder) const override {
4614 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4615 Builder.defineMacro("__x86_64__");
4616 Builder.defineMacro("__CYGWIN__");
4617 Builder.defineMacro("__CYGWIN64__");
4618 addCygMingDefines(Opts, Builder);
4619 DefineStd(Builder, "unix", Opts);
4620 if (Opts.CPlusPlus)
4621 Builder.defineMacro("_GNU_SOURCE");
4622
4623 // GCC defines this macro when it is using __gxx_personality_seh0.
4624 if (!Opts.SjLjExceptions)
4625 Builder.defineMacro("__SEH__");
4626 }
4627};
4628
Eli Friedman2857ccb2009-07-01 03:36:11 +00004629class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4630public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004631 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4632 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004633 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004634 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4635 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004636 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004637 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004638 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004639 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004640
4641 bool handleTargetFeatures(std::vector<std::string> &Features,
4642 DiagnosticsEngine &Diags) override {
4643 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4644 Diags))
4645 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004646 // We now know the features we have: we can decide how to align vectors.
4647 MaxVectorAlign =
4648 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004649 return true;
4650 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004651};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004652
Eli Friedman245f2292009-07-05 22:31:18 +00004653class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4654public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004655 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4656 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004657 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004658 Int64Type = SignedLongLong;
4659 }
4660};
Eli Friedman245f2292009-07-05 22:31:18 +00004661
Eli Friedman9fa28852012-08-08 23:57:20 +00004662class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4663public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004664 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4665 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004666 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004667 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004668 }
4669};
Tim Northover9bb857a2013-01-31 12:13:10 +00004670
Eli Friedmanf05b7722008-08-20 07:44:10 +00004671class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004672 // Possible FPU choices.
4673 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004674 VFP2FPU = (1 << 0),
4675 VFP3FPU = (1 << 1),
4676 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004677 NeonFPU = (1 << 3),
4678 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004679 };
4680
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004681 // Possible HWDiv features.
4682 enum HWDivMode {
4683 HWDivThumb = (1 << 0),
4684 HWDivARM = (1 << 1)
4685 };
4686
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004687 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004688 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004689 }
4690
4691 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4692 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004693
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004694 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004695
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004696 StringRef CPUProfile;
4697 StringRef CPUAttr;
4698
Rafael Espindolaeb265472013-08-21 21:59:03 +00004699 enum {
4700 FP_Default,
4701 FP_VFP,
4702 FP_Neon
4703 } FPMath;
4704
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004705 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004706 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004707 unsigned ArchProfile;
4708 unsigned ArchVersion;
4709
Bernard Ogdenda13af32013-10-24 18:32:51 +00004710 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004711
Logan Chien57086ce2012-10-10 06:56:20 +00004712 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004713 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004714
4715 // Initialized via features.
4716 unsigned SoftFloat : 1;
4717 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004718
Bernard Ogden18b57012013-10-29 09:47:51 +00004719 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004720 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004721 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004722 unsigned Unaligned : 1;
4723
4724 enum {
4725 LDREX_B = (1 << 0), /// byte (8-bit)
4726 LDREX_H = (1 << 1), /// half (16-bit)
4727 LDREX_W = (1 << 2), /// word (32-bit)
4728 LDREX_D = (1 << 3), /// double (64-bit)
4729 };
4730
4731 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004732
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004733 // ACLE 6.5.1 Hardware floating point
4734 enum {
4735 HW_FP_HP = (1 << 1), /// half (16-bit)
4736 HW_FP_SP = (1 << 2), /// single (32-bit)
4737 HW_FP_DP = (1 << 3), /// double (64-bit)
4738 };
4739 uint32_t HW_FP;
4740
Chris Lattner5cc15e02010-03-03 19:03:45 +00004741 static const Builtin::Info BuiltinInfo[];
4742
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004743 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004744 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004745
4746 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004747 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004748
Renato Golin0201a9e2016-09-22 19:28:20 +00004749 // size_t is unsigned long on MachO-derived environments, NetBSD,
4750 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004751 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004752 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004753 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004754 SizeType = UnsignedLong;
4755 else
4756 SizeType = UnsignedInt;
4757
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004758 switch (T.getOS()) {
4759 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004760 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004761 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004762 break;
4763 case llvm::Triple::Win32:
4764 WCharType = UnsignedShort;
4765 break;
4766 case llvm::Triple::Linux:
4767 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004768 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4769 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004770 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004771 }
4772
4773 UseBitFieldTypeAlignment = true;
4774
4775 ZeroLengthBitfieldBoundary = 0;
4776
Tim Northover147cd2f2014-10-14 22:12:21 +00004777 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4778 // so set preferred for small types to 32.
4779 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004780 resetDataLayout(BigEndian
4781 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4782 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004783 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004784 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004785 resetDataLayout("e"
4786 "-m:w"
4787 "-p:32:32"
4788 "-i64:64"
4789 "-v128:64:128"
4790 "-a:0:32"
4791 "-n32"
4792 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004793 } else if (T.isOSNaCl()) {
4794 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004795 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004796 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004797 resetDataLayout(BigEndian
4798 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4799 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004800 }
4801
4802 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004803 }
4804
Tim Northover5627d392015-10-30 16:30:45 +00004805 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004806 const llvm::Triple &T = getTriple();
4807
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004808 IsAAPCS = false;
4809
Tim Northover5627d392015-10-30 16:30:45 +00004810 if (IsAAPCS16)
4811 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4812 else
4813 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004814
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004815 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004816 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004817 SizeType = UnsignedInt;
4818 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004819 SizeType = UnsignedLong;
4820
4821 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4822 WCharType = SignedInt;
4823
4824 // Do not respect the alignment of bit-field types when laying out
4825 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4826 UseBitFieldTypeAlignment = false;
4827
4828 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4829 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4830 /// gcc.
4831 ZeroLengthBitfieldBoundary = 32;
4832
Tim Northover5627d392015-10-30 16:30:45 +00004833 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4834 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004835 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004836 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004837 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004838 BigEndian
4839 ? "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 +00004840 : "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 +00004841 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004842 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004843 BigEndian
4844 ? "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 +00004845 : "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 +00004846
4847 // FIXME: Override "preferred align" for double and long long.
4848 }
4849
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004850 void setArchInfo() {
4851 StringRef ArchName = getTriple().getArchName();
4852
Renato Goline84b0002015-10-08 16:43:26 +00004853 ArchISA = llvm::ARM::parseArchISA(ArchName);
4854 CPU = llvm::ARM::getDefaultCPU(ArchName);
4855 unsigned AK = llvm::ARM::parseArch(ArchName);
4856 if (AK != llvm::ARM::AK_INVALID)
4857 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004858 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004859 }
4860
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004861 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004862 StringRef SubArch;
4863
4864 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004865 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004866 SubArch = llvm::ARM::getSubArch(ArchKind);
4867 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4868 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004869
4870 // cache CPU related strings
4871 CPUAttr = getCPUAttr();
4872 CPUProfile = getCPUProfile();
4873 }
4874
4875 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004876 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004877 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004878 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004879 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4880 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004881 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004882 if (ArchProfile == llvm::ARM::PK_M) {
4883 MaxAtomicPromoteWidth = 32;
4884 if (ShouldUseInlineAtomic)
4885 MaxAtomicInlineWidth = 32;
4886 }
4887 else {
4888 MaxAtomicPromoteWidth = 64;
4889 if (ShouldUseInlineAtomic)
4890 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004891 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004892 }
4893
4894 bool isThumb() const {
4895 return (ArchISA == llvm::ARM::IK_THUMB);
4896 }
4897
4898 bool supportsThumb() const {
4899 return CPUAttr.count('T') || ArchVersion >= 6;
4900 }
4901
4902 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004903 return CPUAttr.equals("6T2") ||
4904 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004905 }
4906
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004907 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004908 // For most sub-arches, the build attribute CPU name is enough.
4909 // For Cortex variants, it's slightly different.
4910 switch(ArchKind) {
4911 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004912 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004913 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004914 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004915 case llvm::ARM::AK_ARMV7S:
4916 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004917 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004918 return "7A";
4919 case llvm::ARM::AK_ARMV7R:
4920 return "7R";
4921 case llvm::ARM::AK_ARMV7M:
4922 return "7M";
4923 case llvm::ARM::AK_ARMV7EM:
4924 return "7EM";
4925 case llvm::ARM::AK_ARMV8A:
4926 return "8A";
4927 case llvm::ARM::AK_ARMV8_1A:
4928 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004929 case llvm::ARM::AK_ARMV8_2A:
4930 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004931 case llvm::ARM::AK_ARMV8MBaseline:
4932 return "8M_BASE";
4933 case llvm::ARM::AK_ARMV8MMainline:
4934 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00004935 case llvm::ARM::AK_ARMV8R:
4936 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004937 }
4938 }
4939
4940 StringRef getCPUProfile() const {
4941 switch(ArchProfile) {
4942 case llvm::ARM::PK_A:
4943 return "A";
4944 case llvm::ARM::PK_R:
4945 return "R";
4946 case llvm::ARM::PK_M:
4947 return "M";
4948 default:
4949 return "";
4950 }
4951 }
4952
Chris Lattner17df24e2008-04-21 18:56:49 +00004953public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004954 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004955 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4956 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004957
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004958 switch (getTriple().getOS()) {
4959 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004960 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004961 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004962 break;
4963 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004964 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004965 break;
4966 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004967
Renato Goline84b0002015-10-08 16:43:26 +00004968 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004969 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004970
Chris Lattner1a8f3942010-04-23 16:29:58 +00004971 // {} in inline assembly are neon specifiers, not assembly variant
4972 // specifiers.
4973 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004974
Eric Christopher0e261882014-12-05 01:06:59 +00004975 // FIXME: This duplicates code from the driver that sets the -target-abi
4976 // option - this code is used if -target-abi isn't passed and should
4977 // be unified in some way.
4978 if (Triple.isOSBinFormatMachO()) {
4979 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4980 // the frontend matches that.
4981 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4982 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004983 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004984 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004985 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004986 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004987 } else {
4988 setABI("apcs-gnu");
4989 }
4990 } else if (Triple.isOSWindows()) {
4991 // FIXME: this is invalid for WindowsCE
4992 setABI("aapcs");
4993 } else {
4994 // Select the default based on the platform.
4995 switch (Triple.getEnvironment()) {
4996 case llvm::Triple::Android:
4997 case llvm::Triple::GNUEABI:
4998 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004999 case llvm::Triple::MuslEABI:
5000 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005001 setABI("aapcs-linux");
5002 break;
5003 case llvm::Triple::EABIHF:
5004 case llvm::Triple::EABI:
5005 setABI("aapcs");
5006 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005007 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005008 setABI("apcs-gnu");
5009 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005010 default:
5011 if (Triple.getOS() == llvm::Triple::NetBSD)
5012 setABI("apcs-gnu");
5013 else
5014 setABI("aapcs");
5015 break;
5016 }
5017 }
John McCall86353412010-08-21 22:46:04 +00005018
5019 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005020 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005021
Renato Golin15b86152015-07-03 16:41:13 +00005022 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005023 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005024
James Molloya7139222012-03-12 09:14:10 +00005025 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005026 // the alignment of the zero-length bitfield is greater than the member
5027 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005028 // zero length bitfield.
5029 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005030
5031 if (Triple.getOS() == llvm::Triple::Linux ||
5032 Triple.getOS() == llvm::Triple::UnknownOS)
5033 this->MCountName =
5034 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005035 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005036
Alp Toker4925ba72014-06-07 23:30:42 +00005037 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005038
Craig Topper3164f332014-03-11 03:39:26 +00005039 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005040 ABI = Name;
5041
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005042 // The defaults (above) are for AAPCS, check if we need to change them.
5043 //
5044 // FIXME: We need support for -meabi... we could just mangle it into the
5045 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005046 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005047 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005048 return true;
5049 }
5050 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5051 setABIAAPCS();
5052 return true;
5053 }
5054 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005055 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005056
Renato Golinf5c4dec2015-05-27 13:33:00 +00005057 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005058 bool
5059 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5060 StringRef CPU,
5061 const std::vector<std::string> &FeaturesVec) const override {
5062
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005063 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005064 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005065
5066 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005067 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005068 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5069
5070 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005071 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005072 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5073
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005074 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005075 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005076 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005077
Eric Christopher007b0a02015-08-28 22:32:01 +00005078 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005079 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005080
Craig Topper3164f332014-03-11 03:39:26 +00005081 bool handleTargetFeatures(std::vector<std::string> &Features,
5082 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005083 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005084 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005085 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005086 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005087 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005088 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005089 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005090
Ranjeet Singhac08e532015-06-24 23:39:25 +00005091 // This does not diagnose illegal cases like having both
5092 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5093 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005094 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005095 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005096 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005097 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005098 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005099 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005100 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005101 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005102 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005103 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005104 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005105 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005106 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005107 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005108 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005109 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005110 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005111 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005112 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005113 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005114 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005115 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005116 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005117 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005118 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005119 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005120 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005121 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005122 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005123 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005124 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005125 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005126 } else if (Feature == "+strict-align") {
5127 Unaligned = 0;
5128 } else if (Feature == "+fp16") {
5129 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005130 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005131 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005132 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005133
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005134 switch (ArchVersion) {
5135 case 6:
5136 if (ArchProfile == llvm::ARM::PK_M)
5137 LDREX = 0;
5138 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5139 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5140 else
5141 LDREX = LDREX_W;
5142 break;
5143 case 7:
5144 if (ArchProfile == llvm::ARM::PK_M)
5145 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5146 else
5147 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5148 break;
5149 case 8:
5150 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5151 }
5152
Rafael Espindolaeb265472013-08-21 21:59:03 +00005153 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5154 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5155 return false;
5156 }
5157
5158 if (FPMath == FP_Neon)
5159 Features.push_back("+neonfp");
5160 else if (FPMath == FP_VFP)
5161 Features.push_back("-neonfp");
5162
Daniel Dunbar893d4752009-12-19 04:15:38 +00005163 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005164 auto Feature =
5165 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5166 if (Feature != Features.end())
5167 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005168
Rafael Espindolaeb265472013-08-21 21:59:03 +00005169 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005170 }
5171
Craig Topper3164f332014-03-11 03:39:26 +00005172 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005173 return llvm::StringSwitch<bool>(Feature)
5174 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005175 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005176 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005177 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005178 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005179 .Case("hwdiv", HWDiv & HWDivThumb)
5180 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005181 .Default(false);
5182 }
Renato Golin15b86152015-07-03 16:41:13 +00005183
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005184 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005185 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005186 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005187
Renato Golin15b86152015-07-03 16:41:13 +00005188 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005189 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005190 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005191 CPU = Name;
5192 return true;
5193 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005194
Craig Topper3164f332014-03-11 03:39:26 +00005195 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005196
Craig Topper3164f332014-03-11 03:39:26 +00005197 void getTargetDefines(const LangOptions &Opts,
5198 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005199 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005200 Builder.defineMacro("__arm");
5201 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005202 // For bare-metal none-eabi.
5203 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5204 getTriple().getEnvironment() == llvm::Triple::EABI)
5205 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005206
Chris Lattnerecd49032009-03-02 22:27:17 +00005207 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005208 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005209
5210 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5211 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005212 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005213 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5214
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005215 if (!CPUAttr.empty())
5216 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005217
5218 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005219 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005220 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005221
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005222 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005223 // ACLE 6.5.7 Crypto Extension
5224 if (Crypto)
5225 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5226 // ACLE 6.5.8 CRC32 Extension
5227 if (CRC)
5228 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5229 // ACLE 6.5.10 Numeric Maximum and Minimum
5230 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5231 // ACLE 6.5.9 Directed Rounding
5232 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005233 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005234
5235 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5236 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005237 // NOTE that the default profile is assumed to be 'A'
5238 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005239 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5240
Bradley Smithf4affc12016-03-03 13:52:22 +00005241 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5242 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5243 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5244 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005245 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005246 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005247 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005248 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5249
5250 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5251 // instruction set such as ARM or Thumb.
5252 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5253
5254 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5255
5256 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005257 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005258 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005259
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005260 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005261 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005262 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005263
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005264 // ACLE 6.4.4 LDREX/STREX
5265 if (LDREX)
5266 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5267
5268 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005269 if (ArchVersion == 5 ||
5270 (ArchVersion == 6 && CPUProfile != "M") ||
5271 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005272 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5273
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005274 // ACLE 6.5.1 Hardware Floating Point
5275 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005276 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005277
Yi Konga44c4d72014-06-27 21:25:42 +00005278 // ACLE predefines.
5279 Builder.defineMacro("__ARM_ACLE", "200");
5280
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005281 // FP16 support (we currently only support IEEE format).
5282 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5283 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5284
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005285 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005286 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005287 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5288
Mike Stump9d54bd72009-04-08 02:07:04 +00005289 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005290
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005291 // FIXME: It's more complicated than this and we don't really support
5292 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005293 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005294 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005295 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005296
David Tweed8f676532012-10-25 13:33:01 +00005297 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005298 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005299 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005300 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005301 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005302 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005303 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005304
Tim Northover28fc0e12016-04-28 13:59:55 +00005305 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5306 ABI == "aapcs16")
5307 Builder.defineMacro("__ARM_PCS_VFP", "1");
5308
Daniel Dunbar893d4752009-12-19 04:15:38 +00005309 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005310 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005311
Zijiao Ma56a83722016-08-17 02:13:33 +00005312 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005313 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005314
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005315 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005316 Builder.defineMacro("__THUMBEL__");
5317 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005318 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005319 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005320 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005321
5322 // ACLE 6.4.9 32-bit SIMD instructions
5323 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5324 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5325
5326 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005327 if (((HWDiv & HWDivThumb) && isThumb()) ||
5328 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005329 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005330 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005331 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005332
5333 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005334 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005335
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005336 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005337 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005338 if (FPU & VFP2FPU)
5339 Builder.defineMacro("__ARM_VFPV2__");
5340 if (FPU & VFP3FPU)
5341 Builder.defineMacro("__ARM_VFPV3__");
5342 if (FPU & VFP4FPU)
5343 Builder.defineMacro("__ARM_VFPV4__");
5344 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005345
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005346 // This only gets set when Neon instructions are actually available, unlike
5347 // the VFP define, hence the soft float and arch check. This is subtly
5348 // different from gcc, we follow the intent which was that it should be set
5349 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005350 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005351 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005352 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005353 // current AArch32 NEON implementations do not support double-precision
5354 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005355 Builder.defineMacro("__ARM_NEON_FP",
5356 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005357 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005358
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005359 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5360 Opts.ShortWChar ? "2" : "4");
5361
5362 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5363 Opts.ShortEnums ? "1" : "4");
5364
Bradley Smithf4affc12016-03-03 13:52:22 +00005365 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005366 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5367 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5368 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5369 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5370 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005371
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005372 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005373 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005374 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005375 }
5376
5377 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005378 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005379 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5380 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005381 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005382 }
5383
5384 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005385 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005386 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005387
5388 if (Opts.UnsafeFPMath)
5389 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005390
5391 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5392 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005393 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005394
Craig Topper6c03a542015-10-19 04:51:35 +00005395 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5396 return llvm::makeArrayRef(BuiltinInfo,
5397 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005398 }
Craig Topper3164f332014-03-11 03:39:26 +00005399 bool isCLZForZeroUndef() const override { return false; }
5400 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005401 return IsAAPCS
5402 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005403 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5404 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005405 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005406 ArrayRef<const char *> getGCCRegNames() const override;
5407 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005408 bool validateAsmConstraint(const char *&Name,
5409 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005410 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005411 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005412 case 'l': // r0-r7
5413 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005414 case 't': // VFP Floating point register single precision
5415 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005416 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005417 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005418 case 'I':
5419 case 'J':
5420 case 'K':
5421 case 'L':
5422 case 'M':
5423 // FIXME
5424 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005425 case 'Q': // A memory address that is a single base register.
5426 Info.setAllowsMemory();
5427 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005428 case 'U': // a memory reference...
5429 switch (Name[1]) {
5430 case 'q': // ...ARMV4 ldrsb
5431 case 'v': // ...VFP load/store (reg+constant offset)
5432 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005433 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005434 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005435 case 'n': // valid address for Neon doubleword vector load/store
5436 case 'm': // valid address for Neon element and structure load/store
5437 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005438 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005439 Info.setAllowsMemory();
5440 Name++;
5441 return true;
5442 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005443 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005444 return false;
5445 }
Craig Topper3164f332014-03-11 03:39:26 +00005446 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005447 std::string R;
5448 switch (*Constraint) {
5449 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005450 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005451 Constraint++;
5452 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005453 case 'p': // 'p' should be translated to 'r' by default.
5454 R = std::string("r");
5455 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005456 default:
5457 return std::string(1, *Constraint);
5458 }
5459 return R;
5460 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005461 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005462 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005463 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005464 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005465 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005466
Bill Wendling9d1ee112012-10-25 23:28:48 +00005467 // Strip off constraint modifiers.
5468 while (Constraint[0] == '=' ||
5469 Constraint[0] == '+' ||
5470 Constraint[0] == '&')
5471 Constraint = Constraint.substr(1);
5472
5473 switch (Constraint[0]) {
5474 default: break;
5475 case 'r': {
5476 switch (Modifier) {
5477 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005478 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005479 case 'q':
5480 // A register of size 32 cannot fit a vector type.
5481 return false;
5482 }
5483 }
5484 }
5485
5486 return true;
5487 }
Craig Topper3164f332014-03-11 03:39:26 +00005488 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005489 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005490 return "";
5491 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005492
Craig Topper3164f332014-03-11 03:39:26 +00005493 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005494 switch (CC) {
5495 case CC_AAPCS:
5496 case CC_AAPCS_VFP:
5497 case CC_Swift:
5498 return CCCR_OK;
5499 default:
5500 return CCCR_Warning;
5501 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005502 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005503
Craig Topper3164f332014-03-11 03:39:26 +00005504 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005505 if (RegNo == 0) return 0;
5506 if (RegNo == 1) return 1;
5507 return -1;
5508 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005509
5510 bool hasSjLjLowering() const override {
5511 return true;
5512 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005513};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005514
Rafael Espindolaeb265472013-08-21 21:59:03 +00005515bool ARMTargetInfo::setFPMath(StringRef Name) {
5516 if (Name == "neon") {
5517 FPMath = FP_Neon;
5518 return true;
5519 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5520 Name == "vfp4") {
5521 FPMath = FP_VFP;
5522 return true;
5523 }
5524 return false;
5525}
5526
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005527const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005528 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005529 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005530 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5531
5532 // Float registers
5533 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5534 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5535 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005536 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005537
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005538 // Double registers
5539 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5540 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005541 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5542 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005543
5544 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005545 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5546 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005547};
5548
Craig Topperf054e3a2015-10-19 03:52:27 +00005549ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5550 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005551}
5552
5553const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005554 { { "a1" }, "r0" },
5555 { { "a2" }, "r1" },
5556 { { "a3" }, "r2" },
5557 { { "a4" }, "r3" },
5558 { { "v1" }, "r4" },
5559 { { "v2" }, "r5" },
5560 { { "v3" }, "r6" },
5561 { { "v4" }, "r7" },
5562 { { "v5" }, "r8" },
5563 { { "v6", "rfp" }, "r9" },
5564 { { "sl" }, "r10" },
5565 { { "fp" }, "r11" },
5566 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005567 { { "r13" }, "sp" },
5568 { { "r14" }, "lr" },
5569 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005570 // The S, D and Q registers overlap, but aren't really aliases; we
5571 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005572};
5573
Craig Topperf054e3a2015-10-19 03:52:27 +00005574ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5575 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005576}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005577
5578const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005579#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005580 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005581#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5582 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005583#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005584
Craig Topper07d3b622015-08-07 05:14:44 +00005585#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005586 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005587#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005588 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005589#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5590 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005591#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5592 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005593#include "clang/Basic/BuiltinsARM.def"
5594};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005595
5596class ARMleTargetInfo : public ARMTargetInfo {
5597public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005598 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005599 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005600 void getTargetDefines(const LangOptions &Opts,
5601 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005602 Builder.defineMacro("__ARMEL__");
5603 ARMTargetInfo::getTargetDefines(Opts, Builder);
5604 }
5605};
5606
5607class ARMbeTargetInfo : public ARMTargetInfo {
5608public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005609 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005610 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005611 void getTargetDefines(const LangOptions &Opts,
5612 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005613 Builder.defineMacro("__ARMEB__");
5614 Builder.defineMacro("__ARM_BIG_ENDIAN");
5615 ARMTargetInfo::getTargetDefines(Opts, Builder);
5616 }
5617};
Chris Lattner17df24e2008-04-21 18:56:49 +00005618
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005619class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5620 const llvm::Triple Triple;
5621public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005622 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5623 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005624 WCharType = UnsignedShort;
5625 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005626 }
5627 void getVisualStudioDefines(const LangOptions &Opts,
5628 MacroBuilder &Builder) const {
5629 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5630
5631 // FIXME: this is invalid for WindowsCE
5632 Builder.defineMacro("_M_ARM_NT", "1");
5633 Builder.defineMacro("_M_ARMT", "_M_ARM");
5634 Builder.defineMacro("_M_THUMB", "_M_ARM");
5635
5636 assert((Triple.getArch() == llvm::Triple::arm ||
5637 Triple.getArch() == llvm::Triple::thumb) &&
5638 "invalid architecture for Windows ARM target info");
5639 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5640 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5641
5642 // TODO map the complete set of values
5643 // 31: VFPv3 40: VFPv4
5644 Builder.defineMacro("_M_ARM_FP", "31");
5645 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005646 BuiltinVaListKind getBuiltinVaListKind() const override {
5647 return TargetInfo::CharPtrBuiltinVaList;
5648 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005649 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5650 switch (CC) {
5651 case CC_X86StdCall:
5652 case CC_X86ThisCall:
5653 case CC_X86FastCall:
5654 case CC_X86VectorCall:
5655 return CCCR_Ignore;
5656 case CC_C:
5657 return CCCR_OK;
5658 default:
5659 return CCCR_Warning;
5660 }
5661 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005662};
5663
5664// Windows ARM + Itanium C++ ABI Target
5665class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5666public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005667 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5668 const TargetOptions &Opts)
5669 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005670 TheCXXABI.set(TargetCXXABI::GenericARM);
5671 }
5672
5673 void getTargetDefines(const LangOptions &Opts,
5674 MacroBuilder &Builder) const override {
5675 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5676
5677 if (Opts.MSVCCompat)
5678 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5679 }
5680};
5681
5682// Windows ARM, MS (C++) ABI
5683class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5684public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005685 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5686 const TargetOptions &Opts)
5687 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005688 TheCXXABI.set(TargetCXXABI::Microsoft);
5689 }
5690
5691 void getTargetDefines(const LangOptions &Opts,
5692 MacroBuilder &Builder) const override {
5693 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5694 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5695 }
5696};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005697
Yaron Keren321249c2015-07-15 13:32:23 +00005698// ARM MinGW target
5699class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5700public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005701 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5702 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005703 TheCXXABI.set(TargetCXXABI::GenericARM);
5704 }
5705
5706 void getTargetDefines(const LangOptions &Opts,
5707 MacroBuilder &Builder) const override {
5708 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5709 DefineStd(Builder, "WIN32", Opts);
5710 DefineStd(Builder, "WINNT", Opts);
5711 Builder.defineMacro("_ARM_");
5712 addMinGWDefines(Opts, Builder);
5713 }
5714};
5715
5716// ARM Cygwin target
5717class CygwinARMTargetInfo : public ARMleTargetInfo {
5718public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005719 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5720 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005721 TLSSupported = false;
5722 WCharType = UnsignedShort;
5723 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005724 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005725 }
5726 void getTargetDefines(const LangOptions &Opts,
5727 MacroBuilder &Builder) const override {
5728 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5729 Builder.defineMacro("_ARM_");
5730 Builder.defineMacro("__CYGWIN__");
5731 Builder.defineMacro("__CYGWIN32__");
5732 DefineStd(Builder, "unix", Opts);
5733 if (Opts.CPlusPlus)
5734 Builder.defineMacro("_GNU_SOURCE");
5735 }
5736};
5737
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005738class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005739protected:
Craig Topper3164f332014-03-11 03:39:26 +00005740 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5741 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005742 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005743 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005744
Torok Edwinb2b37c62009-06-30 17:10:35 +00005745public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005746 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5747 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005748 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005749 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005750 // FIXME: This should be based off of the target features in
5751 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005752 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005753
Tim Northoverd88ecb32016-01-27 19:32:40 +00005754 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005755 // Darwin on iOS uses a variant of the ARM C++ ABI.
5756 TheCXXABI.set(TargetCXXABI::WatchOS);
5757
5758 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5759 // size_t is long, it's a bit weird for it to be int.
5760 PtrDiffType = SignedLong;
5761
5762 // BOOL should be a real boolean on the new ABI
5763 UseSignedCharForObjCBool = false;
5764 } else
5765 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005766 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005767};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005768
Tim Northover573cbee2014-05-24 12:52:07 +00005769class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005770 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005771 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5772 static const char *const GCCRegNames[];
5773
James Molloy75f5f9e2014-04-16 15:33:48 +00005774 enum FPUModeEnum {
5775 FPUMode,
5776 NeonMode
5777 };
5778
5779 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005780 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005781 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005782 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005783 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005784
Tim Northovera2ee4332014-03-29 15:09:45 +00005785 static const Builtin::Info BuiltinInfo[];
5786
5787 std::string ABI;
5788
5789public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005790 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005791 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005792 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5793 WCharType = SignedInt;
5794
5795 // NetBSD apparently prefers consistency across ARM targets to consistency
5796 // across 64-bit targets.
5797 Int64Type = SignedLongLong;
5798 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005799 } else {
5800 WCharType = UnsignedInt;
5801 Int64Type = SignedLong;
5802 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005803 }
5804
Tim Northovera2ee4332014-03-29 15:09:45 +00005805 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005806 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005807 MaxAtomicInlineWidth = 128;
5808 MaxAtomicPromoteWidth = 128;
5809
Tim Northovera6a19f12015-02-06 01:25:07 +00005810 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005811 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5812
Tim Northovera2ee4332014-03-29 15:09:45 +00005813 // {} in inline assembly are neon specifiers, not assembly variant
5814 // specifiers.
5815 NoAsmVariants = true;
5816
Tim Northover7ad87af2015-01-16 18:44:04 +00005817 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5818 // contributes to the alignment of the containing aggregate in the same way
5819 // a plain (non bit-field) member of that type would, without exception for
5820 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005821 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005822 UseZeroLengthBitfieldAlignment = true;
5823
Tim Northover573cbee2014-05-24 12:52:07 +00005824 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005825 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005826
5827 if (Triple.getOS() == llvm::Triple::Linux ||
5828 Triple.getOS() == llvm::Triple::UnknownOS)
5829 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005830 }
5831
Alp Toker4925ba72014-06-07 23:30:42 +00005832 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005833 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005834 if (Name != "aapcs" && Name != "darwinpcs")
5835 return false;
5836
5837 ABI = Name;
5838 return true;
5839 }
5840
David Blaikie1cbb9712014-11-14 19:09:44 +00005841 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005842 return Name == "generic" ||
5843 llvm::AArch64::parseCPUArch(Name) !=
5844 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005845 }
5846
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005847 void getTargetDefines(const LangOptions &Opts,
5848 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005849 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005850 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005851
5852 // Target properties.
5853 Builder.defineMacro("_LP64");
5854 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005855
5856 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5857 Builder.defineMacro("__ARM_ACLE", "200");
5858 Builder.defineMacro("__ARM_ARCH", "8");
5859 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5860
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005861 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005862 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005863 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005864
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005865 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5866 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5867 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5868 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005869 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005870 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5871 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005872
5873 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5874
5875 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005876 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005877
5878 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5879 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005880 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5881 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005882
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005883 if (Opts.UnsafeFPMath)
5884 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005885
5886 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5887
5888 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5889 Opts.ShortEnums ? "1" : "4");
5890
James Molloy75f5f9e2014-04-16 15:33:48 +00005891 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005892 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005893 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005894 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005895 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005896
Bradley Smith418c5932014-05-02 15:17:51 +00005897 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005898 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005899
James Molloy75f5f9e2014-04-16 15:33:48 +00005900 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005901 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5902
5903 if (Unaligned)
5904 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005905
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005906 if (V8_1A)
5907 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5908
Reid Klecknerd167d422015-05-06 15:31:46 +00005909 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5910 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5911 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5912 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5913 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005914 }
5915
Craig Topper6c03a542015-10-19 04:51:35 +00005916 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5917 return llvm::makeArrayRef(BuiltinInfo,
5918 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005919 }
5920
David Blaikie1cbb9712014-11-14 19:09:44 +00005921 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005922 return Feature == "aarch64" ||
5923 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005924 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005925 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005926 }
5927
James Molloy5e73df52014-04-16 15:06:20 +00005928 bool handleTargetFeatures(std::vector<std::string> &Features,
5929 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005930 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005931 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005932 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005933 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005934 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005935
Eric Christopher610fe112015-08-26 08:21:55 +00005936 for (const auto &Feature : Features) {
5937 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005938 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005939 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005940 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005941 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005942 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005943 if (Feature == "+strict-align")
5944 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005945 if (Feature == "+v8.1a")
5946 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005947 }
5948
James Y Knightb214cbc2016-03-04 19:00:41 +00005949 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005950
5951 return true;
5952 }
5953
John McCall477f2bb2016-03-03 06:39:32 +00005954 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5955 switch (CC) {
5956 case CC_C:
5957 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005958 case CC_PreserveMost:
5959 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005960 return CCCR_OK;
5961 default:
5962 return CCCR_Warning;
5963 }
5964 }
5965
David Blaikie1cbb9712014-11-14 19:09:44 +00005966 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005967
David Blaikie1cbb9712014-11-14 19:09:44 +00005968 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005969 return TargetInfo::AArch64ABIBuiltinVaList;
5970 }
5971
Craig Topperf054e3a2015-10-19 03:52:27 +00005972 ArrayRef<const char *> getGCCRegNames() const override;
5973 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005974
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005975 bool validateAsmConstraint(const char *&Name,
5976 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005977 switch (*Name) {
5978 default:
5979 return false;
5980 case 'w': // Floating point and SIMD registers (V0-V31)
5981 Info.setAllowsRegister();
5982 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005983 case 'I': // Constant that can be used with an ADD instruction
5984 case 'J': // Constant that can be used with a SUB instruction
5985 case 'K': // Constant that can be used with a 32-bit logical instruction
5986 case 'L': // Constant that can be used with a 64-bit logical instruction
5987 case 'M': // Constant that can be used as a 32-bit MOV immediate
5988 case 'N': // Constant that can be used as a 64-bit MOV immediate
5989 case 'Y': // Floating point constant zero
5990 case 'Z': // Integer constant zero
5991 return true;
5992 case 'Q': // A memory reference with base register and no offset
5993 Info.setAllowsMemory();
5994 return true;
5995 case 'S': // A symbolic address
5996 Info.setAllowsRegister();
5997 return true;
5998 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005999 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6000 // Utf: A memory address suitable for ldp/stp in TF mode.
6001 // Usa: An absolute symbolic address.
6002 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6003 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006004 case 'z': // Zero register, wzr or xzr
6005 Info.setAllowsRegister();
6006 return true;
6007 case 'x': // Floating point and SIMD registers (V0-V15)
6008 Info.setAllowsRegister();
6009 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006010 }
6011 return false;
6012 }
6013
Akira Hatanaka987f1862014-08-22 06:05:21 +00006014 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006015 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006016 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006017 // Strip off constraint modifiers.
6018 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6019 Constraint = Constraint.substr(1);
6020
6021 switch (Constraint[0]) {
6022 default:
6023 return true;
6024 case 'z':
6025 case 'r': {
6026 switch (Modifier) {
6027 case 'x':
6028 case 'w':
6029 // For now assume that the person knows what they're
6030 // doing with the modifier.
6031 return true;
6032 default:
6033 // By default an 'r' constraint will be in the 'x'
6034 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006035 if (Size == 64)
6036 return true;
6037
6038 SuggestedModifier = "w";
6039 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006040 }
6041 }
6042 }
6043 }
6044
David Blaikie1cbb9712014-11-14 19:09:44 +00006045 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006046
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006047 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006048 if (RegNo == 0)
6049 return 0;
6050 if (RegNo == 1)
6051 return 1;
6052 return -1;
6053 }
6054};
6055
Tim Northover573cbee2014-05-24 12:52:07 +00006056const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006057 // 32-bit Integer registers
6058 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6059 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6060 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6061
6062 // 64-bit Integer registers
6063 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6064 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6065 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6066
6067 // 32-bit floating point regsisters
6068 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6069 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6070 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6071
6072 // 64-bit floating point regsisters
6073 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6074 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6075 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6076
6077 // Vector registers
6078 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6079 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6080 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6081};
6082
Craig Topperf054e3a2015-10-19 03:52:27 +00006083ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6084 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006085}
6086
Tim Northover573cbee2014-05-24 12:52:07 +00006087const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006088 { { "w31" }, "wsp" },
6089 { { "x29" }, "fp" },
6090 { { "x30" }, "lr" },
6091 { { "x31" }, "sp" },
6092 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6093 // don't want to substitute one of these for a different-sized one.
6094};
6095
Craig Topperf054e3a2015-10-19 03:52:27 +00006096ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6097 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006098}
6099
Tim Northover573cbee2014-05-24 12:52:07 +00006100const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006101#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006102 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006103#include "clang/Basic/BuiltinsNEON.def"
6104
6105#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006106 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006107#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006108};
James Molloy5e73df52014-04-16 15:06:20 +00006109
Tim Northover573cbee2014-05-24 12:52:07 +00006110class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006111 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006112 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006113 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006114 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006115 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006116 }
6117
6118public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006119 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6120 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006121 }
James Molloy5e73df52014-04-16 15:06:20 +00006122 void getTargetDefines(const LangOptions &Opts,
6123 MacroBuilder &Builder) const override {
6124 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006125 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006126 }
6127};
6128
Tim Northover573cbee2014-05-24 12:52:07 +00006129class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006130 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006131 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006132 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006133 }
6134
6135public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006136 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6137 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006138 void getTargetDefines(const LangOptions &Opts,
6139 MacroBuilder &Builder) const override {
6140 Builder.defineMacro("__AARCH64EB__");
6141 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6142 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006143 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006144 }
6145};
Tim Northovera2ee4332014-03-29 15:09:45 +00006146
Tim Northover573cbee2014-05-24 12:52:07 +00006147class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006148protected:
6149 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6150 MacroBuilder &Builder) const override {
6151 Builder.defineMacro("__AARCH64_SIMD__");
6152 Builder.defineMacro("__ARM64_ARCH_8__");
6153 Builder.defineMacro("__ARM_NEON__");
6154 Builder.defineMacro("__LITTLE_ENDIAN__");
6155 Builder.defineMacro("__REGISTER_PREFIX__", "");
6156 Builder.defineMacro("__arm64", "1");
6157 Builder.defineMacro("__arm64__", "1");
6158
6159 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6160 }
6161
Tim Northovera2ee4332014-03-29 15:09:45 +00006162public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006163 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6164 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006165 Int64Type = SignedLongLong;
6166 WCharType = SignedInt;
6167 UseSignedCharForObjCBool = false;
6168
Tim Northovera6a19f12015-02-06 01:25:07 +00006169 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006170 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6171
6172 TheCXXABI.set(TargetCXXABI::iOS64);
6173 }
6174
David Blaikie1cbb9712014-11-14 19:09:44 +00006175 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006176 return TargetInfo::CharPtrBuiltinVaList;
6177 }
6178};
Tim Northovera2ee4332014-03-29 15:09:45 +00006179
Tony Linthicum76329bf2011-12-12 21:14:55 +00006180// Hexagon abstract base class
6181class HexagonTargetInfo : public TargetInfo {
6182 static const Builtin::Info BuiltinInfo[];
6183 static const char * const GCCRegNames[];
6184 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6185 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006186 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006187 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006188
Tony Linthicum76329bf2011-12-12 21:14:55 +00006189public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006190 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6191 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006192 // Specify the vector alignment explicitly. For v512x1, the calculated
6193 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6194 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006195 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006196 "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 +00006197 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006198 SizeType = UnsignedInt;
6199 PtrDiffType = SignedInt;
6200 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006201
6202 // {} in inline assembly are packet specifiers, not assembly variant
6203 // specifiers.
6204 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006205
6206 LargeArrayMinWidth = 64;
6207 LargeArrayAlign = 64;
6208 UseBitFieldTypeAlignment = true;
6209 ZeroLengthBitfieldBoundary = 32;
6210 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006211 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006212 }
6213
Craig Topper6c03a542015-10-19 04:51:35 +00006214 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6215 return llvm::makeArrayRef(BuiltinInfo,
6216 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006217 }
6218
Craig Topper3164f332014-03-11 03:39:26 +00006219 bool validateAsmConstraint(const char *&Name,
6220 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006221 switch (*Name) {
6222 case 'v':
6223 case 'q':
6224 if (HasHVX) {
6225 Info.setAllowsRegister();
6226 return true;
6227 }
6228 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006229 case 's':
6230 // Relocatable constant.
6231 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006232 }
6233 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006234 }
6235
Craig Topper3164f332014-03-11 03:39:26 +00006236 void getTargetDefines(const LangOptions &Opts,
6237 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006238
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006239 bool isCLZForZeroUndef() const override { return false; }
6240
Craig Topper3164f332014-03-11 03:39:26 +00006241 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006242 return llvm::StringSwitch<bool>(Feature)
6243 .Case("hexagon", true)
6244 .Case("hvx", HasHVX)
6245 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006246 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006247 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006248 }
Craig Topper3164f332014-03-11 03:39:26 +00006249
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006250 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6251 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6252 const override;
6253
6254 bool handleTargetFeatures(std::vector<std::string> &Features,
6255 DiagnosticsEngine &Diags) override;
6256
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006257 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6258 bool Enabled) const override;
6259
Craig Topper3164f332014-03-11 03:39:26 +00006260 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006261 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006262 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006263 ArrayRef<const char *> getGCCRegNames() const override;
6264 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006265 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006266 return "";
6267 }
Sebastian Pop86500282012-01-13 20:37:10 +00006268
6269 static const char *getHexagonCPUSuffix(StringRef Name) {
6270 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006271 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006272 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006273 .Case("hexagonv55", "55")
6274 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006275 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006276 }
6277
Craig Topper3164f332014-03-11 03:39:26 +00006278 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006279 if (!getHexagonCPUSuffix(Name))
6280 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006281 CPU = Name;
6282 return true;
6283 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006284
6285 int getEHDataRegisterNumber(unsigned RegNo) const override {
6286 return RegNo < 2 ? RegNo : -1;
6287 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006288};
6289
6290void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006291 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006292 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006293 Builder.defineMacro("__hexagon__", "1");
6294
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006295 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006296 Builder.defineMacro("__HEXAGON_V4__");
6297 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006298 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006299 Builder.defineMacro("__QDSP6_V4__");
6300 Builder.defineMacro("__QDSP6_ARCH__", "4");
6301 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006302 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006303 Builder.defineMacro("__HEXAGON_V5__");
6304 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6305 if(Opts.HexagonQdsp6Compat) {
6306 Builder.defineMacro("__QDSP6_V5__");
6307 Builder.defineMacro("__QDSP6_ARCH__", "5");
6308 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006309 } else if (CPU == "hexagonv55") {
6310 Builder.defineMacro("__HEXAGON_V55__");
6311 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6312 Builder.defineMacro("__QDSP6_V55__");
6313 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006314 } else if (CPU == "hexagonv60") {
6315 Builder.defineMacro("__HEXAGON_V60__");
6316 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6317 Builder.defineMacro("__QDSP6_V60__");
6318 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006319 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006320
6321 if (hasFeature("hvx")) {
6322 Builder.defineMacro("__HVX__");
6323 if (hasFeature("hvx-double"))
6324 Builder.defineMacro("__HVXDBL__");
6325 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006326}
6327
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006328bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6329 DiagnosticsEngine &Diags, StringRef CPU,
6330 const std::vector<std::string> &FeaturesVec) const {
6331 // Default for v60: -hvx, -hvx-double.
6332 Features["hvx"] = false;
6333 Features["hvx-double"] = false;
6334 Features["long-calls"] = false;
6335
6336 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6337}
6338
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006339bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6340 DiagnosticsEngine &Diags) {
6341 for (auto &F : Features) {
6342 if (F == "+hvx")
6343 HasHVX = true;
6344 else if (F == "-hvx")
6345 HasHVX = HasHVXDouble = false;
6346 else if (F == "+hvx-double")
6347 HasHVX = HasHVXDouble = true;
6348 else if (F == "-hvx-double")
6349 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006350
6351 if (F == "+long-calls")
6352 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006353 else if (F == "-long-calls")
6354 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006355 }
6356 return true;
6357}
6358
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006359void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6360 StringRef Name, bool Enabled) const {
6361 if (Enabled) {
6362 if (Name == "hvx-double")
6363 Features["hvx"] = true;
6364 } else {
6365 if (Name == "hvx")
6366 Features["hvx-double"] = false;
6367 }
6368 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006369}
6370
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006371const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006372 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6373 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6374 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6375 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6376 "p0", "p1", "p2", "p3",
6377 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6378};
6379
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006380ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006381 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006382}
6383
Tony Linthicum76329bf2011-12-12 21:14:55 +00006384const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6385 { { "sp" }, "r29" },
6386 { { "fp" }, "r30" },
6387 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006388};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006389
Craig Topperf054e3a2015-10-19 03:52:27 +00006390ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6391 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006392}
6393
6394
6395const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006396#define BUILTIN(ID, TYPE, ATTRS) \
6397 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6398#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6399 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006400#include "clang/Basic/BuiltinsHexagon.def"
6401};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006402
Jacques Pienaard964cc22016-03-28 21:02:54 +00006403class LanaiTargetInfo : public TargetInfo {
6404 // Class for Lanai (32-bit).
6405 // The CPU profiles supported by the Lanai backend
6406 enum CPUKind {
6407 CK_NONE,
6408 CK_V11,
6409 } CPU;
6410
6411 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6412 static const char *const GCCRegNames[];
6413
6414public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006415 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6416 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006417 // Description string has to be kept in sync with backend.
6418 resetDataLayout("E" // Big endian
6419 "-m:e" // ELF name manging
6420 "-p:32:32" // 32 bit pointers, 32 bit aligned
6421 "-i64:64" // 64 bit integers, 64 bit aligned
6422 "-a:0:32" // 32 bit alignment of objects of aggregate type
6423 "-n32" // 32 bit native integer width
6424 "-S64" // 64 bit natural stack alignment
6425 );
6426
6427 // Setting RegParmMax equal to what mregparm was set to in the old
6428 // toolchain
6429 RegParmMax = 4;
6430
6431 // Set the default CPU to V11
6432 CPU = CK_V11;
6433
6434 // Temporary approach to make everything at least word-aligned and allow for
6435 // safely casting between pointers with different alignment requirements.
6436 // TODO: Remove this when there are no more cast align warnings on the
6437 // firmware.
6438 MinGlobalAlign = 32;
6439 }
6440
6441 void getTargetDefines(const LangOptions &Opts,
6442 MacroBuilder &Builder) const override {
6443 // Define __lanai__ when building for target lanai.
6444 Builder.defineMacro("__lanai__");
6445
6446 // Set define for the CPU specified.
6447 switch (CPU) {
6448 case CK_V11:
6449 Builder.defineMacro("__LANAI_V11__");
6450 break;
6451 case CK_NONE:
6452 llvm_unreachable("Unhandled target CPU");
6453 }
6454 }
6455
6456 bool setCPU(const std::string &Name) override {
6457 CPU = llvm::StringSwitch<CPUKind>(Name)
6458 .Case("v11", CK_V11)
6459 .Default(CK_NONE);
6460
6461 return CPU != CK_NONE;
6462 }
6463
6464 bool hasFeature(StringRef Feature) const override {
6465 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6466 }
6467
6468 ArrayRef<const char *> getGCCRegNames() const override;
6469
6470 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6471
6472 BuiltinVaListKind getBuiltinVaListKind() const override {
6473 return TargetInfo::VoidPtrBuiltinVaList;
6474 }
6475
6476 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6477
6478 bool validateAsmConstraint(const char *&Name,
6479 TargetInfo::ConstraintInfo &info) const override {
6480 return false;
6481 }
6482
6483 const char *getClobbers() const override { return ""; }
6484};
6485
6486const char *const LanaiTargetInfo::GCCRegNames[] = {
6487 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6488 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6489 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6490
6491ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6492 return llvm::makeArrayRef(GCCRegNames);
6493}
6494
6495const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6496 {{"pc"}, "r2"},
6497 {{"sp"}, "r4"},
6498 {{"fp"}, "r5"},
6499 {{"rv"}, "r8"},
6500 {{"rr1"}, "r10"},
6501 {{"rr2"}, "r11"},
6502 {{"rca"}, "r15"},
6503};
6504
6505ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6506 return llvm::makeArrayRef(GCCRegAliases);
6507}
6508
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006509// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6510class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006511 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6512 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006513 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006514public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006515 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006516 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006517
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006518 int getEHDataRegisterNumber(unsigned RegNo) const override {
6519 if (RegNo == 0) return 24;
6520 if (RegNo == 1) return 25;
6521 return -1;
6522 }
6523
Craig Topper3164f332014-03-11 03:39:26 +00006524 bool handleTargetFeatures(std::vector<std::string> &Features,
6525 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006526 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006527 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6528 if (Feature != Features.end()) {
6529 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006530 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006531 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006532 }
Craig Topper3164f332014-03-11 03:39:26 +00006533 void getTargetDefines(const LangOptions &Opts,
6534 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006535 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006536 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006537
6538 if (SoftFloat)
6539 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006540 }
Craig Topper3164f332014-03-11 03:39:26 +00006541
6542 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006543 return llvm::StringSwitch<bool>(Feature)
6544 .Case("softfloat", SoftFloat)
6545 .Case("sparc", true)
6546 .Default(false);
6547 }
Craig Topper3164f332014-03-11 03:39:26 +00006548
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006549 bool hasSjLjLowering() const override {
6550 return true;
6551 }
6552
Craig Topper6c03a542015-10-19 04:51:35 +00006553 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006554 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006555 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006556 }
Craig Topper3164f332014-03-11 03:39:26 +00006557 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006558 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006559 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006560 ArrayRef<const char *> getGCCRegNames() const override;
6561 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006562 bool validateAsmConstraint(const char *&Name,
6563 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006564 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006565 switch (*Name) {
6566 case 'I': // Signed 13-bit constant
6567 case 'J': // Zero
6568 case 'K': // 32-bit constant with the low 12 bits clear
6569 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6570 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6571 case 'N': // Same as 'K' but zext (required for SIMode)
6572 case 'O': // The constant 4096
6573 return true;
6574 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006575 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006576 }
Craig Topper3164f332014-03-11 03:39:26 +00006577 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006578 // FIXME: Implement!
6579 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006580 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006581
6582 // No Sparc V7 for now, the backend doesn't support it anyway.
6583 enum CPUKind {
6584 CK_GENERIC,
6585 CK_V8,
6586 CK_SUPERSPARC,
6587 CK_SPARCLITE,
6588 CK_F934,
6589 CK_HYPERSPARC,
6590 CK_SPARCLITE86X,
6591 CK_SPARCLET,
6592 CK_TSC701,
6593 CK_V9,
6594 CK_ULTRASPARC,
6595 CK_ULTRASPARC3,
6596 CK_NIAGARA,
6597 CK_NIAGARA2,
6598 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006599 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006600 CK_MYRIAD2100,
6601 CK_MYRIAD2150,
6602 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006603 CK_LEON2,
6604 CK_LEON2_AT697E,
6605 CK_LEON2_AT697F,
6606 CK_LEON3,
6607 CK_LEON3_UT699,
6608 CK_LEON3_GR712RC,
6609 CK_LEON4,
6610 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006611 } CPU = CK_GENERIC;
6612
6613 enum CPUGeneration {
6614 CG_V8,
6615 CG_V9,
6616 };
6617
6618 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6619 switch (Kind) {
6620 case CK_GENERIC:
6621 case CK_V8:
6622 case CK_SUPERSPARC:
6623 case CK_SPARCLITE:
6624 case CK_F934:
6625 case CK_HYPERSPARC:
6626 case CK_SPARCLITE86X:
6627 case CK_SPARCLET:
6628 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006629 case CK_MYRIAD2100:
6630 case CK_MYRIAD2150:
6631 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006632 case CK_LEON2:
6633 case CK_LEON2_AT697E:
6634 case CK_LEON2_AT697F:
6635 case CK_LEON3:
6636 case CK_LEON3_UT699:
6637 case CK_LEON3_GR712RC:
6638 case CK_LEON4:
6639 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006640 return CG_V8;
6641 case CK_V9:
6642 case CK_ULTRASPARC:
6643 case CK_ULTRASPARC3:
6644 case CK_NIAGARA:
6645 case CK_NIAGARA2:
6646 case CK_NIAGARA3:
6647 case CK_NIAGARA4:
6648 return CG_V9;
6649 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006650 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006651 }
6652
6653 CPUKind getCPUKind(StringRef Name) const {
6654 return llvm::StringSwitch<CPUKind>(Name)
6655 .Case("v8", CK_V8)
6656 .Case("supersparc", CK_SUPERSPARC)
6657 .Case("sparclite", CK_SPARCLITE)
6658 .Case("f934", CK_F934)
6659 .Case("hypersparc", CK_HYPERSPARC)
6660 .Case("sparclite86x", CK_SPARCLITE86X)
6661 .Case("sparclet", CK_SPARCLET)
6662 .Case("tsc701", CK_TSC701)
6663 .Case("v9", CK_V9)
6664 .Case("ultrasparc", CK_ULTRASPARC)
6665 .Case("ultrasparc3", CK_ULTRASPARC3)
6666 .Case("niagara", CK_NIAGARA)
6667 .Case("niagara2", CK_NIAGARA2)
6668 .Case("niagara3", CK_NIAGARA3)
6669 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006670 .Case("ma2100", CK_MYRIAD2100)
6671 .Case("ma2150", CK_MYRIAD2150)
6672 .Case("ma2450", CK_MYRIAD2450)
6673 // FIXME: the myriad2[.n] spellings are obsolete,
6674 // but a grace period is needed to allow updating dependent builds.
6675 .Case("myriad2", CK_MYRIAD2100)
6676 .Case("myriad2.1", CK_MYRIAD2100)
6677 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006678 .Case("leon2", CK_LEON2)
6679 .Case("at697e", CK_LEON2_AT697E)
6680 .Case("at697f", CK_LEON2_AT697F)
6681 .Case("leon3", CK_LEON3)
6682 .Case("ut699", CK_LEON3_UT699)
6683 .Case("gr712rc", CK_LEON3_GR712RC)
6684 .Case("leon4", CK_LEON4)
6685 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006686 .Default(CK_GENERIC);
6687 }
6688
6689 bool setCPU(const std::string &Name) override {
6690 CPU = getCPUKind(Name);
6691 return CPU != CK_GENERIC;
6692 }
Gabor Greif49991682008-02-21 16:29:08 +00006693};
6694
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006695const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006696 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6697 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6698 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6699 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6700};
6701
Craig Topperf054e3a2015-10-19 03:52:27 +00006702ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6703 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006704}
6705
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006706const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006707 { { "g0" }, "r0" },
6708 { { "g1" }, "r1" },
6709 { { "g2" }, "r2" },
6710 { { "g3" }, "r3" },
6711 { { "g4" }, "r4" },
6712 { { "g5" }, "r5" },
6713 { { "g6" }, "r6" },
6714 { { "g7" }, "r7" },
6715 { { "o0" }, "r8" },
6716 { { "o1" }, "r9" },
6717 { { "o2" }, "r10" },
6718 { { "o3" }, "r11" },
6719 { { "o4" }, "r12" },
6720 { { "o5" }, "r13" },
6721 { { "o6", "sp" }, "r14" },
6722 { { "o7" }, "r15" },
6723 { { "l0" }, "r16" },
6724 { { "l1" }, "r17" },
6725 { { "l2" }, "r18" },
6726 { { "l3" }, "r19" },
6727 { { "l4" }, "r20" },
6728 { { "l5" }, "r21" },
6729 { { "l6" }, "r22" },
6730 { { "l7" }, "r23" },
6731 { { "i0" }, "r24" },
6732 { { "i1" }, "r25" },
6733 { { "i2" }, "r26" },
6734 { { "i3" }, "r27" },
6735 { { "i4" }, "r28" },
6736 { { "i5" }, "r29" },
6737 { { "i6", "fp" }, "r30" },
6738 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006739};
6740
Craig Topperf054e3a2015-10-19 03:52:27 +00006741ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6742 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006743}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006744
6745// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6746class SparcV8TargetInfo : public SparcTargetInfo {
6747public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006748 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6749 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006750 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006751 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6752 switch (getTriple().getOS()) {
6753 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006754 SizeType = UnsignedInt;
6755 IntPtrType = SignedInt;
6756 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006757 break;
6758 case llvm::Triple::NetBSD:
6759 case llvm::Triple::OpenBSD:
6760 SizeType = UnsignedLong;
6761 IntPtrType = SignedLong;
6762 PtrDiffType = SignedLong;
6763 break;
Brad Smith56495d52015-08-13 22:00:53 +00006764 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006765 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006766 }
6767
Craig Topper3164f332014-03-11 03:39:26 +00006768 void getTargetDefines(const LangOptions &Opts,
6769 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006770 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006771 switch (getCPUGeneration(CPU)) {
6772 case CG_V8:
6773 Builder.defineMacro("__sparcv8");
6774 if (getTriple().getOS() != llvm::Triple::Solaris)
6775 Builder.defineMacro("__sparcv8__");
6776 break;
6777 case CG_V9:
6778 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006779 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006780 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006781 Builder.defineMacro("__sparc_v9__");
6782 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006783 break;
6784 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006785 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006786 std::string MyriadArchValue, Myriad2Value;
6787 Builder.defineMacro("__sparc_v8__");
6788 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006789 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006790 case CK_MYRIAD2150:
6791 MyriadArchValue = "__ma2150";
6792 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006793 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006794 case CK_MYRIAD2450:
6795 MyriadArchValue = "__ma2450";
6796 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006797 break;
6798 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006799 MyriadArchValue = "__ma2100";
6800 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006801 break;
6802 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006803 Builder.defineMacro(MyriadArchValue, "1");
6804 Builder.defineMacro(MyriadArchValue+"__", "1");
6805 Builder.defineMacro("__myriad2__", Myriad2Value);
6806 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006807 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006808 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006809
6810 bool hasSjLjLowering() const override {
6811 return true;
6812 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006813};
6814
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006815// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6816class SparcV8elTargetInfo : public SparcV8TargetInfo {
6817 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006818 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6819 : SparcV8TargetInfo(Triple, Opts) {
6820 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006821 }
6822};
6823
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006824// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6825class SparcV9TargetInfo : public SparcTargetInfo {
6826public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006827 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6828 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006829 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006830 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006831 // This is an LP64 platform.
6832 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006833
6834 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006835 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006836 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006837 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006838 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006839 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006840
6841 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6842 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6843 LongDoubleWidth = 128;
6844 LongDoubleAlign = 128;
6845 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006846 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006847 }
6848
Craig Topper3164f332014-03-11 03:39:26 +00006849 void getTargetDefines(const LangOptions &Opts,
6850 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006851 SparcTargetInfo::getTargetDefines(Opts, Builder);
6852 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006853 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006854 // Solaris doesn't need these variants, but the BSDs do.
6855 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006856 Builder.defineMacro("__sparc64__");
6857 Builder.defineMacro("__sparc_v9__");
6858 Builder.defineMacro("__sparcv9__");
6859 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006860 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006861
Craig Topper3164f332014-03-11 03:39:26 +00006862 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006863 if (!SparcTargetInfo::setCPU(Name))
6864 return false;
6865 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006866 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006867};
6868
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006869class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006870 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006871 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006872 std::string CPU;
6873 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006874 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006875
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006876public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006877 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006878 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6879 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006880 IntMaxType = SignedLong;
6881 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006882 TLSSupported = true;
6883 IntWidth = IntAlign = 32;
6884 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6885 PointerWidth = PointerAlign = 64;
6886 LongDoubleWidth = 128;
6887 LongDoubleAlign = 64;
6888 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006889 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006890 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006891 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 +00006892 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6893 }
6894 void getTargetDefines(const LangOptions &Opts,
6895 MacroBuilder &Builder) const override {
6896 Builder.defineMacro("__s390__");
6897 Builder.defineMacro("__s390x__");
6898 Builder.defineMacro("__zarch__");
6899 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006900
6901 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6902 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6903 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6904 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6905
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006906 if (HasTransactionalExecution)
6907 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006908 if (Opts.ZVector)
6909 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006910 }
Craig Topper6c03a542015-10-19 04:51:35 +00006911 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6912 return llvm::makeArrayRef(BuiltinInfo,
6913 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006914 }
6915
Craig Topperf054e3a2015-10-19 03:52:27 +00006916 ArrayRef<const char *> getGCCRegNames() const override;
6917 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006918 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006919 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006920 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006921 bool validateAsmConstraint(const char *&Name,
6922 TargetInfo::ConstraintInfo &info) const override;
6923 const char *getClobbers() const override {
6924 // FIXME: Is this really right?
6925 return "";
6926 }
6927 BuiltinVaListKind getBuiltinVaListKind() const override {
6928 return TargetInfo::SystemZBuiltinVaList;
6929 }
6930 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006931 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006932 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6933 .Case("z10", true)
6934 .Case("z196", true)
6935 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006936 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006937 .Default(false);
6938
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006939 return CPUKnown;
6940 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006941 bool
6942 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6943 StringRef CPU,
6944 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006945 if (CPU == "zEC12")
6946 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006947 if (CPU == "z13") {
6948 Features["transactional-execution"] = true;
6949 Features["vector"] = true;
6950 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006951 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006952 }
6953
6954 bool handleTargetFeatures(std::vector<std::string> &Features,
6955 DiagnosticsEngine &Diags) override {
6956 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006957 for (const auto &Feature : Features) {
6958 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006959 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006960 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006961 HasVector = true;
6962 }
6963 // If we use the vector ABI, vector types are 64-bit aligned.
6964 if (HasVector) {
6965 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006966 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6967 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006968 }
6969 return true;
6970 }
6971
6972 bool hasFeature(StringRef Feature) const override {
6973 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006974 .Case("systemz", true)
6975 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006976 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006977 .Default(false);
6978 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006979
Bryan Chane3f1ed52016-04-28 13:56:43 +00006980 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6981 switch (CC) {
6982 case CC_C:
6983 case CC_Swift:
6984 return CCCR_OK;
6985 default:
6986 return CCCR_Warning;
6987 }
6988 }
6989
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006990 StringRef getABI() const override {
6991 if (HasVector)
6992 return "vector";
6993 return "";
6994 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006995
6996 bool useFloat128ManglingForLongDouble() const override {
6997 return true;
6998 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006999};
7000
7001const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7002#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007003 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007004#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7005 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007006#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007007};
7008
7009const char *const SystemZTargetInfo::GCCRegNames[] = {
7010 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7011 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7012 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7013 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7014};
7015
Craig Topperf054e3a2015-10-19 03:52:27 +00007016ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7017 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007018}
7019
7020bool SystemZTargetInfo::
7021validateAsmConstraint(const char *&Name,
7022 TargetInfo::ConstraintInfo &Info) const {
7023 switch (*Name) {
7024 default:
7025 return false;
7026
7027 case 'a': // Address register
7028 case 'd': // Data register (equivalent to 'r')
7029 case 'f': // Floating-point register
7030 Info.setAllowsRegister();
7031 return true;
7032
7033 case 'I': // Unsigned 8-bit constant
7034 case 'J': // Unsigned 12-bit constant
7035 case 'K': // Signed 16-bit constant
7036 case 'L': // Signed 20-bit displacement (on all targets we support)
7037 case 'M': // 0x7fffffff
7038 return true;
7039
7040 case 'Q': // Memory with base and unsigned 12-bit displacement
7041 case 'R': // Likewise, plus an index
7042 case 'S': // Memory with base and signed 20-bit displacement
7043 case 'T': // Likewise, plus an index
7044 Info.setAllowsMemory();
7045 return true;
7046 }
7047}
Ulrich Weigand47445072013-05-06 16:26:41 +00007048
Eric Christopherc48497a2015-09-18 21:26:24 +00007049class MSP430TargetInfo : public TargetInfo {
7050 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007051
Eric Christopherc48497a2015-09-18 21:26:24 +00007052public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007053 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7054 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007055 TLSSupported = false;
7056 IntWidth = 16;
7057 IntAlign = 16;
7058 LongWidth = 32;
7059 LongLongWidth = 64;
7060 LongAlign = LongLongAlign = 16;
7061 PointerWidth = 16;
7062 PointerAlign = 16;
7063 SuitableAlign = 16;
7064 SizeType = UnsignedInt;
7065 IntMaxType = SignedLongLong;
7066 IntPtrType = SignedInt;
7067 PtrDiffType = SignedInt;
7068 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007069 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007070 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007071 void getTargetDefines(const LangOptions &Opts,
7072 MacroBuilder &Builder) const override {
7073 Builder.defineMacro("MSP430");
7074 Builder.defineMacro("__MSP430__");
7075 // FIXME: defines for different 'flavours' of MCU
7076 }
Craig Topper6c03a542015-10-19 04:51:35 +00007077 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007078 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007079 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007080 }
7081 bool hasFeature(StringRef Feature) const override {
7082 return Feature == "msp430";
7083 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007084 ArrayRef<const char *> getGCCRegNames() const override;
7085 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007086 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007087 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007088 }
7089 bool validateAsmConstraint(const char *&Name,
7090 TargetInfo::ConstraintInfo &info) const override {
7091 // FIXME: implement
7092 switch (*Name) {
7093 case 'K': // the constant 1
7094 case 'L': // constant -1^20 .. 1^19
7095 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007096 return true;
7097 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007098 // No target constraints for now.
7099 return false;
7100 }
7101 const char *getClobbers() const override {
7102 // FIXME: Is this really right?
7103 return "";
7104 }
7105 BuiltinVaListKind getBuiltinVaListKind() const override {
7106 // FIXME: implement
7107 return TargetInfo::CharPtrBuiltinVaList;
7108 }
7109};
7110
7111const char *const MSP430TargetInfo::GCCRegNames[] = {
7112 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7113 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7114
Craig Topperf054e3a2015-10-19 03:52:27 +00007115ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7116 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007117}
7118
7119// LLVM and Clang cannot be used directly to output native binaries for
7120// target, but is used to compile C code to llvm bitcode with correct
7121// type and alignment information.
7122//
7123// TCE uses the llvm bitcode as input and uses it for generating customized
7124// target processor and program binary. TCE co-design environment is
7125// publicly available in http://tce.cs.tut.fi
7126
7127static const unsigned TCEOpenCLAddrSpaceMap[] = {
7128 3, // opencl_global
7129 4, // opencl_local
7130 5, // opencl_constant
7131 // FIXME: generic has to be added to the target
7132 0, // opencl_generic
7133 0, // cuda_device
7134 0, // cuda_constant
7135 0 // cuda_shared
7136};
7137
7138class TCETargetInfo : public TargetInfo {
7139public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007140 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7141 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007142 TLSSupported = false;
7143 IntWidth = 32;
7144 LongWidth = LongLongWidth = 32;
7145 PointerWidth = 32;
7146 IntAlign = 32;
7147 LongAlign = LongLongAlign = 32;
7148 PointerAlign = 32;
7149 SuitableAlign = 32;
7150 SizeType = UnsignedInt;
7151 IntMaxType = SignedLong;
7152 IntPtrType = SignedInt;
7153 PtrDiffType = SignedInt;
7154 FloatWidth = 32;
7155 FloatAlign = 32;
7156 DoubleWidth = 32;
7157 DoubleAlign = 32;
7158 LongDoubleWidth = 32;
7159 LongDoubleAlign = 32;
7160 FloatFormat = &llvm::APFloat::IEEEsingle;
7161 DoubleFormat = &llvm::APFloat::IEEEsingle;
7162 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007163 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7164 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007165 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7166 UseAddrSpaceMapMangling = true;
7167 }
7168
7169 void getTargetDefines(const LangOptions &Opts,
7170 MacroBuilder &Builder) const override {
7171 DefineStd(Builder, "tce", Opts);
7172 Builder.defineMacro("__TCE__");
7173 Builder.defineMacro("__TCE_V1__");
7174 }
7175 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7176
Craig Topper6c03a542015-10-19 04:51:35 +00007177 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007178 const char *getClobbers() const override { return ""; }
7179 BuiltinVaListKind getBuiltinVaListKind() const override {
7180 return TargetInfo::VoidPtrBuiltinVaList;
7181 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007182 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007183 bool validateAsmConstraint(const char *&Name,
7184 TargetInfo::ConstraintInfo &info) const override {
7185 return true;
7186 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007187 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7188 return None;
7189 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007190};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007191
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007192class BPFTargetInfo : public TargetInfo {
7193public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007194 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7195 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007196 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7197 SizeType = UnsignedLong;
7198 PtrDiffType = SignedLong;
7199 IntPtrType = SignedLong;
7200 IntMaxType = SignedLong;
7201 Int64Type = SignedLong;
7202 RegParmMax = 5;
7203 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007204 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007205 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007206 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007207 }
7208 MaxAtomicPromoteWidth = 64;
7209 MaxAtomicInlineWidth = 64;
7210 TLSSupported = false;
7211 }
7212 void getTargetDefines(const LangOptions &Opts,
7213 MacroBuilder &Builder) const override {
7214 DefineStd(Builder, "bpf", Opts);
7215 Builder.defineMacro("__BPF__");
7216 }
7217 bool hasFeature(StringRef Feature) const override {
7218 return Feature == "bpf";
7219 }
7220
Craig Topper6c03a542015-10-19 04:51:35 +00007221 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007222 const char *getClobbers() const override {
7223 return "";
7224 }
7225 BuiltinVaListKind getBuiltinVaListKind() const override {
7226 return TargetInfo::VoidPtrBuiltinVaList;
7227 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007228 ArrayRef<const char *> getGCCRegNames() const override {
7229 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007230 }
7231 bool validateAsmConstraint(const char *&Name,
7232 TargetInfo::ConstraintInfo &info) const override {
7233 return true;
7234 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007235 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7236 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007237 }
7238};
7239
Daniel Sanders4672af62016-05-27 11:51:02 +00007240class MipsTargetInfo : public TargetInfo {
7241 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007242 StringRef Layout;
7243
7244 if (ABI == "o32")
7245 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7246 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007247 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007248 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007249 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007250 else
7251 llvm_unreachable("Invalid ABI");
7252
7253 if (BigEndian)
7254 resetDataLayout(("E-" + Layout).str());
7255 else
7256 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007257 }
7258
Akira Hatanaka9064e362013-10-29 18:30:33 +00007259
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007260 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007261 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007262 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007263 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007264 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007265 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007266 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007267 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007268 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007269 enum DspRevEnum {
7270 NoDSP, DSP1, DSP2
7271 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007272 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007273
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007274protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007275 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007276 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007277
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007278public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007279 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007280 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7281 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7282 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007283 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007284
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007285 setABI((getTriple().getArch() == llvm::Triple::mips ||
7286 getTriple().getArch() == llvm::Triple::mipsel)
7287 ? "o32"
7288 : "n64");
7289
7290 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007291 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007292
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007293 bool isNaN2008Default() const {
7294 return CPU == "mips32r6" || CPU == "mips64r6";
7295 }
7296
7297 bool isFP64Default() const {
7298 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7299 }
7300
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007301 bool isNan2008() const override {
7302 return IsNan2008;
7303 }
7304
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007305 bool processorSupportsGPR64() const {
7306 return llvm::StringSwitch<bool>(CPU)
7307 .Case("mips3", true)
7308 .Case("mips4", true)
7309 .Case("mips5", true)
7310 .Case("mips64", true)
7311 .Case("mips64r2", true)
7312 .Case("mips64r3", true)
7313 .Case("mips64r5", true)
7314 .Case("mips64r6", true)
7315 .Case("octeon", true)
7316 .Default(false);
7317 return false;
7318 }
7319
Alp Toker4925ba72014-06-07 23:30:42 +00007320 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007321 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007322 if (Name == "o32") {
7323 setO32ABITypes();
7324 ABI = Name;
7325 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007326 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007327
7328 if (Name == "n32") {
7329 setN32ABITypes();
7330 ABI = Name;
7331 return true;
7332 }
7333 if (Name == "n64") {
7334 setN64ABITypes();
7335 ABI = Name;
7336 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007337 }
7338 return false;
7339 }
7340
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007341 void setO32ABITypes() {
7342 Int64Type = SignedLongLong;
7343 IntMaxType = Int64Type;
7344 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7345 LongDoubleWidth = LongDoubleAlign = 64;
7346 LongWidth = LongAlign = 32;
7347 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7348 PointerWidth = PointerAlign = 32;
7349 PtrDiffType = SignedInt;
7350 SizeType = UnsignedInt;
7351 SuitableAlign = 64;
7352 }
7353
7354 void setN32N64ABITypes() {
7355 LongDoubleWidth = LongDoubleAlign = 128;
7356 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7357 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7358 LongDoubleWidth = LongDoubleAlign = 64;
7359 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7360 }
7361 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7362 SuitableAlign = 128;
7363 }
7364
Daniel Sanders4672af62016-05-27 11:51:02 +00007365 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007366 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007367 Int64Type = SignedLong;
7368 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007369 LongWidth = LongAlign = 64;
7370 PointerWidth = PointerAlign = 64;
7371 PtrDiffType = SignedLong;
7372 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007373 }
7374
7375 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007376 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007377 Int64Type = SignedLongLong;
7378 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007379 LongWidth = LongAlign = 32;
7380 PointerWidth = PointerAlign = 32;
7381 PtrDiffType = SignedInt;
7382 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007383 }
7384
Craig Topper3164f332014-03-11 03:39:26 +00007385 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007386 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007387 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007388 .Case("mips1", true)
7389 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007390 .Case("mips3", true)
7391 .Case("mips4", true)
7392 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007393 .Case("mips32", true)
7394 .Case("mips32r2", true)
7395 .Case("mips32r3", true)
7396 .Case("mips32r5", true)
7397 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007398 .Case("mips64", true)
7399 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007400 .Case("mips64r3", true)
7401 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007402 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007403 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007404 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007405 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007406 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007407 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007408 bool
7409 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7410 StringRef CPU,
7411 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007412 if (CPU.empty())
7413 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007414 if (CPU == "octeon")
7415 Features["mips64r2"] = Features["cnmips"] = true;
7416 else
7417 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007418 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007419 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007420
Craig Topper3164f332014-03-11 03:39:26 +00007421 void getTargetDefines(const LangOptions &Opts,
7422 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007423 if (BigEndian) {
7424 DefineStd(Builder, "MIPSEB", Opts);
7425 Builder.defineMacro("_MIPSEB");
7426 } else {
7427 DefineStd(Builder, "MIPSEL", Opts);
7428 Builder.defineMacro("_MIPSEL");
7429 }
7430
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007431 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007432 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007433 if (Opts.GNUMode)
7434 Builder.defineMacro("mips");
7435
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007436 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007437 Builder.defineMacro("__mips", "32");
7438 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7439 } else {
7440 Builder.defineMacro("__mips", "64");
7441 Builder.defineMacro("__mips64");
7442 Builder.defineMacro("__mips64__");
7443 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7444 }
7445
7446 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7447 .Cases("mips32", "mips64", "1")
7448 .Cases("mips32r2", "mips64r2", "2")
7449 .Cases("mips32r3", "mips64r3", "3")
7450 .Cases("mips32r5", "mips64r5", "5")
7451 .Cases("mips32r6", "mips64r6", "6")
7452 .Default("");
7453 if (!ISARev.empty())
7454 Builder.defineMacro("__mips_isa_rev", ISARev);
7455
7456 if (ABI == "o32") {
7457 Builder.defineMacro("__mips_o32");
7458 Builder.defineMacro("_ABIO32", "1");
7459 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007460 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007461 Builder.defineMacro("__mips_n32");
7462 Builder.defineMacro("_ABIN32", "2");
7463 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7464 } else if (ABI == "n64") {
7465 Builder.defineMacro("__mips_n64");
7466 Builder.defineMacro("_ABI64", "3");
7467 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7468 } else
7469 llvm_unreachable("Invalid ABI.");
7470
Simon Atanasyan683535b2012-08-29 19:14:58 +00007471 Builder.defineMacro("__REGISTER_PREFIX__", "");
7472
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007473 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007474 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007475 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007476 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007477 case SoftFloat:
7478 Builder.defineMacro("__mips_soft_float", Twine(1));
7479 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007480 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007481
Simon Atanasyan16071912013-04-14 14:07:30 +00007482 if (IsSingleFloat)
7483 Builder.defineMacro("__mips_single_float", Twine(1));
7484
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007485 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7486 Builder.defineMacro("_MIPS_FPSET",
7487 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7488
Simon Atanasyan72244b62012-07-05 16:06:06 +00007489 if (IsMips16)
7490 Builder.defineMacro("__mips16", Twine(1));
7491
Simon Atanasyan60777612013-04-14 14:07:51 +00007492 if (IsMicromips)
7493 Builder.defineMacro("__mips_micromips", Twine(1));
7494
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007495 if (IsNan2008)
7496 Builder.defineMacro("__mips_nan2008", Twine(1));
7497
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007498 switch (DspRev) {
7499 default:
7500 break;
7501 case DSP1:
7502 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7503 Builder.defineMacro("__mips_dsp", Twine(1));
7504 break;
7505 case DSP2:
7506 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7507 Builder.defineMacro("__mips_dspr2", Twine(1));
7508 Builder.defineMacro("__mips_dsp", Twine(1));
7509 break;
7510 }
7511
Jack Carter44ff1e52013-08-12 17:20:29 +00007512 if (HasMSA)
7513 Builder.defineMacro("__mips_msa", Twine(1));
7514
Simon Atanasyan26f19672012-04-05 19:28:31 +00007515 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7516 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7517 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007518
7519 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7520 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007521
7522 // These shouldn't be defined for MIPS-I but there's no need to check
7523 // for that since MIPS-I isn't supported.
7524 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7525 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7526 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007527
7528 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7529 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7530 // the instructions exist but using them violates the ABI since they
7531 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7532 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007533 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007534 }
7535
Craig Topper6c03a542015-10-19 04:51:35 +00007536 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7537 return llvm::makeArrayRef(BuiltinInfo,
7538 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007539 }
Craig Topper3164f332014-03-11 03:39:26 +00007540 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007541 return llvm::StringSwitch<bool>(Feature)
7542 .Case("mips", true)
7543 .Case("fp64", HasFP64)
7544 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007545 }
Craig Topper3164f332014-03-11 03:39:26 +00007546 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007547 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007548 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007549 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007550 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007551 // CPU register names
7552 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007553 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7554 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7555 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007556 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7557 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007558 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7559 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7560 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7561 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007562 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007563 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007564 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7565 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007566 // MSA register names
7567 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7568 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7569 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7570 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7571 // MSA control register names
7572 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7573 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007574 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007575 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007576 }
Craig Topper3164f332014-03-11 03:39:26 +00007577 bool validateAsmConstraint(const char *&Name,
7578 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007579 switch (*Name) {
7580 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007581 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007582 case 'r': // CPU registers.
7583 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007584 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007585 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007586 case 'c': // $25 for indirect jumps
7587 case 'l': // lo register
7588 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007589 Info.setAllowsRegister();
7590 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007591 case 'I': // Signed 16-bit constant
7592 case 'J': // Integer 0
7593 case 'K': // Unsigned 16-bit constant
7594 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7595 case 'M': // Constants not loadable via lui, addiu, or ori
7596 case 'N': // Constant -1 to -65535
7597 case 'O': // A signed 15-bit constant
7598 case 'P': // A constant between 1 go 65535
7599 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007600 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007601 Info.setAllowsMemory();
7602 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007603 case 'Z':
7604 if (Name[1] == 'C') { // An address usable by ll, and sc.
7605 Info.setAllowsMemory();
7606 Name++; // Skip over 'Z'.
7607 return true;
7608 }
7609 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007610 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007611 }
7612
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007613 std::string convertConstraint(const char *&Constraint) const override {
7614 std::string R;
7615 switch (*Constraint) {
7616 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7617 if (Constraint[1] == 'C') {
7618 R = std::string("^") + std::string(Constraint, 2);
7619 Constraint++;
7620 return R;
7621 }
7622 break;
7623 }
7624 return TargetInfo::convertConstraint(Constraint);
7625 }
7626
Craig Topper3164f332014-03-11 03:39:26 +00007627 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007628 // In GCC, $1 is not widely used in generated code (it's used only in a few
7629 // specific situations), so there is no real need for users to add it to
7630 // the clobbers list if they want to use it in their inline assembly code.
7631 //
7632 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7633 // code generation, so using it in inline assembly without adding it to the
7634 // clobbers list can cause conflicts between the inline assembly code and
7635 // the surrounding generated code.
7636 //
7637 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7638 // operands, which will conflict with the ".set at" assembler option (which
7639 // we use only for inline assembly, in order to maintain compatibility with
7640 // GCC) and will also conflict with the user's usage of $1.
7641 //
7642 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7643 // register for generated code is to automatically clobber $1 for all inline
7644 // assembly code.
7645 //
7646 // FIXME: We should automatically clobber $1 only for inline assembly code
7647 // which actually uses it. This would allow LLVM to use $1 for inline
7648 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007649 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007650 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007651
Craig Topper3164f332014-03-11 03:39:26 +00007652 bool handleTargetFeatures(std::vector<std::string> &Features,
7653 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007654 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007655 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007656 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007657 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007658 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007659 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007660 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007661
Eric Christopher610fe112015-08-26 08:21:55 +00007662 for (const auto &Feature : Features) {
7663 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007664 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007665 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007666 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007667 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007668 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007669 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007670 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007671 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007672 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007673 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007674 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007675 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007676 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007677 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007678 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007679 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007680 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007681 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007682 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007683 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007684 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007685 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007686
James Y Knightb214cbc2016-03-04 19:00:41 +00007687 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007688
Rafael Espindolaeb265472013-08-21 21:59:03 +00007689 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007690 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007691
Craig Topper3164f332014-03-11 03:39:26 +00007692 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007693 if (RegNo == 0) return 4;
7694 if (RegNo == 1) return 5;
7695 return -1;
7696 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007697
7698 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007699
7700 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7701 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7702 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7703 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7704 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7705 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7706 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7707 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7708 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7709 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7710 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7711 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7712 {{"ra"}, "$31"}};
7713 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7714 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7715 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7716 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7717 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7718 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7719 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7720 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7721 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7722 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7723 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7724 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007725 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007726 return llvm::makeArrayRef(O32RegAliases);
7727 return llvm::makeArrayRef(NewABIRegAliases);
7728 }
7729
7730 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007731 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007732 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007733
7734 bool validateTarget(DiagnosticsEngine &Diags) const override {
7735 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7736 // this yet. It's better to fail here than on the backend assertion.
7737 if (processorSupportsGPR64() && ABI == "o32") {
7738 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7739 return false;
7740 }
7741
7742 // 64-bit ABI's require 64-bit CPU's.
7743 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7744 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7745 return false;
7746 }
7747
7748 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7749 // can't handle this yet. It's better to fail here than on the
7750 // backend assertion.
7751 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7752 getTriple().getArch() == llvm::Triple::mips64el) &&
7753 ABI == "o32") {
7754 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7755 << ABI << getTriple().str();
7756 return false;
7757 }
7758
7759 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7760 // can't handle this yet. It's better to fail here than on the
7761 // backend assertion.
7762 if ((getTriple().getArch() == llvm::Triple::mips ||
7763 getTriple().getArch() == llvm::Triple::mipsel) &&
7764 (ABI == "n32" || ABI == "n64")) {
7765 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7766 << ABI << getTriple().str();
7767 return false;
7768 }
7769
7770 return true;
7771 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007772};
7773
Daniel Sanders4672af62016-05-27 11:51:02 +00007774const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007775#define BUILTIN(ID, TYPE, ATTRS) \
7776 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7777#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7778 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007779#include "clang/Basic/BuiltinsMips.def"
7780};
7781
Ivan Krasindd7403e2011-08-24 20:22:22 +00007782class PNaClTargetInfo : public TargetInfo {
7783public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007784 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7785 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007786 this->LongAlign = 32;
7787 this->LongWidth = 32;
7788 this->PointerAlign = 32;
7789 this->PointerWidth = 32;
7790 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007791 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007792 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007793 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007794 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007795 this->SizeType = TargetInfo::UnsignedInt;
7796 this->PtrDiffType = TargetInfo::SignedInt;
7797 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007798 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007799 }
7800
Craig Toppere6f17d02014-03-11 04:07:52 +00007801 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007802 Builder.defineMacro("__le32__");
7803 Builder.defineMacro("__pnacl__");
7804 }
Craig Topper3164f332014-03-11 03:39:26 +00007805 void getTargetDefines(const LangOptions &Opts,
7806 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007807 getArchDefines(Opts, Builder);
7808 }
Craig Topper3164f332014-03-11 03:39:26 +00007809 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007810 return Feature == "pnacl";
7811 }
Craig Topper6c03a542015-10-19 04:51:35 +00007812 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007813 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007814 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007815 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007816 ArrayRef<const char *> getGCCRegNames() const override;
7817 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007818 bool validateAsmConstraint(const char *&Name,
7819 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007820 return false;
7821 }
7822
Craig Topper3164f332014-03-11 03:39:26 +00007823 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007824 return "";
7825 }
7826};
7827
Craig Topperf054e3a2015-10-19 03:52:27 +00007828ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7829 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007830}
7831
Craig Topperf054e3a2015-10-19 03:52:27 +00007832ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7833 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007834}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007835
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007836// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007837class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007838public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007839 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7840 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007841
7842 BuiltinVaListKind getBuiltinVaListKind() const override {
7843 return TargetInfo::PNaClABIBuiltinVaList;
7844 }
7845};
7846
JF Bastien643817d2014-09-12 17:52:47 +00007847class Le64TargetInfo : public TargetInfo {
7848 static const Builtin::Info BuiltinInfo[];
7849
7850public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007851 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7852 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007853 NoAsmVariants = true;
7854 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7855 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007856 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007857 }
7858
7859 void getTargetDefines(const LangOptions &Opts,
7860 MacroBuilder &Builder) const override {
7861 DefineStd(Builder, "unix", Opts);
7862 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7863 Builder.defineMacro("__ELF__");
7864 }
Craig Topper6c03a542015-10-19 04:51:35 +00007865 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7866 return llvm::makeArrayRef(BuiltinInfo,
7867 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007868 }
7869 BuiltinVaListKind getBuiltinVaListKind() const override {
7870 return TargetInfo::PNaClABIBuiltinVaList;
7871 }
7872 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007873 ArrayRef<const char *> getGCCRegNames() const override {
7874 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007875 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007876 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7877 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007878 }
7879 bool validateAsmConstraint(const char *&Name,
7880 TargetInfo::ConstraintInfo &Info) const override {
7881 return false;
7882 }
7883
7884 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007885};
Dan Gohmanc2853072015-09-03 22:51:53 +00007886
7887class WebAssemblyTargetInfo : public TargetInfo {
7888 static const Builtin::Info BuiltinInfo[];
7889
7890 enum SIMDEnum {
7891 NoSIMD,
7892 SIMD128,
7893 } SIMDLevel;
7894
7895public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007896 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007897 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007898 NoAsmVariants = true;
7899 SuitableAlign = 128;
7900 LargeArrayMinWidth = 128;
7901 LargeArrayAlign = 128;
7902 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007903 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007904 LongDoubleWidth = LongDoubleAlign = 128;
7905 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007906 SizeType = UnsignedInt;
7907 PtrDiffType = SignedInt;
7908 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007909 }
7910
7911protected:
7912 void getTargetDefines(const LangOptions &Opts,
7913 MacroBuilder &Builder) const override {
7914 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7915 if (SIMDLevel >= SIMD128)
7916 Builder.defineMacro("__wasm_simd128__");
7917 }
7918
7919private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007920 bool
7921 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7922 StringRef CPU,
7923 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007924 if (CPU == "bleeding-edge")
7925 Features["simd128"] = true;
7926 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7927 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007928 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007929 return llvm::StringSwitch<bool>(Feature)
7930 .Case("simd128", SIMDLevel >= SIMD128)
7931 .Default(false);
7932 }
7933 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007934 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007935 for (const auto &Feature : Features) {
7936 if (Feature == "+simd128") {
7937 SIMDLevel = std::max(SIMDLevel, SIMD128);
7938 continue;
7939 }
7940 if (Feature == "-simd128") {
7941 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7942 continue;
7943 }
7944
7945 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7946 << "-target-feature";
7947 return false;
7948 }
7949 return true;
7950 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007951 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007952 return llvm::StringSwitch<bool>(Name)
7953 .Case("mvp", true)
7954 .Case("bleeding-edge", true)
7955 .Case("generic", true)
7956 .Default(false);
7957 }
Craig Topper6c03a542015-10-19 04:51:35 +00007958 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7959 return llvm::makeArrayRef(BuiltinInfo,
7960 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007961 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007962 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007963 return VoidPtrBuiltinVaList;
7964 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007965 ArrayRef<const char *> getGCCRegNames() const final {
7966 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007967 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007968 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7969 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007970 }
7971 bool
7972 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007973 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007974 return false;
7975 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007976 const char *getClobbers() const final { return ""; }
7977 bool isCLZForZeroUndef() const final { return false; }
7978 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007979 IntType getIntTypeByWidth(unsigned BitWidth,
7980 bool IsSigned) const final {
7981 // WebAssembly prefers long long for explicitly 64-bit integers.
7982 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7983 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7984 }
7985 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7986 bool IsSigned) const final {
7987 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7988 return BitWidth == 64
7989 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7990 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7991 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007992};
7993
7994const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7995#define BUILTIN(ID, TYPE, ATTRS) \
7996 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7997#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7998 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7999#include "clang/Basic/BuiltinsWebAssembly.def"
8000};
8001
8002class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8003public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008004 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8005 const TargetOptions &Opts)
8006 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008007 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008008 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008009 }
8010
8011protected:
8012 void getTargetDefines(const LangOptions &Opts,
8013 MacroBuilder &Builder) const override {
8014 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8015 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8016 }
8017};
8018
8019class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8020public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008021 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8022 const TargetOptions &Opts)
8023 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008024 LongAlign = LongWidth = 64;
8025 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008026 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008027 SizeType = UnsignedLong;
8028 PtrDiffType = SignedLong;
8029 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008030 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008031 }
8032
8033protected:
8034 void getTargetDefines(const LangOptions &Opts,
8035 MacroBuilder &Builder) const override {
8036 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8037 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8038 }
8039};
8040
JF Bastien643817d2014-09-12 17:52:47 +00008041const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8042#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008043 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008044#include "clang/Basic/BuiltinsLe64.def"
8045};
8046
Eric Christopherc48497a2015-09-18 21:26:24 +00008047static const unsigned SPIRAddrSpaceMap[] = {
8048 1, // opencl_global
8049 3, // opencl_local
8050 2, // opencl_constant
8051 4, // opencl_generic
8052 0, // cuda_device
8053 0, // cuda_constant
8054 0 // cuda_shared
8055};
8056class SPIRTargetInfo : public TargetInfo {
8057public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008058 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8059 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008060 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8061 "SPIR target must use unknown OS");
8062 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8063 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008064 TLSSupported = false;
8065 LongWidth = LongAlign = 64;
8066 AddrSpaceMap = &SPIRAddrSpaceMap;
8067 UseAddrSpaceMapMangling = true;
8068 // Define available target features
8069 // These must be defined in sorted order!
8070 NoAsmVariants = true;
8071 }
8072 void getTargetDefines(const LangOptions &Opts,
8073 MacroBuilder &Builder) const override {
8074 DefineStd(Builder, "SPIR", Opts);
8075 }
8076 bool hasFeature(StringRef Feature) const override {
8077 return Feature == "spir";
8078 }
Craig Topper3164f332014-03-11 03:39:26 +00008079
Craig Topper6c03a542015-10-19 04:51:35 +00008080 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008081 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008082 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008083 bool validateAsmConstraint(const char *&Name,
8084 TargetInfo::ConstraintInfo &info) const override {
8085 return true;
8086 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008087 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8088 return None;
8089 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008090 BuiltinVaListKind getBuiltinVaListKind() const override {
8091 return TargetInfo::VoidPtrBuiltinVaList;
8092 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008093
Eric Christopherc48497a2015-09-18 21:26:24 +00008094 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008095 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8096 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008097 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008098
Eric Christopherc48497a2015-09-18 21:26:24 +00008099 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8100 return CC_SpirFunction;
8101 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008102
8103 void setSupportedOpenCLOpts() override {
8104 // Assume all OpenCL extensions and optional core features are supported
8105 // for SPIR since it is a generic target.
8106 getSupportedOpenCLOpts().setAll();
8107 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008108};
Guy Benyeib798fc92012-12-11 21:38:14 +00008109
Eric Christopherc48497a2015-09-18 21:26:24 +00008110class SPIR32TargetInfo : public SPIRTargetInfo {
8111public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008112 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8113 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008114 PointerWidth = PointerAlign = 32;
8115 SizeType = TargetInfo::UnsignedInt;
8116 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008117 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8118 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008119 }
8120 void getTargetDefines(const LangOptions &Opts,
8121 MacroBuilder &Builder) const override {
8122 DefineStd(Builder, "SPIR32", Opts);
8123 }
8124};
Guy Benyeib798fc92012-12-11 21:38:14 +00008125
Eric Christopherc48497a2015-09-18 21:26:24 +00008126class SPIR64TargetInfo : public SPIRTargetInfo {
8127public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008128 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8129 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008130 PointerWidth = PointerAlign = 64;
8131 SizeType = TargetInfo::UnsignedLong;
8132 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008133 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8134 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008135 }
8136 void getTargetDefines(const LangOptions &Opts,
8137 MacroBuilder &Builder) const override {
8138 DefineStd(Builder, "SPIR64", Opts);
8139 }
8140};
Guy Benyeib798fc92012-12-11 21:38:14 +00008141
Robert Lytton0e076492013-08-13 09:43:10 +00008142class XCoreTargetInfo : public TargetInfo {
8143 static const Builtin::Info BuiltinInfo[];
8144public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008145 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8146 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008147 NoAsmVariants = true;
8148 LongLongAlign = 32;
8149 SuitableAlign = 32;
8150 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008151 SizeType = UnsignedInt;
8152 PtrDiffType = SignedInt;
8153 IntPtrType = SignedInt;
8154 WCharType = UnsignedChar;
8155 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008156 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008157 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8158 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008159 }
Craig Topper3164f332014-03-11 03:39:26 +00008160 void getTargetDefines(const LangOptions &Opts,
8161 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008162 Builder.defineMacro("__XS1B__");
8163 }
Craig Topper6c03a542015-10-19 04:51:35 +00008164 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8165 return llvm::makeArrayRef(BuiltinInfo,
8166 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008167 }
Craig Topper3164f332014-03-11 03:39:26 +00008168 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008169 return TargetInfo::VoidPtrBuiltinVaList;
8170 }
Craig Topper3164f332014-03-11 03:39:26 +00008171 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008172 return "";
8173 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008174 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008175 static const char * const GCCRegNames[] = {
8176 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8177 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8178 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008179 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008180 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008181 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8182 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008183 }
Craig Topper3164f332014-03-11 03:39:26 +00008184 bool validateAsmConstraint(const char *&Name,
8185 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008186 return false;
8187 }
Craig Topper3164f332014-03-11 03:39:26 +00008188 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008189 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8190 return (RegNo < 2)? RegNo : -1;
8191 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008192 bool allowsLargerPreferedTypeAlignment() const override {
8193 return false;
8194 }
Robert Lytton0e076492013-08-13 09:43:10 +00008195};
8196
8197const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008198#define BUILTIN(ID, TYPE, ATTRS) \
8199 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8200#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8201 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008202#include "clang/Basic/BuiltinsXCore.def"
8203};
Robert Lytton0e076492013-08-13 09:43:10 +00008204
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008205// x86_32 Android target
8206class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8207public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008208 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8209 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008210 SuitableAlign = 32;
8211 LongDoubleWidth = 64;
8212 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8213 }
8214};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008215
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008216// x86_64 Android target
8217class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8218public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008219 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8220 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008221 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8222 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008223
8224 bool useFloat128ManglingForLongDouble() const override {
8225 return true;
8226 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008227};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008228
8229// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8230class RenderScript32TargetInfo : public ARMleTargetInfo {
8231public:
8232 RenderScript32TargetInfo(const llvm::Triple &Triple,
8233 const TargetOptions &Opts)
8234 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8235 Triple.getOSName(),
8236 Triple.getEnvironmentName()),
8237 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008238 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008239 LongWidth = LongAlign = 64;
8240 }
8241 void getTargetDefines(const LangOptions &Opts,
8242 MacroBuilder &Builder) const override {
8243 Builder.defineMacro("__RENDERSCRIPT__");
8244 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8245 }
8246};
8247
8248// 64-bit RenderScript is aarch64
8249class RenderScript64TargetInfo : public AArch64leTargetInfo {
8250public:
8251 RenderScript64TargetInfo(const llvm::Triple &Triple,
8252 const TargetOptions &Opts)
8253 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8254 Triple.getOSName(),
8255 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008256 Opts) {
8257 IsRenderScriptTarget = true;
8258 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008259
8260 void getTargetDefines(const LangOptions &Opts,
8261 MacroBuilder &Builder) const override {
8262 Builder.defineMacro("__RENDERSCRIPT__");
8263 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8264 }
8265};
8266
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008267} // end anonymous namespace
8268
Chris Lattner5ba61f02006-10-14 07:39:34 +00008269//===----------------------------------------------------------------------===//
8270// Driver code
8271//===----------------------------------------------------------------------===//
8272
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8274 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008275 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008276
Daniel Dunbar52322032009-08-18 05:47:58 +00008277 switch (Triple.getArch()) {
8278 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008279 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008280
Tim Northover2a0783d2014-05-30 14:14:07 +00008281 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008282 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008283
8284 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008285 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008286
Jacques Pienaard964cc22016-03-28 21:02:54 +00008287 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008288 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008289
Tim Northover2a0783d2014-05-30 14:14:07 +00008290 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008291 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008292 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008293
8294 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008295 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008296 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008297 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008298 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008299 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008300 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008301 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008302 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek62e1d232016-10-06 06:08:09 +00008303 case llvm::Triple::Fuchsia:
8304 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008305 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008306 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008307 }
8308
Christian Pirker9b019ae2014-02-25 13:51:00 +00008309 case llvm::Triple::aarch64_be:
8310 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008311 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008312 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008313 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008314 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008315 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008316 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008317 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008318 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008319 }
8320
Daniel Dunbar52322032009-08-18 05:47:58 +00008321 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008322 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008323 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008324 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008325
Daniel Dunbar52322032009-08-18 05:47:58 +00008326 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008327 case llvm::Triple::CloudABI:
8328 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008329 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008330 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008331 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008332 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008333 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008334 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008335 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008336 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008337 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008338 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008339 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008340 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008341 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008342 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008343 case llvm::Triple::Win32:
8344 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008345 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008346 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008347 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008348 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008349 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008350 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008351 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008352 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008353 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008354 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008355 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008356 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008357 }
8358
8359 case llvm::Triple::armeb:
8360 case llvm::Triple::thumbeb:
8361 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008362 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008363
8364 switch (os) {
8365 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008366 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008367 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008368 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008369 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008370 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008371 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008372 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008373 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008374 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008375 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008376 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008377 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008378 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008379 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008380 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008381 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008382
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008383 case llvm::Triple::bpfeb:
8384 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008385 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008386
Daniel Dunbar52322032009-08-18 05:47:58 +00008387 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008388 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008389
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008390 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008391 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008392 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008393 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008394 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008395 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008396 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008397 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008398 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008399 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008400 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008401 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008402 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008403
8404 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008405 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008406 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008407 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008408 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008409 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008410 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008411 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008412 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008413 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008414 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008415 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008416 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008417 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008418 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008419
Akira Hatanakabef17452011-09-20 19:21:49 +00008420 case llvm::Triple::mips64:
8421 switch (os) {
8422 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008423 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008424 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008425 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008426 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008427 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008428 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008429 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008430 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008431 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008432 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008433 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008434 }
8435
8436 case llvm::Triple::mips64el:
8437 switch (os) {
8438 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008439 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008440 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008441 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008442 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008443 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008444 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008445 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008446 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008447 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008448 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008449 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008450 }
8451
Ivan Krasindd7403e2011-08-24 20:22:22 +00008452 case llvm::Triple::le32:
8453 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008454 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008455 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008456 default:
8457 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008458 }
8459
JF Bastien643817d2014-09-12 17:52:47 +00008460 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008461 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008462
Daniel Dunbar52322032009-08-18 05:47:58 +00008463 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008464 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008466 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008467 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008468 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008469 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008470 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008471 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008472 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008473 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008474 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008475 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008476 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008477 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008478 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008479 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008480
8481 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008482 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008483 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008484 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008485 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008486 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008487 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008488 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008489 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008490 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008491 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008492 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008493 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008494 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008495 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008496
Bill Schmidt778d3872013-07-26 01:36:11 +00008497 case llvm::Triple::ppc64le:
8498 switch (os) {
8499 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008500 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008501 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008502 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008503 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008504 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008505 }
8506
Peter Collingbournec947aae2012-05-20 23:28:41 +00008507 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008508 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008509 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008510 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008511
Tom Stellardd8e38a32015-01-06 20:34:47 +00008512 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008513 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008514 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008515
Daniel Dunbar52322032009-08-18 05:47:58 +00008516 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008517 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008518 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008520 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008521 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008522 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008523 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008524 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008525 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008526 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008527 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008528 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008529 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008530 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008531
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008532 // The 'sparcel' architecture copies all the above cases except for Solaris.
8533 case llvm::Triple::sparcel:
8534 switch (os) {
8535 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008536 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008537 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008538 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008539 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008540 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008541 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008542 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008543 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008544 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008545 }
8546
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008547 case llvm::Triple::sparcv9:
8548 switch (os) {
8549 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008550 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008551 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008552 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008553 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008554 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008555 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008556 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008557 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008558 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008559 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008560 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008561 }
8562
Ulrich Weigand47445072013-05-06 16:26:41 +00008563 case llvm::Triple::systemz:
8564 switch (os) {
8565 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008566 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008567 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008568 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008569 }
8570
Eli Friedmana9c3d712009-08-19 20:47:07 +00008571 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008572 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008573
Daniel Dunbar52322032009-08-18 05:47:58 +00008574 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008575 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008576 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008577
Daniel Dunbar52322032009-08-18 05:47:58 +00008578 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008579 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008580 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008581 case llvm::Triple::Linux: {
8582 switch (Triple.getEnvironment()) {
8583 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008584 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008585 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008586 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008587 }
8588 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008589 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008590 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008591 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008592 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008593 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008594 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008595 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008596 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008597 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008598 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008599 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008600 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008601 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008602 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008603 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008604 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008605 case llvm::Triple::Win32: {
8606 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008607 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008608 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008609 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008610 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008611 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008612 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008613 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008614 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008615 }
8616 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008617 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008618 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008619 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008620 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008621 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008622 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008623 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008624 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008625 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008626 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008627 }
8628
8629 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008630 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008631 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008632
Daniel Dunbar52322032009-08-18 05:47:58 +00008633 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008634 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008635 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008636 case llvm::Triple::Linux: {
8637 switch (Triple.getEnvironment()) {
8638 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008639 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008640 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008641 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008642 }
8643 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008644 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008645 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008646 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008647 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008648 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008649 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008650 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008651 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008652 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008653 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008654 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008655 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008656 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008657 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008658 case llvm::Triple::Win32: {
8659 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008660 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008661 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008662 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008663 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008664 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008665 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008666 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008667 }
8668 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008669 case llvm::Triple::Haiku:
8670 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008671 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008672 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek62e1d232016-10-06 06:08:09 +00008673 case llvm::Triple::Fuchsia:
8674 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008675 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008676 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008677 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008678 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008679 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008680
Douglas Katzman78d7c542015-05-12 21:18:10 +00008681 case llvm::Triple::spir: {
8682 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8683 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8684 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008685 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008686 }
8687 case llvm::Triple::spir64: {
8688 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8689 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8690 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008691 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008692 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008693 case llvm::Triple::wasm32:
8694 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8695 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008696 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008697 case llvm::Triple::wasm64:
8698 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8699 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008700 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008701
8702 case llvm::Triple::renderscript32:
8703 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8704 case llvm::Triple::renderscript64:
8705 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008706 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008707}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008708
8709/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008710/// options.
Alp Toker80758082014-07-06 05:26:44 +00008711TargetInfo *
8712TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008713 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008714 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008715
8716 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008717 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008718 if (!Target) {
8719 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008720 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008721 }
Alp Toker80758082014-07-06 05:26:44 +00008722 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008723
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008724 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008725 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8726 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008727 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008728 }
8729
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008730 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008731 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8732 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008733 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008734 }
8735
Rafael Espindolaeb265472013-08-21 21:59:03 +00008736 // Set the fp math unit.
8737 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8738 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008739 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008740 }
8741
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008742 // Compute the default target features, we need the target to handle this
8743 // because features may have dependencies on one another.
8744 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008745 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8746 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008747 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008748
8749 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008750 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008751 for (const auto &F : Features)
8752 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8753
Eric Christopher3ff21b32013-10-16 21:26:26 +00008754 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008755 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008756
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008757 Target->setSupportedOpenCLOpts();
8758
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008759 if (!Target->validateTarget(Diags))
8760 return nullptr;
8761
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008762 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008763}