blob: 8e30ba1713b7f0e93ced9f419a6c047da44f2d18 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346 DefineStd(Builder, "unix", Opts);
347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
391 DefineStd(Builder, "unix", Opts);
392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
414 DefineStd(Builder, "unix", Opts);
415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000809 // RegParmMax is inherited from the underlying architecture.
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
Dan Gohmanc2853072015-09-03 22:51:53 +0000826// WebAssembly target
827template <typename Target>
828class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
829 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000830 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000831 // A common platform macro.
832 if (Opts.POSIXThreads)
833 Builder.defineMacro("_REENTRANT");
834 // Follow g++ convention and predefine _GNU_SOURCE for C++.
835 if (Opts.CPlusPlus)
836 Builder.defineMacro("_GNU_SOURCE");
837 }
838
839 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000840 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000841 return ".text.__startup";
842 }
843
844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000845 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000848 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000849 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
850 }
851};
Dan Gohmanc2853072015-09-03 22:51:53 +0000852
Chris Lattner09d98f52008-10-05 21:50:58 +0000853//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000854// Specific target implementations.
855//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857// PPC abstract base class
858class PPCTargetInfo : public TargetInfo {
859 static const Builtin::Info BuiltinInfo[];
860 static const char * const GCCRegNames[];
861 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000862 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000863
864 // Target cpu features.
865 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000866 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000867 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000868 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000869 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000870 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000871 bool HasBPERMD;
872 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000873 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000874
Ulrich Weigand8afad612014-07-28 13:17:52 +0000875protected:
876 std::string ABI;
877
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000878public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000879 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000880 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
881 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000882 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000883 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000884 LongDoubleWidth = LongDoubleAlign = 128;
885 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
886 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000887
Hal Finkel6b984f02012-07-03 16:51:04 +0000888 /// \brief Flags for architecture specific defines.
889 typedef enum {
890 ArchDefineNone = 0,
891 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
892 ArchDefinePpcgr = 1 << 1,
893 ArchDefinePpcsq = 1 << 2,
894 ArchDefine440 = 1 << 3,
895 ArchDefine603 = 1 << 4,
896 ArchDefine604 = 1 << 5,
897 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000898 ArchDefinePwr5 = 1 << 7,
899 ArchDefinePwr5x = 1 << 8,
900 ArchDefinePwr6 = 1 << 9,
901 ArchDefinePwr6x = 1 << 10,
902 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000903 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000904 ArchDefinePwr9 = 1 << 13,
905 ArchDefineA2 = 1 << 14,
906 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000907 } ArchDefineTypes;
908
Bill Schmidt38378a02013-02-01 20:23:10 +0000909 // Note: GCC recognizes the following additional cpus:
910 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
911 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
912 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000913 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000914 bool CPUKnown = llvm::StringSwitch<bool>(Name)
915 .Case("generic", true)
916 .Case("440", true)
917 .Case("450", true)
918 .Case("601", true)
919 .Case("602", true)
920 .Case("603", true)
921 .Case("603e", true)
922 .Case("603ev", true)
923 .Case("604", true)
924 .Case("604e", true)
925 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000927 .Case("g3", true)
928 .Case("7400", true)
929 .Case("g4", true)
930 .Case("7450", true)
931 .Case("g4+", true)
932 .Case("750", true)
933 .Case("970", true)
934 .Case("g5", true)
935 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000936 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000937 .Case("e500mc", true)
938 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000939 .Case("power3", true)
940 .Case("pwr3", true)
941 .Case("power4", true)
942 .Case("pwr4", true)
943 .Case("power5", true)
944 .Case("pwr5", true)
945 .Case("power5x", true)
946 .Case("pwr5x", true)
947 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000948 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000949 .Case("power6x", true)
950 .Case("pwr6x", true)
951 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000952 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000953 .Case("power8", true)
954 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000955 .Case("power9", true)
956 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000957 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000958 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000959 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000960 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000961 .Case("powerpc64le", true)
962 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000963 .Default(false);
964
965 if (CPUKnown)
966 CPU = Name;
967
968 return CPUKnown;
969 }
970
Ulrich Weigand8afad612014-07-28 13:17:52 +0000971
972 StringRef getABI() const override { return ABI; }
973
Craig Topper6c03a542015-10-19 04:51:35 +0000974 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
975 return llvm::makeArrayRef(BuiltinInfo,
976 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000977 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Craig Topper3164f332014-03-11 03:39:26 +0000979 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000980
Craig Topper3164f332014-03-11 03:39:26 +0000981 void getTargetDefines(const LangOptions &Opts,
982 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000983
Eric Christopher8c47b422015-10-09 18:39:55 +0000984 bool
985 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
986 StringRef CPU,
987 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000988
Craig Topper3164f332014-03-11 03:39:26 +0000989 bool handleTargetFeatures(std::vector<std::string> &Features,
990 DiagnosticsEngine &Diags) override;
991 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000992 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
993 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000994
Craig Topperf054e3a2015-10-19 03:52:27 +0000995 ArrayRef<const char *> getGCCRegNames() const override;
996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000997 bool validateAsmConstraint(const char *&Name,
998 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000999 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001000 default: return false;
1001 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001002 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001003 case 'b': // Base register
1004 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001005 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001006 break;
1007 // FIXME: The following are added to allow parsing.
1008 // I just took a guess at what the actions should be.
1009 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001010 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001011 case 'v': // Altivec vector register
1012 Info.setAllowsRegister();
1013 break;
1014 case 'w':
1015 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001016 case 'd':// VSX vector register to hold vector double data
1017 case 'f':// VSX vector register to hold vector float data
1018 case 's':// VSX vector register to hold scalar float data
1019 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001020 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001021 break;
1022 default:
1023 return false;
1024 }
1025 Info.setAllowsRegister();
1026 Name++; // Skip over 'w'.
1027 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 case 'h': // `MQ', `CTR', or `LINK' register
1029 case 'q': // `MQ' register
1030 case 'c': // `CTR' register
1031 case 'l': // `LINK' register
1032 case 'x': // `CR' register (condition register) number 0
1033 case 'y': // `CR' register (condition register)
1034 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001035 Info.setAllowsRegister();
1036 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001037 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001038 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001039 // (use `L' instead for SImode constants)
1040 case 'K': // Unsigned 16-bit constant
1041 case 'L': // Signed 16-bit constant shifted left 16 bits
1042 case 'M': // Constant larger than 31
1043 case 'N': // Exact power of 2
1044 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001045 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001046 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001047 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001048 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001049 break;
1050 case 'm': // Memory operand. Note that on PowerPC targets, m can
1051 // include addresses that update the base register. It
1052 // is therefore only safe to use `m' in an asm statement
1053 // if that asm statement accesses the operand exactly once.
1054 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001055 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001056 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001057 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001058 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001059 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1060 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // register to be updated.
1062 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001063 if (Name[1] != 's')
1064 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001065 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001066 // include any automodification of the base register. Unlike
1067 // `m', this constraint can be used in asm statements that
1068 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001069 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001070 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001071 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001072 break;
1073 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001075 case 'Z': // Memory operand that is an indexed or indirect from a
1076 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001077 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001078 Info.setAllowsMemory();
1079 Info.setAllowsRegister();
1080 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001081 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001082 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // register (`p' is preferable for asm statements)
1084 case 'S': // Constant suitable as a 64-bit mask operand
1085 case 'T': // Constant suitable as a 32-bit mask operand
1086 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001087 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001088 // instructions
1089 case 'W': // Vector constant that does not require memory
1090 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001091 break;
1092 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001093 }
John Thompson07a61a42010-06-24 22:44:13 +00001094 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001095 }
Craig Topper3164f332014-03-11 03:39:26 +00001096 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001097 std::string R;
1098 switch (*Constraint) {
1099 case 'e':
1100 case 'w':
1101 // Two-character constraint; add "^" hint for later parsing.
1102 R = std::string("^") + std::string(Constraint, 2);
1103 Constraint++;
1104 break;
1105 default:
1106 return TargetInfo::convertConstraint(Constraint);
1107 }
1108 return R;
1109 }
Craig Topper3164f332014-03-11 03:39:26 +00001110 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001111 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001112 }
Craig Topper3164f332014-03-11 03:39:26 +00001113 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001114 if (RegNo == 0) return 3;
1115 if (RegNo == 1) return 4;
1116 return -1;
1117 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001118
1119 bool hasSjLjLowering() const override {
1120 return true;
1121 }
David Majnemer2617ea62015-06-09 18:05:33 +00001122
1123 bool useFloat128ManglingForLongDouble() const override {
1124 return LongDoubleWidth == 128 &&
1125 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1126 getTriple().isOSBinFormatELF();
1127 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001128};
Anders Carlssonf511f642007-11-27 04:11:28 +00001129
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001130const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001131#define BUILTIN(ID, TYPE, ATTRS) \
1132 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1133#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1134 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001135#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001136};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001137
Eric Christopher917e9522014-11-18 22:36:15 +00001138/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001139/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001140bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001141 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001142 for (const auto &Feature : Features) {
1143 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001144 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001145 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001146 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001147 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001148 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001149 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001150 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001151 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001152 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001153 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001154 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001155 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001156 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001157 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001158 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001159 } else if (Feature == "+float128") {
1160 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001161 } else if (Feature == "+power9-vector") {
1162 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001163 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001164 // TODO: Finish this list and add an assert that we've handled them
1165 // all.
1166 }
Eric Christopher02c33352015-08-25 00:59:11 +00001167
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001168 return true;
1169}
1170
Chris Lattnerecd49032009-03-02 22:27:17 +00001171/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1172/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001173void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001174 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001175 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001176 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001177 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001178 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001179 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001180 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001181 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001182 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001183 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001184 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001185 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001186 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001187
Chris Lattnerecd49032009-03-02 22:27:17 +00001188 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001189 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1190 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001191 } else {
1192 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1193 getTriple().getOS() != llvm::Triple::OpenBSD)
1194 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001195 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001196
Ulrich Weigand8afad612014-07-28 13:17:52 +00001197 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001198 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001199 Builder.defineMacro("_CALL_ELF", "1");
1200 if (ABI == "elfv2")
1201 Builder.defineMacro("_CALL_ELF", "2");
1202
Chris Lattnerecd49032009-03-02 22:27:17 +00001203 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1205 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001206
Chris Lattnerecd49032009-03-02 22:27:17 +00001207 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001208 if (LongDoubleWidth == 128)
1209 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001210
John Thompsone467e192009-11-19 17:18:50 +00001211 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001212 Builder.defineMacro("__VEC__", "10206");
1213 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001214 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001215
1216 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001217 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1218 .Case("440", ArchDefineName)
1219 .Case("450", ArchDefineName | ArchDefine440)
1220 .Case("601", ArchDefineName)
1221 .Case("602", ArchDefineName | ArchDefinePpcgr)
1222 .Case("603", ArchDefineName | ArchDefinePpcgr)
1223 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1224 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1225 .Case("604", ArchDefineName | ArchDefinePpcgr)
1226 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1227 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001228 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001229 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1230 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1231 .Case("750", ArchDefineName | ArchDefinePpcgr)
1232 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1233 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001234 .Case("a2", ArchDefineA2)
1235 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001236 .Case("pwr3", ArchDefinePpcgr)
1237 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1238 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1239 | ArchDefinePpcsq)
1240 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1241 | ArchDefinePpcgr | ArchDefinePpcsq)
1242 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1243 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1244 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1245 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1246 | ArchDefinePpcsq)
1247 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1248 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001249 | ArchDefinePpcgr | ArchDefinePpcsq)
1250 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1251 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1252 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001253 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1254 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1255 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1256 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001257 .Case("power3", ArchDefinePpcgr)
1258 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1259 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1260 | ArchDefinePpcsq)
1261 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1262 | ArchDefinePpcgr | ArchDefinePpcsq)
1263 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1264 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1265 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1266 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1267 | ArchDefinePpcsq)
1268 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1269 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001270 | ArchDefinePpcgr | ArchDefinePpcsq)
1271 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1272 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1273 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001274 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1275 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1276 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1277 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001278 .Default(ArchDefineNone);
1279
1280 if (defs & ArchDefineName)
1281 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1282 if (defs & ArchDefinePpcgr)
1283 Builder.defineMacro("_ARCH_PPCGR");
1284 if (defs & ArchDefinePpcsq)
1285 Builder.defineMacro("_ARCH_PPCSQ");
1286 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001287 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001288 if (defs & ArchDefine603)
1289 Builder.defineMacro("_ARCH_603");
1290 if (defs & ArchDefine604)
1291 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001292 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001293 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001294 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001295 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001296 if (defs & ArchDefinePwr5x)
1297 Builder.defineMacro("_ARCH_PWR5X");
1298 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001299 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001300 if (defs & ArchDefinePwr6x)
1301 Builder.defineMacro("_ARCH_PWR6X");
1302 if (defs & ArchDefinePwr7)
1303 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001304 if (defs & ArchDefinePwr8)
1305 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001306 if (defs & ArchDefinePwr9)
1307 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001308 if (defs & ArchDefineA2)
1309 Builder.defineMacro("_ARCH_A2");
1310 if (defs & ArchDefineA2q) {
1311 Builder.defineMacro("_ARCH_A2Q");
1312 Builder.defineMacro("_ARCH_QP");
1313 }
1314
1315 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1316 Builder.defineMacro("__bg__");
1317 Builder.defineMacro("__THW_BLUEGENE__");
1318 Builder.defineMacro("__bgq__");
1319 Builder.defineMacro("__TOS_BGQ__");
1320 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001321
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001322 if (HasVSX)
1323 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001324 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001325 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001326 if (HasP8Crypto)
1327 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001328 if (HasHTM)
1329 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001330 if (HasFloat128)
1331 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001332 if (HasP9Vector)
1333 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001334
1335 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1336 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1337 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1338 if (PointerWidth == 64)
1339 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001340
Bill Schmidt38378a02013-02-01 20:23:10 +00001341 // FIXME: The following are not yet generated here by Clang, but are
1342 // generated by GCC:
1343 //
1344 // _SOFT_FLOAT_
1345 // __RECIP_PRECISION__
1346 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001347 // __RECIP__
1348 // __RECIPF__
1349 // __RSQRTE__
1350 // __RSQRTEF__
1351 // _SOFT_DOUBLE_
1352 // __NO_LWSYNC__
1353 // __HAVE_BSWAP__
1354 // __LONGDOUBLE128
1355 // __CMODEL_MEDIUM__
1356 // __CMODEL_LARGE__
1357 // _CALL_SYSV
1358 // _CALL_DARWIN
1359 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001360}
1361
Eric Christophera8a14c32015-08-31 18:39:16 +00001362// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001363// explicitly turned off vsx and turned on any of:
1364// - power8-vector
1365// - direct-move
1366// - float128
1367// - power9-vector
1368// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001369// set of options.
1370static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001371 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001372
1373 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1374 FeaturesVec.end()) {
1375 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1376 FeaturesVec.end()) {
1377 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1378 << "-mno-vsx";
1379 return false;
1380 }
1381
1382 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1383 FeaturesVec.end()) {
1384 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1385 << "-mno-vsx";
1386 return false;
1387 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001388
1389 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1390 FeaturesVec.end()) {
1391 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1392 << "-mno-vsx";
1393 return false;
1394 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001395
1396 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1397 FeaturesVec.end()) {
1398 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1399 << "-mno-vsx";
1400 return false;
1401 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001402 }
1403
1404 return true;
1405}
1406
Eric Christopher8c47b422015-10-09 18:39:55 +00001407bool PPCTargetInfo::initFeatureMap(
1408 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1409 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001410 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1411 .Case("7400", true)
1412 .Case("g4", true)
1413 .Case("7450", true)
1414 .Case("g4+", true)
1415 .Case("970", true)
1416 .Case("g5", true)
1417 .Case("pwr6", true)
1418 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001419 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001420 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001421 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001422 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001423 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001424
1425 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001426 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001427 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1428 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001429 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001430 .Case("pwr8", true)
1431 .Default(false);
1432 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1433 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001434 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001435 .Case("pwr8", true)
1436 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001437 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1438 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001439 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001440 .Case("pwr8", true)
1441 .Case("pwr7", true)
1442 .Default(false);
1443 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1444 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001445 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001446 .Case("pwr8", true)
1447 .Case("pwr7", true)
1448 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001449 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1450 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001451 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001452 .Case("pwr8", true)
1453 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001454 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1455 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001456 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001457 .Case("pwr8", true)
1458 .Case("pwr7", true)
1459 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001460
Eric Christophera8a14c32015-08-31 18:39:16 +00001461 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1462 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001463
Eric Christopher007b0a02015-08-28 22:32:01 +00001464 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001465}
1466
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001467bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001468 return llvm::StringSwitch<bool>(Feature)
1469 .Case("powerpc", true)
1470 .Case("vsx", HasVSX)
1471 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001472 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001473 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001474 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001475 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001476 .Case("bpermd", HasBPERMD)
1477 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001478 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001479 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001480 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001481}
Chris Lattner17df24e2008-04-21 18:56:49 +00001482
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001483void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1484 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001485 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1486 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1487 // incompatible options.
1488 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001489 if (Name == "direct-move" ||
1490 Name == "power8-vector" ||
1491 Name == "float128" ||
1492 Name == "power9-vector") {
1493 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001494 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001495 if (Name == "power9-vector")
1496 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001497 } else {
1498 Features[Name] = true;
1499 }
1500 } else {
1501 if (Name == "vsx") {
1502 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001503 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001504 } else {
1505 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001506 }
1507 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001508}
1509
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001510const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001511 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1512 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1513 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1514 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1515 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1516 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1517 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1518 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001519 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001520 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001521 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001522 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1523 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1524 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1525 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001526 "vrsave", "vscr",
1527 "spe_acc", "spefscr",
1528 "sfp"
1529};
Chris Lattner10a5b382007-01-29 05:24:35 +00001530
Craig Topperf054e3a2015-10-19 03:52:27 +00001531ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1532 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001533}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001534
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001535const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1536 // While some of these aliases do map to different registers
1537 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001538 { { "0" }, "r0" },
1539 { { "1"}, "r1" },
1540 { { "2" }, "r2" },
1541 { { "3" }, "r3" },
1542 { { "4" }, "r4" },
1543 { { "5" }, "r5" },
1544 { { "6" }, "r6" },
1545 { { "7" }, "r7" },
1546 { { "8" }, "r8" },
1547 { { "9" }, "r9" },
1548 { { "10" }, "r10" },
1549 { { "11" }, "r11" },
1550 { { "12" }, "r12" },
1551 { { "13" }, "r13" },
1552 { { "14" }, "r14" },
1553 { { "15" }, "r15" },
1554 { { "16" }, "r16" },
1555 { { "17" }, "r17" },
1556 { { "18" }, "r18" },
1557 { { "19" }, "r19" },
1558 { { "20" }, "r20" },
1559 { { "21" }, "r21" },
1560 { { "22" }, "r22" },
1561 { { "23" }, "r23" },
1562 { { "24" }, "r24" },
1563 { { "25" }, "r25" },
1564 { { "26" }, "r26" },
1565 { { "27" }, "r27" },
1566 { { "28" }, "r28" },
1567 { { "29" }, "r29" },
1568 { { "30" }, "r30" },
1569 { { "31" }, "r31" },
1570 { { "fr0" }, "f0" },
1571 { { "fr1" }, "f1" },
1572 { { "fr2" }, "f2" },
1573 { { "fr3" }, "f3" },
1574 { { "fr4" }, "f4" },
1575 { { "fr5" }, "f5" },
1576 { { "fr6" }, "f6" },
1577 { { "fr7" }, "f7" },
1578 { { "fr8" }, "f8" },
1579 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001580 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001581 { { "fr11" }, "f11" },
1582 { { "fr12" }, "f12" },
1583 { { "fr13" }, "f13" },
1584 { { "fr14" }, "f14" },
1585 { { "fr15" }, "f15" },
1586 { { "fr16" }, "f16" },
1587 { { "fr17" }, "f17" },
1588 { { "fr18" }, "f18" },
1589 { { "fr19" }, "f19" },
1590 { { "fr20" }, "f20" },
1591 { { "fr21" }, "f21" },
1592 { { "fr22" }, "f22" },
1593 { { "fr23" }, "f23" },
1594 { { "fr24" }, "f24" },
1595 { { "fr25" }, "f25" },
1596 { { "fr26" }, "f26" },
1597 { { "fr27" }, "f27" },
1598 { { "fr28" }, "f28" },
1599 { { "fr29" }, "f29" },
1600 { { "fr30" }, "f30" },
1601 { { "fr31" }, "f31" },
1602 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001603};
1604
Craig Topperf054e3a2015-10-19 03:52:27 +00001605ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1606 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001607}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001608
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001609class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001610public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001611 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1612 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001613 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001614
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001615 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001616 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001617 case llvm::Triple::FreeBSD:
1618 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001619 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001620 PtrDiffType = SignedInt;
1621 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001622 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001623 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001624 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001625 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001626
Roman Divacky3ffe7462012-03-13 19:20:17 +00001627 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1628 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001629 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001630 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001631
1632 // PPC32 supports atomics up to 4 bytes.
1633 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001634 }
1635
Craig Topper3164f332014-03-11 03:39:26 +00001636 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001637 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001638 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001639 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001640};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001641
Bill Schmidt778d3872013-07-26 01:36:11 +00001642// Note: ABI differences may eventually require us to have a separate
1643// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001644class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001645public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001646 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1647 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001648 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001649 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001650 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001651
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001652 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001653 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001654 ABI = "elfv2";
1655 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001656 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001657 ABI = "elfv1";
1658 }
1659
1660 switch (getTriple().getOS()) {
1661 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001662 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001663 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001664 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001665 case llvm::Triple::NetBSD:
1666 IntMaxType = SignedLongLong;
1667 Int64Type = SignedLongLong;
1668 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001669 default:
1670 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001671 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001672
1673 // PPC64 supports atomics up to 8 bytes.
1674 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001675 }
Craig Topper3164f332014-03-11 03:39:26 +00001676 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001677 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001678 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001679 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001680 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001681 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001682 ABI = Name;
1683 return true;
1684 }
1685 return false;
1686 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001687};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001688
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001689class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001690public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001691 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1692 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001693 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001694 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001695 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001696 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001697 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001698 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001699 }
Craig Topper3164f332014-03-11 03:39:26 +00001700 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001701 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001702 }
1703};
1704
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001705class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001706public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001707 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1708 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001709 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001710 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001711 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001712 }
1713};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001714
Eric Christopherc48497a2015-09-18 21:26:24 +00001715static const unsigned NVPTXAddrSpaceMap[] = {
1716 1, // opencl_global
1717 3, // opencl_local
1718 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001719 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001720 0, // opencl_generic
1721 1, // cuda_device
1722 4, // cuda_constant
1723 3, // cuda_shared
1724};
1725
1726class NVPTXTargetInfo : public TargetInfo {
1727 static const char *const GCCRegNames[];
1728 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001729 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001730
Eric Christopherc48497a2015-09-18 21:26:24 +00001731public:
Justin Lebar76945b22016-04-29 23:05:19 +00001732 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001733 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001734 TLSSupported = false;
1735 LongWidth = LongAlign = 64;
1736 AddrSpaceMap = &NVPTXAddrSpaceMap;
1737 UseAddrSpaceMapMangling = true;
1738 // Define available target features
1739 // These must be defined in sorted order!
1740 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001741 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001742
1743 // If possible, get a TargetInfo for our host triple, so we can match its
1744 // types.
1745 llvm::Triple HostTriple(Opts.HostTriple);
1746 if (HostTriple.isNVPTX())
1747 return;
1748 std::unique_ptr<TargetInfo> HostTarget(
1749 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1750 if (!HostTarget) {
1751 return;
1752 }
1753
1754 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1755 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1756 BoolWidth = HostTarget->getBoolWidth();
1757 BoolAlign = HostTarget->getBoolAlign();
1758 IntWidth = HostTarget->getIntWidth();
1759 IntAlign = HostTarget->getIntAlign();
1760 HalfWidth = HostTarget->getHalfWidth();
1761 HalfAlign = HostTarget->getHalfAlign();
1762 FloatWidth = HostTarget->getFloatWidth();
1763 FloatAlign = HostTarget->getFloatAlign();
1764 DoubleWidth = HostTarget->getDoubleWidth();
1765 DoubleAlign = HostTarget->getDoubleAlign();
1766 LongWidth = HostTarget->getLongWidth();
1767 LongAlign = HostTarget->getLongAlign();
1768 LongLongWidth = HostTarget->getLongLongWidth();
1769 LongLongAlign = HostTarget->getLongLongAlign();
1770 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1771 DefaultAlignForAttributeAligned =
1772 HostTarget->getDefaultAlignForAttributeAligned();
1773 SizeType = HostTarget->getSizeType();
1774 IntMaxType = HostTarget->getIntMaxType();
1775 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1776 IntPtrType = HostTarget->getIntPtrType();
1777 WCharType = HostTarget->getWCharType();
1778 WIntType = HostTarget->getWIntType();
1779 Char16Type = HostTarget->getChar16Type();
1780 Char32Type = HostTarget->getChar32Type();
1781 Int64Type = HostTarget->getInt64Type();
1782 SigAtomicType = HostTarget->getSigAtomicType();
1783 ProcessIDType = HostTarget->getProcessIDType();
1784
1785 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1786 UseZeroLengthBitfieldAlignment =
1787 HostTarget->useZeroLengthBitfieldAlignment();
1788 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1789 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1790
Justin Lebar5057f172016-09-09 20:35:43 +00001791 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1792 // we need those macros to be identical on host and device, because (among
1793 // other things) they affect which standard library classes are defined, and
1794 // we need all classes to be defined on both the host and device.
1795 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1796
Justin Lebar76945b22016-04-29 23:05:19 +00001797 // Properties intentionally not copied from host:
1798 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1799 // host/device boundary.
1800 // - SuitableAlign: Not visible across the host/device boundary, and may
1801 // correctly be different on host/device, e.g. if host has wider vector
1802 // types than device.
1803 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1804 // as its double type, but that's not necessarily true on the host.
1805 // TODO: nvcc emits a warning when using long double on device; we should
1806 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001807 }
1808 void getTargetDefines(const LangOptions &Opts,
1809 MacroBuilder &Builder) const override {
1810 Builder.defineMacro("__PTX__");
1811 Builder.defineMacro("__NVPTX__");
1812 if (Opts.CUDAIsDevice) {
1813 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001814 std::string CUDAArchCode = [this] {
1815 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001816 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001817 assert(false && "No GPU arch when compiling CUDA device code.");
1818 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001819 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001820 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001821 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001822 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001823 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001824 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001825 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001826 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001827 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001828 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001829 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001830 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001831 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001832 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001833 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001834 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001835 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001836 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001837 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001838 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001839 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001840 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001841 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001842 return "620";
1843 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001844 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001845 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001846 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001847 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001848 }
Craig Topper6c03a542015-10-19 04:51:35 +00001849 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1850 return llvm::makeArrayRef(BuiltinInfo,
1851 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001852 }
Artem Belevichfda99052016-09-28 17:47:35 +00001853 bool
1854 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1855 StringRef CPU,
1856 const std::vector<std::string> &FeaturesVec) const override {
1857 Features["satom"] = GPU >= CudaArch::SM_60;
1858 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1859 }
1860
Eric Christopherc48497a2015-09-18 21:26:24 +00001861 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001862 return llvm::StringSwitch<bool>(Feature)
1863 .Cases("ptx", "nvptx", true)
1864 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1865 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001866 }
1867
Craig Topperf054e3a2015-10-19 03:52:27 +00001868 ArrayRef<const char *> getGCCRegNames() const override;
1869 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001870 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001871 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001872 }
1873 bool validateAsmConstraint(const char *&Name,
1874 TargetInfo::ConstraintInfo &Info) const override {
1875 switch (*Name) {
1876 default:
1877 return false;
1878 case 'c':
1879 case 'h':
1880 case 'r':
1881 case 'l':
1882 case 'f':
1883 case 'd':
1884 Info.setAllowsRegister();
1885 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001886 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001887 }
1888 const char *getClobbers() const override {
1889 // FIXME: Is this really right?
1890 return "";
1891 }
1892 BuiltinVaListKind getBuiltinVaListKind() const override {
1893 // FIXME: implement
1894 return TargetInfo::CharPtrBuiltinVaList;
1895 }
1896 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001897 GPU = StringToCudaArch(Name);
1898 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001899 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001900 void setSupportedOpenCLOpts() override {
1901 auto &Opts = getSupportedOpenCLOpts();
1902 Opts.cl_clang_storage_class_specifiers = 1;
1903 Opts.cl_khr_gl_sharing = 1;
1904 Opts.cl_khr_icd = 1;
1905
1906 Opts.cl_khr_fp64 = 1;
1907 Opts.cl_khr_byte_addressable_store = 1;
1908 Opts.cl_khr_global_int32_base_atomics = 1;
1909 Opts.cl_khr_global_int32_extended_atomics = 1;
1910 Opts.cl_khr_local_int32_base_atomics = 1;
1911 Opts.cl_khr_local_int32_extended_atomics = 1;
1912 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001913};
1914
1915const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1916#define BUILTIN(ID, TYPE, ATTRS) \
1917 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1918#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1919 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001920#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1921 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001922#include "clang/Basic/BuiltinsNVPTX.def"
1923};
1924
1925const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1926
Craig Topperf054e3a2015-10-19 03:52:27 +00001927ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1928 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001929}
1930
1931class NVPTX32TargetInfo : public NVPTXTargetInfo {
1932public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001933 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1934 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001935 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001936 PointerWidth = PointerAlign = 32;
1937 SizeType = TargetInfo::UnsignedInt;
1938 PtrDiffType = TargetInfo::SignedInt;
1939 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001940 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001941 }
1942};
1943
1944class NVPTX64TargetInfo : public NVPTXTargetInfo {
1945public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001946 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1947 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001948 PointerWidth = PointerAlign = 64;
1949 SizeType = TargetInfo::UnsignedLong;
1950 PtrDiffType = TargetInfo::SignedLong;
1951 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001952 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001953 }
1954};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001955
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001956static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001957 1, // opencl_global
1958 3, // opencl_local
1959 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001960 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001961 1, // cuda_device
1962 2, // cuda_constant
1963 3 // cuda_shared
1964};
1965
Tom Stellarda96344b2014-08-21 13:58:40 +00001966// If you edit the description strings, make sure you update
1967// getPointerWidthV().
1968
Craig Topper273dbc62015-10-18 05:29:26 +00001969static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001970 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1971 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001972
Craig Topper273dbc62015-10-18 05:29:26 +00001973static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001974 "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 +00001975 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1976 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001977
Matt Arsenault250024f2016-06-08 01:56:42 +00001978class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001979 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001980 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001981
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001982 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001983 enum GPUKind {
1984 GK_NONE,
1985 GK_R600,
1986 GK_R600_DOUBLE_OPS,
1987 GK_R700,
1988 GK_R700_DOUBLE_OPS,
1989 GK_EVERGREEN,
1990 GK_EVERGREEN_DOUBLE_OPS,
1991 GK_NORTHERN_ISLANDS,
1992 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001993 GK_GFX6,
1994 GK_GFX7,
1995 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00001996 } GPU;
1997
Jan Veselyeebeaea2015-05-04 19:53:36 +00001998 bool hasFP64:1;
1999 bool hasFMAF:1;
2000 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002001 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002002
Matt Arsenault250024f2016-06-08 01:56:42 +00002003 static bool isAMDGCN(const llvm::Triple &TT) {
2004 return TT.getArch() == llvm::Triple::amdgcn;
2005 }
2006
Eli Friedmand13b41e2012-10-12 23:32:00 +00002007public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002008 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002009 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002010 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002011 hasFP64(false),
2012 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002013 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002014 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002015 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002016 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002017 hasFMAF = true;
2018 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002019 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002020
2021 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2022 DataLayoutStringSI : DataLayoutStringR600);
2023
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002024 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002025 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002026 }
2027
Tom Stellarda96344b2014-08-21 13:58:40 +00002028 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2029 if (GPU <= GK_CAYMAN)
2030 return 32;
2031
2032 switch(AddrSpace) {
2033 default:
2034 return 64;
2035 case 0:
2036 case 3:
2037 case 5:
2038 return 32;
2039 }
2040 }
2041
Yaxun Liu26f75662016-08-19 05:17:25 +00002042 uint64_t getMaxPointerWidth() const override {
2043 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2044 }
2045
Craig Topper3164f332014-03-11 03:39:26 +00002046 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002047 return "";
2048 }
2049
Craig Topperf054e3a2015-10-19 03:52:27 +00002050 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002051
Craig Topperf054e3a2015-10-19 03:52:27 +00002052 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2053 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002054 }
2055
Craig Topper3164f332014-03-11 03:39:26 +00002056 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002057 TargetInfo::ConstraintInfo &Info) const override {
2058 switch (*Name) {
2059 default: break;
2060 case 'v': // vgpr
2061 case 's': // sgpr
2062 Info.setAllowsRegister();
2063 return true;
2064 }
2065 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002066 }
2067
Matt Arsenault250024f2016-06-08 01:56:42 +00002068 bool initFeatureMap(llvm::StringMap<bool> &Features,
2069 DiagnosticsEngine &Diags, StringRef CPU,
2070 const std::vector<std::string> &FeatureVec) const override;
2071
Yaxun Liu2c17e822016-08-09 19:43:38 +00002072 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2073 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002074 bool hasFP32Denormals = false;
2075 bool hasFP64Denormals = false;
2076 for (auto &I : TargetOpts.FeaturesAsWritten) {
2077 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2078 hasFP32Denormals = true;
2079 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2080 hasFP64Denormals = true;
2081 }
2082 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002083 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2084 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2085 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002086 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002087 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002088 }
2089
Craig Topper6c03a542015-10-19 04:51:35 +00002090 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2091 return llvm::makeArrayRef(BuiltinInfo,
2092 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002093 }
2094
Craig Topper3164f332014-03-11 03:39:26 +00002095 void getTargetDefines(const LangOptions &Opts,
2096 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002097 if (getTriple().getArch() == llvm::Triple::amdgcn)
2098 Builder.defineMacro("__AMDGCN__");
2099 else
2100 Builder.defineMacro("__R600__");
2101
Jan Veselyeebeaea2015-05-04 19:53:36 +00002102 if (hasFMAF)
2103 Builder.defineMacro("__HAS_FMAF__");
2104 if (hasLDEXPF)
2105 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002106 if (hasFP64)
2107 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002108 }
2109
Craig Topper3164f332014-03-11 03:39:26 +00002110 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002111 return TargetInfo::CharPtrBuiltinVaList;
2112 }
2113
Matt Arsenault250024f2016-06-08 01:56:42 +00002114 static GPUKind parseR600Name(StringRef Name) {
2115 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002116 .Case("r600" , GK_R600)
2117 .Case("rv610", GK_R600)
2118 .Case("rv620", GK_R600)
2119 .Case("rv630", GK_R600)
2120 .Case("rv635", GK_R600)
2121 .Case("rs780", GK_R600)
2122 .Case("rs880", GK_R600)
2123 .Case("rv670", GK_R600_DOUBLE_OPS)
2124 .Case("rv710", GK_R700)
2125 .Case("rv730", GK_R700)
2126 .Case("rv740", GK_R700_DOUBLE_OPS)
2127 .Case("rv770", GK_R700_DOUBLE_OPS)
2128 .Case("palm", GK_EVERGREEN)
2129 .Case("cedar", GK_EVERGREEN)
2130 .Case("sumo", GK_EVERGREEN)
2131 .Case("sumo2", GK_EVERGREEN)
2132 .Case("redwood", GK_EVERGREEN)
2133 .Case("juniper", GK_EVERGREEN)
2134 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2135 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2136 .Case("barts", GK_NORTHERN_ISLANDS)
2137 .Case("turks", GK_NORTHERN_ISLANDS)
2138 .Case("caicos", GK_NORTHERN_ISLANDS)
2139 .Case("cayman", GK_CAYMAN)
2140 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002141 .Default(GK_NONE);
2142 }
2143
2144 static GPUKind parseAMDGCNName(StringRef Name) {
2145 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002146 .Case("tahiti", GK_GFX6)
2147 .Case("pitcairn", GK_GFX6)
2148 .Case("verde", GK_GFX6)
2149 .Case("oland", GK_GFX6)
2150 .Case("hainan", GK_GFX6)
2151 .Case("bonaire", GK_GFX7)
2152 .Case("kabini", GK_GFX7)
2153 .Case("kaveri", GK_GFX7)
2154 .Case("hawaii", GK_GFX7)
2155 .Case("mullins", GK_GFX7)
2156 .Case("tonga", GK_GFX8)
2157 .Case("iceland", GK_GFX8)
2158 .Case("carrizo", GK_GFX8)
2159 .Case("fiji", GK_GFX8)
2160 .Case("stoney", GK_GFX8)
2161 .Case("polaris10", GK_GFX8)
2162 .Case("polaris11", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002163 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002164 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002165
Matt Arsenault250024f2016-06-08 01:56:42 +00002166 bool setCPU(const std::string &Name) override {
2167 if (getTriple().getArch() == llvm::Triple::amdgcn)
2168 GPU = parseAMDGCNName(Name);
2169 else
2170 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002171
Matt Arsenault250024f2016-06-08 01:56:42 +00002172 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002173 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002174
Jan Vesely211ba782016-06-17 02:25:03 +00002175 void setSupportedOpenCLOpts() override {
2176 auto &Opts = getSupportedOpenCLOpts();
2177 Opts.cl_clang_storage_class_specifiers = 1;
2178 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002179
Jan Vesely211ba782016-06-17 02:25:03 +00002180 if (hasFP64)
2181 Opts.cl_khr_fp64 = 1;
2182 if (GPU >= GK_EVERGREEN) {
2183 Opts.cl_khr_byte_addressable_store = 1;
2184 Opts.cl_khr_global_int32_base_atomics = 1;
2185 Opts.cl_khr_global_int32_extended_atomics = 1;
2186 Opts.cl_khr_local_int32_base_atomics = 1;
2187 Opts.cl_khr_local_int32_extended_atomics = 1;
2188 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002189 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002190 Opts.cl_khr_fp16 = 1;
2191 Opts.cl_khr_int64_base_atomics = 1;
2192 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002193 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002194 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002195 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002196 Opts.cl_amd_media_ops = 1;
2197 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002198 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002199 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002200
Yaxun Liu99444cb2016-08-03 20:38:06 +00002201 LangAS::ID getOpenCLImageAddrSpace() const override {
2202 return LangAS::opencl_constant;
2203 }
2204
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002205 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2206 switch (CC) {
2207 default:
2208 return CCCR_Warning;
2209 case CC_C:
2210 case CC_OpenCLKernel:
2211 return CCCR_OK;
2212 }
2213 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002214};
2215
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002216const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002217#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002218 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002219#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2220 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002221#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002222};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002223const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002224 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2225 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2226 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2227 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2228 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2229 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2230 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2231 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2232 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2233 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2234 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2235 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2236 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2237 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2238 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2239 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2240 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2241 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2242 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2243 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2244 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2245 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2246 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2247 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2248 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2249 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2250 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2251 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2252 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2253 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2254 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2255 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2256 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2257 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2258 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2259 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2260 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2261 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2262 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2263 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2264 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2265 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2266 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2267 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2268 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2269 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2270 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002271 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002272 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2273 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002274};
2275
Craig Topperf054e3a2015-10-19 03:52:27 +00002276ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2277 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002278}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002279
Matt Arsenault250024f2016-06-08 01:56:42 +00002280bool AMDGPUTargetInfo::initFeatureMap(
2281 llvm::StringMap<bool> &Features,
2282 DiagnosticsEngine &Diags, StringRef CPU,
2283 const std::vector<std::string> &FeatureVec) const {
2284
2285 // XXX - What does the member GPU mean if device name string passed here?
2286 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2287 if (CPU.empty())
2288 CPU = "tahiti";
2289
2290 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002291 case GK_GFX6:
2292 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002293 break;
2294
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002295 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002296 Features["s-memrealtime"] = true;
2297 Features["16-bit-insts"] = true;
2298 break;
2299
2300 case GK_NONE:
2301 return false;
2302 default:
2303 llvm_unreachable("unhandled subtarget");
2304 }
2305 } else {
2306 if (CPU.empty())
2307 CPU = "r600";
2308
2309 switch (parseR600Name(CPU)) {
2310 case GK_R600:
2311 case GK_R700:
2312 case GK_EVERGREEN:
2313 case GK_NORTHERN_ISLANDS:
2314 break;
2315 case GK_R600_DOUBLE_OPS:
2316 case GK_R700_DOUBLE_OPS:
2317 case GK_EVERGREEN_DOUBLE_OPS:
2318 case GK_CAYMAN:
2319 Features["fp64"] = true;
2320 break;
2321 case GK_NONE:
2322 return false;
2323 default:
2324 llvm_unreachable("unhandled subtarget");
2325 }
2326 }
2327
2328 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2329}
2330
Eli Friedman3fd920a2008-08-20 02:34:37 +00002331// Namespace for x86 abstract base class
2332const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002333#define BUILTIN(ID, TYPE, ATTRS) \
2334 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002335#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002336 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002337#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002338 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002339#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2340 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002341#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002342};
Eli Friedmanb5366062008-05-20 14:21:01 +00002343
Nuno Lopescfca1f02009-12-23 17:49:57 +00002344static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002345 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2346 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002347 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002348 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2349 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2350 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002351 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002352 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2353 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002354 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2355 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2356 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2357 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2358 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2359 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2360 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2361 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002362};
2363
Eric Christophercdd36352011-06-21 00:05:20 +00002364const TargetInfo::AddlRegName AddlRegNames[] = {
2365 { { "al", "ah", "eax", "rax" }, 0 },
2366 { { "bl", "bh", "ebx", "rbx" }, 3 },
2367 { { "cl", "ch", "ecx", "rcx" }, 2 },
2368 { { "dl", "dh", "edx", "rdx" }, 1 },
2369 { { "esi", "rsi" }, 4 },
2370 { { "edi", "rdi" }, 5 },
2371 { { "esp", "rsp" }, 7 },
2372 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002373 { { "r8d", "r8w", "r8b" }, 38 },
2374 { { "r9d", "r9w", "r9b" }, 39 },
2375 { { "r10d", "r10w", "r10b" }, 40 },
2376 { { "r11d", "r11w", "r11b" }, 41 },
2377 { { "r12d", "r12w", "r12b" }, 42 },
2378 { { "r13d", "r13w", "r13b" }, 43 },
2379 { { "r14d", "r14w", "r14b" }, 44 },
2380 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002381};
2382
2383// X86 target abstract base class; x86-32 and x86-64 are very close, so
2384// most of the implementation can be shared.
2385class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002386 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002387 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002388 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002389 enum MMX3DNowEnum {
2390 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002391 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002392 enum XOPEnum {
2393 NoXOP,
2394 SSE4A,
2395 FMA4,
2396 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002397 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002398
Craig Topper543f3bd2015-10-14 23:47:57 +00002399 bool HasAES = false;
2400 bool HasPCLMUL = false;
2401 bool HasLZCNT = false;
2402 bool HasRDRND = false;
2403 bool HasFSGSBASE = false;
2404 bool HasBMI = false;
2405 bool HasBMI2 = false;
2406 bool HasPOPCNT = false;
2407 bool HasRTM = false;
2408 bool HasPRFCHW = false;
2409 bool HasRDSEED = false;
2410 bool HasADX = false;
2411 bool HasTBM = false;
2412 bool HasFMA = false;
2413 bool HasF16C = false;
2414 bool HasAVX512CD = false;
2415 bool HasAVX512ER = false;
2416 bool HasAVX512PF = false;
2417 bool HasAVX512DQ = false;
2418 bool HasAVX512BW = false;
2419 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002420 bool HasAVX512VBMI = false;
2421 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002422 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002423 bool HasMPX = false;
2424 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002425 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002426 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002427 bool HasXSAVE = false;
2428 bool HasXSAVEOPT = false;
2429 bool HasXSAVEC = false;
2430 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002431 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002432 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002433 bool HasCLFLUSHOPT = false;
2434 bool HasPCOMMIT = false;
2435 bool HasCLWB = false;
2436 bool HasUMIP = false;
2437 bool HasMOVBE = false;
2438 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002439
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002440 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2441 ///
2442 /// Each enumeration represents a particular CPU supported by Clang. These
2443 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2444 enum CPUKind {
2445 CK_Generic,
2446
2447 /// \name i386
2448 /// i386-generation processors.
2449 //@{
2450 CK_i386,
2451 //@}
2452
2453 /// \name i486
2454 /// i486-generation processors.
2455 //@{
2456 CK_i486,
2457 CK_WinChipC6,
2458 CK_WinChip2,
2459 CK_C3,
2460 //@}
2461
2462 /// \name i586
2463 /// i586-generation processors, P5 microarchitecture based.
2464 //@{
2465 CK_i586,
2466 CK_Pentium,
2467 CK_PentiumMMX,
2468 //@}
2469
2470 /// \name i686
2471 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2472 //@{
2473 CK_i686,
2474 CK_PentiumPro,
2475 CK_Pentium2,
2476 CK_Pentium3,
2477 CK_Pentium3M,
2478 CK_PentiumM,
2479 CK_C3_2,
2480
2481 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2482 /// Clang however has some logic to suport this.
2483 // FIXME: Warn, deprecate, and potentially remove this.
2484 CK_Yonah,
2485 //@}
2486
2487 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002488 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002489 //@{
2490 CK_Pentium4,
2491 CK_Pentium4M,
2492 CK_Prescott,
2493 CK_Nocona,
2494 //@}
2495
2496 /// \name Core
2497 /// Core microarchitecture based processors.
2498 //@{
2499 CK_Core2,
2500
2501 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2502 /// codename which GCC no longer accepts as an option to -march, but Clang
2503 /// has some logic for recognizing it.
2504 // FIXME: Warn, deprecate, and potentially remove this.
2505 CK_Penryn,
2506 //@}
2507
2508 /// \name Atom
2509 /// Atom processors
2510 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002511 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002512 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002513 //@}
2514
2515 /// \name Nehalem
2516 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002517 CK_Nehalem,
2518
2519 /// \name Westmere
2520 /// Westmere microarchitecture based processors.
2521 CK_Westmere,
2522
2523 /// \name Sandy Bridge
2524 /// Sandy Bridge microarchitecture based processors.
2525 CK_SandyBridge,
2526
2527 /// \name Ivy Bridge
2528 /// Ivy Bridge microarchitecture based processors.
2529 CK_IvyBridge,
2530
2531 /// \name Haswell
2532 /// Haswell microarchitecture based processors.
2533 CK_Haswell,
2534
2535 /// \name Broadwell
2536 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002537 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002538
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002539 /// \name Skylake Client
2540 /// Skylake client microarchitecture based processors.
2541 CK_SkylakeClient,
2542
2543 /// \name Skylake Server
2544 /// Skylake server microarchitecture based processors.
2545 CK_SkylakeServer,
2546
2547 /// \name Cannonlake Client
2548 /// Cannonlake client microarchitecture based processors.
2549 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002550
Craig Topper449314e2013-08-20 07:09:39 +00002551 /// \name Knights Landing
2552 /// Knights Landing processor.
2553 CK_KNL,
2554
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002555 /// \name Lakemont
2556 /// Lakemont microarchitecture based processors.
2557 CK_Lakemont,
2558
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002559 /// \name K6
2560 /// K6 architecture processors.
2561 //@{
2562 CK_K6,
2563 CK_K6_2,
2564 CK_K6_3,
2565 //@}
2566
2567 /// \name K7
2568 /// K7 architecture processors.
2569 //@{
2570 CK_Athlon,
2571 CK_AthlonThunderbird,
2572 CK_Athlon4,
2573 CK_AthlonXP,
2574 CK_AthlonMP,
2575 //@}
2576
2577 /// \name K8
2578 /// K8 architecture processors.
2579 //@{
2580 CK_Athlon64,
2581 CK_Athlon64SSE3,
2582 CK_AthlonFX,
2583 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002584 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002585 CK_Opteron,
2586 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002587 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002588 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002589
Benjamin Kramer569f2152012-01-10 11:50:18 +00002590 /// \name Bobcat
2591 /// Bobcat architecture processors.
2592 //@{
2593 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002594 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002595 //@}
2596
2597 /// \name Bulldozer
2598 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002599 //@{
2600 CK_BDVER1,
2601 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002602 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002603 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002604 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002605
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002606 /// This specification is deprecated and will be removed in the future.
2607 /// Users should prefer \see CK_K8.
2608 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002609 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002610 CK_x86_64,
2611 //@}
2612
2613 /// \name Geode
2614 /// Geode processors.
2615 //@{
2616 CK_Geode
2617 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002618 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002619
Eric Christopherc50738f2015-08-27 00:05:50 +00002620 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002621 return llvm::StringSwitch<CPUKind>(CPU)
2622 .Case("i386", CK_i386)
2623 .Case("i486", CK_i486)
2624 .Case("winchip-c6", CK_WinChipC6)
2625 .Case("winchip2", CK_WinChip2)
2626 .Case("c3", CK_C3)
2627 .Case("i586", CK_i586)
2628 .Case("pentium", CK_Pentium)
2629 .Case("pentium-mmx", CK_PentiumMMX)
2630 .Case("i686", CK_i686)
2631 .Case("pentiumpro", CK_PentiumPro)
2632 .Case("pentium2", CK_Pentium2)
2633 .Case("pentium3", CK_Pentium3)
2634 .Case("pentium3m", CK_Pentium3M)
2635 .Case("pentium-m", CK_PentiumM)
2636 .Case("c3-2", CK_C3_2)
2637 .Case("yonah", CK_Yonah)
2638 .Case("pentium4", CK_Pentium4)
2639 .Case("pentium4m", CK_Pentium4M)
2640 .Case("prescott", CK_Prescott)
2641 .Case("nocona", CK_Nocona)
2642 .Case("core2", CK_Core2)
2643 .Case("penryn", CK_Penryn)
2644 .Case("bonnell", CK_Bonnell)
2645 .Case("atom", CK_Bonnell) // Legacy name.
2646 .Case("silvermont", CK_Silvermont)
2647 .Case("slm", CK_Silvermont) // Legacy name.
2648 .Case("nehalem", CK_Nehalem)
2649 .Case("corei7", CK_Nehalem) // Legacy name.
2650 .Case("westmere", CK_Westmere)
2651 .Case("sandybridge", CK_SandyBridge)
2652 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2653 .Case("ivybridge", CK_IvyBridge)
2654 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2655 .Case("haswell", CK_Haswell)
2656 .Case("core-avx2", CK_Haswell) // Legacy name.
2657 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002658 .Case("skylake", CK_SkylakeClient)
2659 .Case("skylake-avx512", CK_SkylakeServer)
2660 .Case("skx", CK_SkylakeServer) // Legacy name.
2661 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002662 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002663 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002664 .Case("k6", CK_K6)
2665 .Case("k6-2", CK_K6_2)
2666 .Case("k6-3", CK_K6_3)
2667 .Case("athlon", CK_Athlon)
2668 .Case("athlon-tbird", CK_AthlonThunderbird)
2669 .Case("athlon-4", CK_Athlon4)
2670 .Case("athlon-xp", CK_AthlonXP)
2671 .Case("athlon-mp", CK_AthlonMP)
2672 .Case("athlon64", CK_Athlon64)
2673 .Case("athlon64-sse3", CK_Athlon64SSE3)
2674 .Case("athlon-fx", CK_AthlonFX)
2675 .Case("k8", CK_K8)
2676 .Case("k8-sse3", CK_K8SSE3)
2677 .Case("opteron", CK_Opteron)
2678 .Case("opteron-sse3", CK_OpteronSSE3)
2679 .Case("barcelona", CK_AMDFAM10)
2680 .Case("amdfam10", CK_AMDFAM10)
2681 .Case("btver1", CK_BTVER1)
2682 .Case("btver2", CK_BTVER2)
2683 .Case("bdver1", CK_BDVER1)
2684 .Case("bdver2", CK_BDVER2)
2685 .Case("bdver3", CK_BDVER3)
2686 .Case("bdver4", CK_BDVER4)
2687 .Case("x86-64", CK_x86_64)
2688 .Case("geode", CK_Geode)
2689 .Default(CK_Generic);
2690 }
2691
Rafael Espindolaeb265472013-08-21 21:59:03 +00002692 enum FPMathKind {
2693 FP_Default,
2694 FP_SSE,
2695 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002696 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002697
Eli Friedman3fd920a2008-08-20 02:34:37 +00002698public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002699 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2700 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002701 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002702 }
Craig Topper3164f332014-03-11 03:39:26 +00002703 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002704 // X87 evaluates with 80 bits "long double" precision.
2705 return SSELevel == NoSSE ? 2 : 0;
2706 }
Craig Topper6c03a542015-10-19 04:51:35 +00002707 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2708 return llvm::makeArrayRef(BuiltinInfo,
2709 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002710 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002711 ArrayRef<const char *> getGCCRegNames() const override {
2712 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002713 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002714 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2715 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002716 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002717 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2718 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002719 }
Eric Christopherd9832702015-06-29 21:00:05 +00002720 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002721 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002722 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002723
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002724 bool validateGlobalRegisterVariable(StringRef RegName,
2725 unsigned RegSize,
2726 bool &HasSizeMismatch) const override {
2727 // esp and ebp are the only 32-bit registers the x86 backend can currently
2728 // handle.
2729 if (RegName.equals("esp") || RegName.equals("ebp")) {
2730 // Check that the register size is 32-bit.
2731 HasSizeMismatch = RegSize != 32;
2732 return true;
2733 }
2734
2735 return false;
2736 }
2737
Akira Hatanaka974131e2014-09-18 18:17:18 +00002738 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2739
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002740 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2741
Akira Hatanaka974131e2014-09-18 18:17:18 +00002742 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2743
Craig Topper3164f332014-03-11 03:39:26 +00002744 std::string convertConstraint(const char *&Constraint) const override;
2745 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002746 return "~{dirflag},~{fpsr},~{flags}";
2747 }
Craig Topper3164f332014-03-11 03:39:26 +00002748 void getTargetDefines(const LangOptions &Opts,
2749 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002750 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2751 bool Enabled);
2752 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2753 bool Enabled);
2754 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2755 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002756 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2757 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002758 setFeatureEnabledImpl(Features, Name, Enabled);
2759 }
2760 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002761 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002762 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2763 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002764 bool
2765 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2766 StringRef CPU,
2767 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002768 bool hasFeature(StringRef Feature) const override;
2769 bool handleTargetFeatures(std::vector<std::string> &Features,
2770 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002771 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002772 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2773 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002774 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002775 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002776 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002777 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002778 return "no-mmx";
2779 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002780 }
Craig Topper3164f332014-03-11 03:39:26 +00002781 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002782 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002783
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002784 // Perform any per-CPU checks necessary to determine if this CPU is
2785 // acceptable.
2786 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2787 // invalid without explaining *why*.
2788 switch (CPU) {
2789 case CK_Generic:
2790 // No processor selected!
2791 return false;
2792
2793 case CK_i386:
2794 case CK_i486:
2795 case CK_WinChipC6:
2796 case CK_WinChip2:
2797 case CK_C3:
2798 case CK_i586:
2799 case CK_Pentium:
2800 case CK_PentiumMMX:
2801 case CK_i686:
2802 case CK_PentiumPro:
2803 case CK_Pentium2:
2804 case CK_Pentium3:
2805 case CK_Pentium3M:
2806 case CK_PentiumM:
2807 case CK_Yonah:
2808 case CK_C3_2:
2809 case CK_Pentium4:
2810 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002811 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002812 case CK_Prescott:
2813 case CK_K6:
2814 case CK_K6_2:
2815 case CK_K6_3:
2816 case CK_Athlon:
2817 case CK_AthlonThunderbird:
2818 case CK_Athlon4:
2819 case CK_AthlonXP:
2820 case CK_AthlonMP:
2821 case CK_Geode:
2822 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002823 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002824 return false;
2825
2826 // Fallthrough
2827 case CK_Nocona:
2828 case CK_Core2:
2829 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002830 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002831 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002832 case CK_Nehalem:
2833 case CK_Westmere:
2834 case CK_SandyBridge:
2835 case CK_IvyBridge:
2836 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002837 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002838 case CK_SkylakeClient:
2839 case CK_SkylakeServer:
2840 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002841 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002842 case CK_Athlon64:
2843 case CK_Athlon64SSE3:
2844 case CK_AthlonFX:
2845 case CK_K8:
2846 case CK_K8SSE3:
2847 case CK_Opteron:
2848 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002849 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002850 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002851 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002852 case CK_BDVER1:
2853 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002854 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002855 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002856 case CK_x86_64:
2857 return true;
2858 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002859 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002860 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002861
Craig Topper3164f332014-03-11 03:39:26 +00002862 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002863
Craig Topper3164f332014-03-11 03:39:26 +00002864 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002865 // Most of the non-ARM calling conventions are i386 conventions.
2866 switch (CC) {
2867 case CC_X86ThisCall:
2868 case CC_X86FastCall:
2869 case CC_X86StdCall:
2870 case CC_X86VectorCall:
2871 case CC_C:
2872 case CC_Swift:
2873 case CC_X86Pascal:
2874 case CC_IntelOclBicc:
2875 return CCCR_OK;
2876 default:
2877 return CCCR_Warning;
2878 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002879 }
2880
Craig Topper3164f332014-03-11 03:39:26 +00002881 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002882 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002883 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002884
2885 bool hasSjLjLowering() const override {
2886 return true;
2887 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002888
2889 void setSupportedOpenCLOpts() override {
2890 getSupportedOpenCLOpts().setAll();
2891 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002892};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002893
Rafael Espindolaeb265472013-08-21 21:59:03 +00002894bool X86TargetInfo::setFPMath(StringRef Name) {
2895 if (Name == "387") {
2896 FPMath = FP_387;
2897 return true;
2898 }
2899 if (Name == "sse") {
2900 FPMath = FP_SSE;
2901 return true;
2902 }
2903 return false;
2904}
2905
Eric Christopher007b0a02015-08-28 22:32:01 +00002906bool X86TargetInfo::initFeatureMap(
2907 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002908 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002909 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002910 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002911 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002912 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002913
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002914 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002915
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002916 // Enable X87 for all X86 processors but Lakemont.
2917 if (Kind != CK_Lakemont)
2918 setFeatureEnabledImpl(Features, "x87", true);
2919
2920 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002921 case CK_Generic:
2922 case CK_i386:
2923 case CK_i486:
2924 case CK_i586:
2925 case CK_Pentium:
2926 case CK_i686:
2927 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002928 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002929 break;
2930 case CK_PentiumMMX:
2931 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002932 case CK_K6:
2933 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002934 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002935 break;
2936 case CK_Pentium3:
2937 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002938 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002939 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002940 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002941 break;
2942 case CK_PentiumM:
2943 case CK_Pentium4:
2944 case CK_Pentium4M:
2945 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002946 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002947 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002948 break;
2949 case CK_Yonah:
2950 case CK_Prescott:
2951 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002952 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002953 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002954 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002955 break;
2956 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002957 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002958 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002959 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002960 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002961 break;
2962 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002963 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002964 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002965 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002966 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002967 case CK_Cannonlake:
2968 setFeatureEnabledImpl(Features, "avx512ifma", true);
2969 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2970 setFeatureEnabledImpl(Features, "sha", true);
2971 setFeatureEnabledImpl(Features, "umip", true);
2972 // FALLTHROUGH
2973 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002974 setFeatureEnabledImpl(Features, "avx512f", true);
2975 setFeatureEnabledImpl(Features, "avx512cd", true);
2976 setFeatureEnabledImpl(Features, "avx512dq", true);
2977 setFeatureEnabledImpl(Features, "avx512bw", true);
2978 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002979 setFeatureEnabledImpl(Features, "pku", true);
2980 setFeatureEnabledImpl(Features, "pcommit", true);
2981 setFeatureEnabledImpl(Features, "clwb", true);
2982 // FALLTHROUGH
2983 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002984 setFeatureEnabledImpl(Features, "xsavec", true);
2985 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002986 setFeatureEnabledImpl(Features, "mpx", true);
2987 setFeatureEnabledImpl(Features, "sgx", true);
2988 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002989 // FALLTHROUGH
2990 case CK_Broadwell:
2991 setFeatureEnabledImpl(Features, "rdseed", true);
2992 setFeatureEnabledImpl(Features, "adx", true);
2993 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002994 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002995 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002996 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002997 setFeatureEnabledImpl(Features, "bmi", true);
2998 setFeatureEnabledImpl(Features, "bmi2", true);
2999 setFeatureEnabledImpl(Features, "rtm", true);
3000 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003001 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003002 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003003 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003004 setFeatureEnabledImpl(Features, "rdrnd", true);
3005 setFeatureEnabledImpl(Features, "f16c", true);
3006 setFeatureEnabledImpl(Features, "fsgsbase", true);
3007 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003008 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003009 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003010 setFeatureEnabledImpl(Features, "xsave", true);
3011 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003012 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003013 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003014 case CK_Silvermont:
3015 setFeatureEnabledImpl(Features, "aes", true);
3016 setFeatureEnabledImpl(Features, "pclmul", true);
3017 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003018 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003019 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003020 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003021 setFeatureEnabledImpl(Features, "cx16", true);
3022 break;
3023 case CK_KNL:
3024 setFeatureEnabledImpl(Features, "avx512f", true);
3025 setFeatureEnabledImpl(Features, "avx512cd", true);
3026 setFeatureEnabledImpl(Features, "avx512er", true);
3027 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003028 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003029 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003030 setFeatureEnabledImpl(Features, "rdseed", true);
3031 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003032 setFeatureEnabledImpl(Features, "lzcnt", true);
3033 setFeatureEnabledImpl(Features, "bmi", true);
3034 setFeatureEnabledImpl(Features, "bmi2", true);
3035 setFeatureEnabledImpl(Features, "rtm", true);
3036 setFeatureEnabledImpl(Features, "fma", true);
3037 setFeatureEnabledImpl(Features, "rdrnd", true);
3038 setFeatureEnabledImpl(Features, "f16c", true);
3039 setFeatureEnabledImpl(Features, "fsgsbase", true);
3040 setFeatureEnabledImpl(Features, "aes", true);
3041 setFeatureEnabledImpl(Features, "pclmul", true);
3042 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003043 setFeatureEnabledImpl(Features, "xsaveopt", true);
3044 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003045 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003046 break;
3047 case CK_K6_2:
3048 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003049 case CK_WinChip2:
3050 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003051 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003052 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003053 case CK_Athlon:
3054 case CK_AthlonThunderbird:
3055 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003056 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003057 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003058 case CK_Athlon4:
3059 case CK_AthlonXP:
3060 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003061 setFeatureEnabledImpl(Features, "sse", true);
3062 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003063 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003064 break;
3065 case CK_K8:
3066 case CK_Opteron:
3067 case CK_Athlon64:
3068 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003069 setFeatureEnabledImpl(Features, "sse2", true);
3070 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003071 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003072 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003073 case CK_AMDFAM10:
3074 setFeatureEnabledImpl(Features, "sse4a", true);
3075 setFeatureEnabledImpl(Features, "lzcnt", true);
3076 setFeatureEnabledImpl(Features, "popcnt", true);
3077 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003078 case CK_K8SSE3:
3079 case CK_OpteronSSE3:
3080 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003081 setFeatureEnabledImpl(Features, "sse3", true);
3082 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003083 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003084 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003085 case CK_BTVER2:
3086 setFeatureEnabledImpl(Features, "avx", true);
3087 setFeatureEnabledImpl(Features, "aes", true);
3088 setFeatureEnabledImpl(Features, "pclmul", true);
3089 setFeatureEnabledImpl(Features, "bmi", true);
3090 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003091 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003092 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003093 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003094 setFeatureEnabledImpl(Features, "ssse3", true);
3095 setFeatureEnabledImpl(Features, "sse4a", true);
3096 setFeatureEnabledImpl(Features, "lzcnt", true);
3097 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003098 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003099 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003100 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003101 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003102 case CK_BDVER4:
3103 setFeatureEnabledImpl(Features, "avx2", true);
3104 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003105 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003106 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003107 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003108 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003109 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003110 // FALLTHROUGH
3111 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003112 setFeatureEnabledImpl(Features, "bmi", true);
3113 setFeatureEnabledImpl(Features, "fma", true);
3114 setFeatureEnabledImpl(Features, "f16c", true);
3115 setFeatureEnabledImpl(Features, "tbm", true);
3116 // FALLTHROUGH
3117 case CK_BDVER1:
3118 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003119 setFeatureEnabledImpl(Features, "xop", true);
3120 setFeatureEnabledImpl(Features, "lzcnt", true);
3121 setFeatureEnabledImpl(Features, "aes", true);
3122 setFeatureEnabledImpl(Features, "pclmul", 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);
Craig Topperda9fe562015-10-15 05:23:38 +00003126 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003127 break;
Eli Friedman33465822011-07-08 23:31:17 +00003128 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003129 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3130 return false;
3131
3132 // Can't do this earlier because we need to be able to explicitly enable
3133 // or disable these features and the things that they depend upon.
3134
3135 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3136 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003137 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003138 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3139 FeaturesVec.end())
3140 Features["popcnt"] = true;
3141
3142 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3143 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003144 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003145 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3146 FeaturesVec.end())
3147 Features["prfchw"] = true;
3148
Eric Christophera7260af2015-10-08 20:10:18 +00003149 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3150 // then enable MMX.
3151 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003152 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003153 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3154 FeaturesVec.end())
3155 Features["mmx"] = true;
3156
Eric Christopherbbd746d2015-10-08 20:10:14 +00003157 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003158}
3159
Rafael Espindolae62e2792013-08-20 13:44:29 +00003160void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003161 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003162 if (Enabled) {
3163 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003164 case AVX512F:
3165 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003166 case AVX2:
3167 Features["avx2"] = true;
3168 case AVX:
3169 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003170 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003171 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003172 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003173 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003174 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003175 case SSSE3:
3176 Features["ssse3"] = true;
3177 case SSE3:
3178 Features["sse3"] = true;
3179 case SSE2:
3180 Features["sse2"] = true;
3181 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003182 Features["sse"] = true;
3183 case NoSSE:
3184 break;
3185 }
3186 return;
3187 }
3188
3189 switch (Level) {
3190 case NoSSE:
3191 case SSE1:
3192 Features["sse"] = false;
3193 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003194 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3195 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003196 case SSE3:
3197 Features["sse3"] = false;
3198 setXOPLevel(Features, NoXOP, false);
3199 case SSSE3:
3200 Features["ssse3"] = false;
3201 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003202 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003203 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003204 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003205 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003206 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3207 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003208 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003209 case AVX2:
3210 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003211 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003212 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003213 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003214 Features["avx512vl"] = Features["avx512vbmi"] =
3215 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003216 }
3217}
3218
3219void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003220 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003221 if (Enabled) {
3222 switch (Level) {
3223 case AMD3DNowAthlon:
3224 Features["3dnowa"] = true;
3225 case AMD3DNow:
3226 Features["3dnow"] = true;
3227 case MMX:
3228 Features["mmx"] = true;
3229 case NoMMX3DNow:
3230 break;
3231 }
3232 return;
3233 }
3234
3235 switch (Level) {
3236 case NoMMX3DNow:
3237 case MMX:
3238 Features["mmx"] = false;
3239 case AMD3DNow:
3240 Features["3dnow"] = false;
3241 case AMD3DNowAthlon:
3242 Features["3dnowa"] = false;
3243 }
3244}
3245
3246void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003247 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003248 if (Enabled) {
3249 switch (Level) {
3250 case XOP:
3251 Features["xop"] = true;
3252 case FMA4:
3253 Features["fma4"] = true;
3254 setSSELevel(Features, AVX, true);
3255 case SSE4A:
3256 Features["sse4a"] = true;
3257 setSSELevel(Features, SSE3, true);
3258 case NoXOP:
3259 break;
3260 }
3261 return;
3262 }
3263
3264 switch (Level) {
3265 case NoXOP:
3266 case SSE4A:
3267 Features["sse4a"] = false;
3268 case FMA4:
3269 Features["fma4"] = false;
3270 case XOP:
3271 Features["xop"] = false;
3272 }
3273}
3274
Craig Topper86d79ef2013-09-17 04:51:29 +00003275void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3276 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003277 // This is a bit of a hack to deal with the sse4 target feature when used
3278 // as part of the target attribute. We handle sse4 correctly everywhere
3279 // else. See below for more information on how we handle the sse4 options.
3280 if (Name != "sse4")
3281 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003282
Craig Topper29561122013-09-19 01:13:07 +00003283 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003284 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003285 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003286 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003287 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003288 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003289 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003290 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003291 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003292 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003293 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003294 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003295 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003296 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003297 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003298 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003299 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003300 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003301 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003302 if (Enabled)
3303 setSSELevel(Features, SSE2, Enabled);
3304 } else if (Name == "pclmul") {
3305 if (Enabled)
3306 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003307 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003308 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003309 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003310 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003311 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003312 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003313 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3314 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3315 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003316 if (Enabled)
3317 setSSELevel(Features, AVX512F, Enabled);
3318 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003319 if (Enabled)
3320 setSSELevel(Features, AVX, Enabled);
3321 } else if (Name == "fma4") {
3322 setXOPLevel(Features, FMA4, Enabled);
3323 } else if (Name == "xop") {
3324 setXOPLevel(Features, XOP, Enabled);
3325 } else if (Name == "sse4a") {
3326 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003327 } else if (Name == "f16c") {
3328 if (Enabled)
3329 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003330 } else if (Name == "sha") {
3331 if (Enabled)
3332 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003333 } else if (Name == "sse4") {
3334 // We can get here via the __target__ attribute since that's not controlled
3335 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3336 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3337 // disabled.
3338 if (Enabled)
3339 setSSELevel(Features, SSE42, Enabled);
3340 else
3341 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003342 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003343 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003344 Features["xsaveopt"] = false;
3345 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003346 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003347 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003348 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003349}
3350
Eric Christopher3ff21b32013-10-16 21:26:26 +00003351/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003352/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003353bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003354 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003355 for (const auto &Feature : Features) {
3356 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003357 continue;
3358
Eric Christopher610fe112015-08-26 08:21:55 +00003359 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003360 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003361 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003362 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003363 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003364 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003365 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003366 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003367 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003368 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003369 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003370 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003371 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003372 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003373 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003374 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003375 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003376 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003377 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003378 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003379 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003380 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003381 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003382 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003383 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003384 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003385 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003386 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003387 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003388 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003389 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003390 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003391 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003392 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003393 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003394 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003395 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003396 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003397 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003398 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003399 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003400 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003401 } else if (Feature == "+avx512vbmi") {
3402 HasAVX512VBMI = true;
3403 } else if (Feature == "+avx512ifma") {
3404 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003405 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003406 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003407 } else if (Feature == "+mpx") {
3408 HasMPX = true;
3409 } else if (Feature == "+movbe") {
3410 HasMOVBE = true;
3411 } else if (Feature == "+sgx") {
3412 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003413 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003414 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003415 } else if (Feature == "+fxsr") {
3416 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003417 } else if (Feature == "+xsave") {
3418 HasXSAVE = true;
3419 } else if (Feature == "+xsaveopt") {
3420 HasXSAVEOPT = true;
3421 } else if (Feature == "+xsavec") {
3422 HasXSAVEC = true;
3423 } else if (Feature == "+xsaves") {
3424 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003425 } else if (Feature == "+mwaitx") {
3426 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003427 } else if (Feature == "+pku") {
3428 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003429 } else if (Feature == "+clflushopt") {
3430 HasCLFLUSHOPT = true;
3431 } else if (Feature == "+pcommit") {
3432 HasPCOMMIT = true;
3433 } else if (Feature == "+clwb") {
3434 HasCLWB = true;
3435 } else if (Feature == "+umip") {
3436 HasUMIP = true;
3437 } else if (Feature == "+prefetchwt1") {
3438 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003439 }
3440
Benjamin Kramer27402c62012-03-05 15:10:44 +00003441 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003442 .Case("+avx512f", AVX512F)
3443 .Case("+avx2", AVX2)
3444 .Case("+avx", AVX)
3445 .Case("+sse4.2", SSE42)
3446 .Case("+sse4.1", SSE41)
3447 .Case("+ssse3", SSSE3)
3448 .Case("+sse3", SSE3)
3449 .Case("+sse2", SSE2)
3450 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003451 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003452 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003453
Eli Friedman33465822011-07-08 23:31:17 +00003454 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003455 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003456 .Case("+3dnowa", AMD3DNowAthlon)
3457 .Case("+3dnow", AMD3DNow)
3458 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003459 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003460 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003461
3462 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003463 .Case("+xop", XOP)
3464 .Case("+fma4", FMA4)
3465 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003466 .Default(NoXOP);
3467 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003468 }
Eli Friedman33465822011-07-08 23:31:17 +00003469
Rafael Espindolaeb265472013-08-21 21:59:03 +00003470 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3471 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003472 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3473 (FPMath == FP_387 && SSELevel >= SSE1)) {
3474 Diags.Report(diag::err_target_unsupported_fpmath) <<
3475 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003476 return false;
3477 }
3478
Alexey Bataev00396512015-07-02 03:40:19 +00003479 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003480 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003481 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003482}
Chris Lattnerecd49032009-03-02 22:27:17 +00003483
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003484/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3485/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003486void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003487 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003488 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003489 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003490 Builder.defineMacro("__amd64__");
3491 Builder.defineMacro("__amd64");
3492 Builder.defineMacro("__x86_64");
3493 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003494 if (getTriple().getArchName() == "x86_64h") {
3495 Builder.defineMacro("__x86_64h");
3496 Builder.defineMacro("__x86_64h__");
3497 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003498 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003499 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003500 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003501
Chris Lattnerecd49032009-03-02 22:27:17 +00003502 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003503 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3504 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003505 switch (CPU) {
3506 case CK_Generic:
3507 break;
3508 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003509 // The rest are coming from the i386 define above.
3510 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003511 break;
3512 case CK_i486:
3513 case CK_WinChipC6:
3514 case CK_WinChip2:
3515 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003516 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003517 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003518 case CK_PentiumMMX:
3519 Builder.defineMacro("__pentium_mmx__");
3520 Builder.defineMacro("__tune_pentium_mmx__");
3521 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003522 case CK_i586:
3523 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003524 defineCPUMacros(Builder, "i586");
3525 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003526 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003527 case CK_Pentium3:
3528 case CK_Pentium3M:
3529 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003530 Builder.defineMacro("__tune_pentium3__");
3531 // Fallthrough
3532 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003533 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003534 Builder.defineMacro("__tune_pentium2__");
3535 // Fallthrough
3536 case CK_PentiumPro:
3537 Builder.defineMacro("__tune_i686__");
3538 Builder.defineMacro("__tune_pentiumpro__");
3539 // Fallthrough
3540 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003541 Builder.defineMacro("__i686");
3542 Builder.defineMacro("__i686__");
3543 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3544 Builder.defineMacro("__pentiumpro");
3545 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003546 break;
3547 case CK_Pentium4:
3548 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003549 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003550 break;
3551 case CK_Yonah:
3552 case CK_Prescott:
3553 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003554 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003555 break;
3556 case CK_Core2:
3557 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003558 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003559 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003560 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003561 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003562 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003563 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003564 defineCPUMacros(Builder, "slm");
3565 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003566 case CK_Nehalem:
3567 case CK_Westmere:
3568 case CK_SandyBridge:
3569 case CK_IvyBridge:
3570 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003571 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003572 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003573 // FIXME: Historically, we defined this legacy name, it would be nice to
3574 // remove it at some point. We've never exposed fine-grained names for
3575 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003576 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003577 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003578 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003579 defineCPUMacros(Builder, "skx");
3580 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003581 case CK_Cannonlake:
3582 break;
Craig Topper449314e2013-08-20 07:09:39 +00003583 case CK_KNL:
3584 defineCPUMacros(Builder, "knl");
3585 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003586 case CK_Lakemont:
3587 Builder.defineMacro("__tune_lakemont__");
3588 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003589 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003590 Builder.defineMacro("__k6_2__");
3591 Builder.defineMacro("__tune_k6_2__");
3592 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003593 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003594 if (CPU != CK_K6_2) { // In case of fallthrough
3595 // FIXME: GCC may be enabling these in cases where some other k6
3596 // architecture is specified but -m3dnow is explicitly provided. The
3597 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003598 Builder.defineMacro("__k6_3__");
3599 Builder.defineMacro("__tune_k6_3__");
3600 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003601 // Fallthrough
3602 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003603 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003604 break;
3605 case CK_Athlon:
3606 case CK_AthlonThunderbird:
3607 case CK_Athlon4:
3608 case CK_AthlonXP:
3609 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003610 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003611 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003612 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003613 Builder.defineMacro("__tune_athlon_sse__");
3614 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003615 break;
3616 case CK_K8:
3617 case CK_K8SSE3:
3618 case CK_x86_64:
3619 case CK_Opteron:
3620 case CK_OpteronSSE3:
3621 case CK_Athlon64:
3622 case CK_Athlon64SSE3:
3623 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003624 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003625 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003626 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003627 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003628 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003629 case CK_BTVER1:
3630 defineCPUMacros(Builder, "btver1");
3631 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003632 case CK_BTVER2:
3633 defineCPUMacros(Builder, "btver2");
3634 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003635 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003636 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003637 break;
3638 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003639 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003640 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003641 case CK_BDVER3:
3642 defineCPUMacros(Builder, "bdver3");
3643 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003644 case CK_BDVER4:
3645 defineCPUMacros(Builder, "bdver4");
3646 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003647 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003648 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003649 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003650 }
Chris Lattner96e43572009-03-02 22:40:39 +00003651
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003652 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003653 Builder.defineMacro("__REGISTER_PREFIX__", "");
3654
Chris Lattner6df41af2009-04-19 17:32:33 +00003655 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3656 // functions in glibc header files that use FP Stack inline asm which the
3657 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003658 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003659
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003660 if (HasAES)
3661 Builder.defineMacro("__AES__");
3662
Craig Topper3f122a72012-05-31 05:18:48 +00003663 if (HasPCLMUL)
3664 Builder.defineMacro("__PCLMUL__");
3665
Craig Topper22967d42011-12-25 05:06:45 +00003666 if (HasLZCNT)
3667 Builder.defineMacro("__LZCNT__");
3668
Benjamin Kramer1e250392012-07-07 09:39:18 +00003669 if (HasRDRND)
3670 Builder.defineMacro("__RDRND__");
3671
Craig Topper8c7f2512014-11-03 06:51:41 +00003672 if (HasFSGSBASE)
3673 Builder.defineMacro("__FSGSBASE__");
3674
Craig Topper22967d42011-12-25 05:06:45 +00003675 if (HasBMI)
3676 Builder.defineMacro("__BMI__");
3677
3678 if (HasBMI2)
3679 Builder.defineMacro("__BMI2__");
3680
Craig Topper1de83482011-12-29 16:10:46 +00003681 if (HasPOPCNT)
3682 Builder.defineMacro("__POPCNT__");
3683
Michael Liao625a8752012-11-10 05:17:46 +00003684 if (HasRTM)
3685 Builder.defineMacro("__RTM__");
3686
Michael Liao74f4eaf2013-03-26 17:52:08 +00003687 if (HasPRFCHW)
3688 Builder.defineMacro("__PRFCHW__");
3689
Michael Liaoffaae352013-03-29 05:17:55 +00003690 if (HasRDSEED)
3691 Builder.defineMacro("__RDSEED__");
3692
Robert Khasanov50e6f582014-09-19 09:53:48 +00003693 if (HasADX)
3694 Builder.defineMacro("__ADX__");
3695
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003696 if (HasTBM)
3697 Builder.defineMacro("__TBM__");
3698
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003699 if (HasMWAITX)
3700 Builder.defineMacro("__MWAITX__");
3701
Rafael Espindolae62e2792013-08-20 13:44:29 +00003702 switch (XOPLevel) {
3703 case XOP:
3704 Builder.defineMacro("__XOP__");
3705 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003706 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003707 case SSE4A:
3708 Builder.defineMacro("__SSE4A__");
3709 case NoXOP:
3710 break;
3711 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003712
Craig Topperbba778b2012-06-03 21:46:30 +00003713 if (HasFMA)
3714 Builder.defineMacro("__FMA__");
3715
Manman Rena45358c2012-10-11 00:59:55 +00003716 if (HasF16C)
3717 Builder.defineMacro("__F16C__");
3718
Craig Topper679b53a2013-08-21 05:29:10 +00003719 if (HasAVX512CD)
3720 Builder.defineMacro("__AVX512CD__");
3721 if (HasAVX512ER)
3722 Builder.defineMacro("__AVX512ER__");
3723 if (HasAVX512PF)
3724 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003725 if (HasAVX512DQ)
3726 Builder.defineMacro("__AVX512DQ__");
3727 if (HasAVX512BW)
3728 Builder.defineMacro("__AVX512BW__");
3729 if (HasAVX512VL)
3730 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003731 if (HasAVX512VBMI)
3732 Builder.defineMacro("__AVX512VBMI__");
3733 if (HasAVX512IFMA)
3734 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003735
Ben Langmuir58078d02013-09-19 13:22:04 +00003736 if (HasSHA)
3737 Builder.defineMacro("__SHA__");
3738
Craig Toppere33f51f2015-10-16 06:22:36 +00003739 if (HasFXSR)
3740 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003741 if (HasXSAVE)
3742 Builder.defineMacro("__XSAVE__");
3743 if (HasXSAVEOPT)
3744 Builder.defineMacro("__XSAVEOPT__");
3745 if (HasXSAVEC)
3746 Builder.defineMacro("__XSAVEC__");
3747 if (HasXSAVES)
3748 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003749 if (HasPKU)
3750 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003751 if (HasCX16)
3752 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3753
Chris Lattner96e43572009-03-02 22:40:39 +00003754 // Each case falls through to the previous one here.
3755 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003756 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003757 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003758 case AVX2:
3759 Builder.defineMacro("__AVX2__");
3760 case AVX:
3761 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003762 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003763 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003764 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003765 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003766 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003767 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003768 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003769 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003770 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003771 Builder.defineMacro("__SSE2__");
3772 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003773 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003774 Builder.defineMacro("__SSE__");
3775 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003776 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003777 break;
3778 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003779
Derek Schuffc7dd7222012-10-11 15:52:22 +00003780 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003781 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003782 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003783 case AVX2:
3784 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003785 case SSE42:
3786 case SSE41:
3787 case SSSE3:
3788 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003789 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003790 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003791 break;
3792 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003793 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003794 break;
3795 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003796 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003797 }
3798 }
3799
Anders Carlssone437c682010-01-27 03:47:49 +00003800 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003801 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003802 case AMD3DNowAthlon:
3803 Builder.defineMacro("__3dNOW_A__");
3804 case AMD3DNow:
3805 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003806 case MMX:
3807 Builder.defineMacro("__MMX__");
3808 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003809 break;
3810 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003811
3812 if (CPU >= CK_i486) {
3813 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3814 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3815 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3816 }
3817 if (CPU >= CK_i586)
3818 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003819}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003820
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003821bool X86TargetInfo::hasFeature(StringRef Feature) const {
3822 return llvm::StringSwitch<bool>(Feature)
3823 .Case("aes", HasAES)
3824 .Case("avx", SSELevel >= AVX)
3825 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003826 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003827 .Case("avx512cd", HasAVX512CD)
3828 .Case("avx512er", HasAVX512ER)
3829 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003830 .Case("avx512dq", HasAVX512DQ)
3831 .Case("avx512bw", HasAVX512BW)
3832 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003833 .Case("avx512vbmi", HasAVX512VBMI)
3834 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003835 .Case("bmi", HasBMI)
3836 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003837 .Case("clflushopt", HasCLFLUSHOPT)
3838 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003839 .Case("cx16", HasCX16)
3840 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003841 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003842 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003843 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003844 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003845 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003846 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3847 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3848 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003849 .Case("movbe", HasMOVBE)
3850 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003851 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003852 .Case("pcommit", HasPCOMMIT)
3853 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003854 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003855 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003856 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003857 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003858 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003859 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003860 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003861 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003862 .Case("sse", SSELevel >= SSE1)
3863 .Case("sse2", SSELevel >= SSE2)
3864 .Case("sse3", SSELevel >= SSE3)
3865 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003866 .Case("sse4.1", SSELevel >= SSE41)
3867 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003868 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003869 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003870 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003871 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003872 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3873 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003874 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003875 .Case("xsave", HasXSAVE)
3876 .Case("xsavec", HasXSAVEC)
3877 .Case("xsaves", HasXSAVES)
3878 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003879 .Default(false);
3880}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003881
Eric Christopherd9832702015-06-29 21:00:05 +00003882// We can't use a generic validation scheme for the features accepted here
3883// versus subtarget features accepted in the target attribute because the
3884// bitfield structure that's initialized in the runtime only supports the
3885// below currently rather than the full range of subtarget features. (See
3886// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3887bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3888 return llvm::StringSwitch<bool>(FeatureStr)
3889 .Case("cmov", true)
3890 .Case("mmx", true)
3891 .Case("popcnt", true)
3892 .Case("sse", true)
3893 .Case("sse2", true)
3894 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003895 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003896 .Case("sse4.1", true)
3897 .Case("sse4.2", true)
3898 .Case("avx", true)
3899 .Case("avx2", true)
3900 .Case("sse4a", true)
3901 .Case("fma4", true)
3902 .Case("xop", true)
3903 .Case("fma", true)
3904 .Case("avx512f", true)
3905 .Case("bmi", true)
3906 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003907 .Case("aes", true)
3908 .Case("pclmul", true)
3909 .Case("avx512vl", true)
3910 .Case("avx512bw", true)
3911 .Case("avx512dq", true)
3912 .Case("avx512cd", true)
3913 .Case("avx512er", true)
3914 .Case("avx512pf", true)
3915 .Case("avx512vbmi", true)
3916 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003917 .Default(false);
3918}
3919
Eli Friedman3fd920a2008-08-20 02:34:37 +00003920bool
Anders Carlsson58436352009-02-28 17:11:49 +00003921X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003922 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003923 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003924 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003925 // Constant constraints.
3926 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3927 // instructions.
3928 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3929 // x86_64 instructions.
3930 case 's':
3931 Info.setRequiresImmediate();
3932 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003933 case 'I':
3934 Info.setRequiresImmediate(0, 31);
3935 return true;
3936 case 'J':
3937 Info.setRequiresImmediate(0, 63);
3938 return true;
3939 case 'K':
3940 Info.setRequiresImmediate(-128, 127);
3941 return true;
3942 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003943 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003944 return true;
3945 case 'M':
3946 Info.setRequiresImmediate(0, 3);
3947 return true;
3948 case 'N':
3949 Info.setRequiresImmediate(0, 255);
3950 return true;
3951 case 'O':
3952 Info.setRequiresImmediate(0, 127);
3953 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003954 // Register constraints.
3955 case 'Y': // 'Y' is the first character for several 2-character constraints.
3956 // Shift the pointer to the second character of the constraint.
3957 Name++;
3958 switch (*Name) {
3959 default:
3960 return false;
3961 case '0': // First SSE register.
3962 case 't': // Any SSE register, when SSE2 is enabled.
3963 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3964 case 'm': // Any MMX register, when inter-unit moves enabled.
3965 Info.setAllowsRegister();
3966 return true;
3967 }
3968 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003969 // Constraint 'f' cannot be used for output operands.
3970 if (Info.ConstraintStr[0] == '=')
3971 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003972 Info.setAllowsRegister();
3973 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003974 case 'a': // eax.
3975 case 'b': // ebx.
3976 case 'c': // ecx.
3977 case 'd': // edx.
3978 case 'S': // esi.
3979 case 'D': // edi.
3980 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003981 case 't': // Top of floating point stack.
3982 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003983 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003984 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003985 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003986 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003987 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3988 case 'l': // "Index" registers: any general register that can be used as an
3989 // index in a base+index memory access.
3990 Info.setAllowsRegister();
3991 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003992 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003993 case 'C': // SSE floating point constant.
3994 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003995 return true;
3996 }
3997}
3998
Akira Hatanaka974131e2014-09-18 18:17:18 +00003999bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4000 unsigned Size) const {
4001 // Strip off constraint modifiers.
4002 while (Constraint[0] == '=' ||
4003 Constraint[0] == '+' ||
4004 Constraint[0] == '&')
4005 Constraint = Constraint.substr(1);
4006
4007 return validateOperandSize(Constraint, Size);
4008}
4009
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004010bool X86TargetInfo::validateInputSize(StringRef Constraint,
4011 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004012 return validateOperandSize(Constraint, Size);
4013}
4014
4015bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4016 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004017 switch (Constraint[0]) {
4018 default: break;
4019 case 'y':
4020 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004021 case 'f':
4022 case 't':
4023 case 'u':
4024 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00004025 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004026 if (SSELevel >= AVX512F)
4027 // 512-bit zmm registers can be used if target supports AVX512F.
4028 return Size <= 512U;
4029 else if (SSELevel >= AVX)
4030 // 256-bit ymm registers can be used if target supports AVX.
4031 return Size <= 256U;
4032 return Size <= 128U;
4033 case 'Y':
4034 // 'Y' is the first character for several 2-character constraints.
4035 switch (Constraint[1]) {
4036 default: break;
4037 case 'm':
4038 // 'Ym' is synonymous with 'y'.
4039 return Size <= 64;
4040 case 'i':
4041 case 't':
4042 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4043 if (SSELevel >= AVX512F)
4044 return Size <= 512U;
4045 else if (SSELevel >= AVX)
4046 return Size <= 256U;
4047 return SSELevel >= SSE2 && Size <= 128U;
4048 }
4049
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004050 }
4051
4052 return true;
4053}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004054
Eli Friedman3fd920a2008-08-20 02:34:37 +00004055std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004056X86TargetInfo::convertConstraint(const char *&Constraint) const {
4057 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004058 case 'a': return std::string("{ax}");
4059 case 'b': return std::string("{bx}");
4060 case 'c': return std::string("{cx}");
4061 case 'd': return std::string("{dx}");
4062 case 'S': return std::string("{si}");
4063 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004064 case 'p': // address
4065 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004066 case 't': // top of floating point stack.
4067 return std::string("{st}");
4068 case 'u': // second from top of floating point stack.
4069 return std::string("{st(1)}"); // second from top of floating point stack.
4070 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004071 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004072 }
4073}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004074
Eli Friedman3fd920a2008-08-20 02:34:37 +00004075// X86-32 generic target
4076class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004077public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004078 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4079 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004080 DoubleAlign = LongLongAlign = 32;
4081 LongDoubleWidth = 96;
4082 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004083 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004084 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004085 SizeType = UnsignedInt;
4086 PtrDiffType = SignedInt;
4087 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004088 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004089
4090 // Use fpret for all types.
4091 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4092 (1 << TargetInfo::Double) |
4093 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004094
4095 // x86-32 has atomics up to 8 bytes
4096 // FIXME: Check that we actually have cmpxchg8b before setting
4097 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4098 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004099 }
Craig Topper3164f332014-03-11 03:39:26 +00004100 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004101 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004102 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004103
Craig Topper3164f332014-03-11 03:39:26 +00004104 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004105 if (RegNo == 0) return 0;
4106 if (RegNo == 1) return 2;
4107 return -1;
4108 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004109 bool validateOperandSize(StringRef Constraint,
4110 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004111 switch (Constraint[0]) {
4112 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004113 case 'R':
4114 case 'q':
4115 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004116 case 'a':
4117 case 'b':
4118 case 'c':
4119 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004120 case 'S':
4121 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004122 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004123 case 'A':
4124 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004125 }
4126
Akira Hatanaka974131e2014-09-18 18:17:18 +00004127 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004128 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004129};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004130
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004131class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4132public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004133 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4134 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004135
Craig Topper3164f332014-03-11 03:39:26 +00004136 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004137 unsigned Major, Minor, Micro;
4138 getTriple().getOSVersion(Major, Minor, Micro);
4139 // New NetBSD uses the default rounding mode.
4140 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4141 return X86_32TargetInfo::getFloatEvalMethod();
4142 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004143 return 1;
4144 }
4145};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004146
Eli Friedmane3aa4542009-07-05 18:47:56 +00004147class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4148public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004149 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4150 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004151 SizeType = UnsignedLong;
4152 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004153 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004154 }
4155};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004156
Eli Friedman9fa28852012-08-08 23:57:20 +00004157class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4158public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004159 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4160 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004161 SizeType = UnsignedLong;
4162 IntPtrType = SignedLong;
4163 PtrDiffType = SignedLong;
4164 }
4165};
Eli Friedman9fa28852012-08-08 23:57:20 +00004166
Torok Edwinb2b37c62009-06-30 17:10:35 +00004167class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004168public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004169 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4170 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004171 LongDoubleWidth = 128;
4172 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004173 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004174 MaxVectorAlign = 256;
4175 // The watchOS simulator uses the builtin bool type for Objective-C.
4176 llvm::Triple T = llvm::Triple(Triple);
4177 if (T.isWatchOS())
4178 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004179 SizeType = UnsignedLong;
4180 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004181 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004182 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004183 }
4184
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004185 bool handleTargetFeatures(std::vector<std::string> &Features,
4186 DiagnosticsEngine &Diags) override {
4187 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4188 Diags))
4189 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004190 // We now know the features we have: we can decide how to align vectors.
4191 MaxVectorAlign =
4192 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004193 return true;
4194 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004195};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004196
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004197// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004198class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004199public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004200 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4201 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004202 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004203 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004204 bool IsWinCOFF =
4205 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004206 resetDataLayout(IsWinCOFF
4207 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4208 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004209 }
Craig Topper3164f332014-03-11 03:39:26 +00004210 void getTargetDefines(const LangOptions &Opts,
4211 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004212 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4213 }
4214};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004215
4216// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004217class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004218public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004219 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4220 const TargetOptions &Opts)
4221 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004222 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004223 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4224 }
Craig Topper3164f332014-03-11 03:39:26 +00004225 void getTargetDefines(const LangOptions &Opts,
4226 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004227 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4228 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4229 // The value of the following reflects processor type.
4230 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4231 // We lost the original triple, so we use the default.
4232 Builder.defineMacro("_M_IX86", "600");
4233 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004234};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004235
David Majnemerae1ed0e2015-05-28 04:36:18 +00004236static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004237 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4238 // supports __declspec natively under -fms-extensions, but we define a no-op
4239 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004240 if (Opts.MicrosoftExt)
4241 Builder.defineMacro("__declspec", "__declspec");
4242 else
4243 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4244
4245 if (!Opts.MicrosoftExt) {
4246 // Provide macros for all the calling convention keywords. Provide both
4247 // single and double underscore prefixed variants. These are available on
4248 // x64 as well as x86, even though they have no effect.
4249 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4250 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004251 std::string GCCSpelling = "__attribute__((__";
4252 GCCSpelling += CC;
4253 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004254 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4255 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4256 }
4257 }
4258}
4259
David Majnemerae1ed0e2015-05-28 04:36:18 +00004260static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4261 Builder.defineMacro("__MSVCRT__");
4262 Builder.defineMacro("__MINGW32__");
4263 addCygMingDefines(Opts, Builder);
4264}
4265
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004266// x86-32 MinGW target
4267class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4268public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004269 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4270 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004271 void getTargetDefines(const LangOptions &Opts,
4272 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004273 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004274 DefineStd(Builder, "WIN32", Opts);
4275 DefineStd(Builder, "WINNT", Opts);
4276 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004277 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004278 }
4279};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004280
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004281// x86-32 Cygwin target
4282class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4283public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004284 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4285 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004286 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004287 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004288 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 +00004289 }
Craig Topper3164f332014-03-11 03:39:26 +00004290 void getTargetDefines(const LangOptions &Opts,
4291 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004292 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004293 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004294 Builder.defineMacro("__CYGWIN__");
4295 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004296 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004297 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004298 if (Opts.CPlusPlus)
4299 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004300 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004301};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004302
Chris Lattnerb986aba2010-04-11 19:29:39 +00004303// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004304class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004305public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004306 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004307 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004308 }
Craig Topper3164f332014-03-11 03:39:26 +00004309 void getTargetDefines(const LangOptions &Opts,
4310 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004311 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004312 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004313 }
4314};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004315
Alexey Bataevc99b0492015-11-25 09:24:26 +00004316// X86-32 MCU target
4317class MCUX86_32TargetInfo : public X86_32TargetInfo {
4318public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004319 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4320 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004321 LongDoubleWidth = 64;
4322 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004323 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 +00004324 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004325 }
4326
4327 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4328 // On MCU we support only C calling convention.
4329 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4330 }
4331
4332 void getTargetDefines(const LangOptions &Opts,
4333 MacroBuilder &Builder) const override {
4334 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4335 Builder.defineMacro("__iamcu");
4336 Builder.defineMacro("__iamcu__");
4337 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004338
4339 bool allowsLargerPreferedTypeAlignment() const override {
4340 return false;
4341 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004342};
4343
Douglas Gregor9fabd852011-07-01 22:41:14 +00004344// RTEMS Target
4345template<typename Target>
4346class RTEMSTargetInfo : public OSTargetInfo<Target> {
4347protected:
Craig Topper3164f332014-03-11 03:39:26 +00004348 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4349 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004350 // RTEMS defines; list based off of gcc output
4351
Douglas Gregor9fabd852011-07-01 22:41:14 +00004352 Builder.defineMacro("__rtems__");
4353 Builder.defineMacro("__ELF__");
4354 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004355
Douglas Gregor9fabd852011-07-01 22:41:14 +00004356public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004357 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4358 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004359 switch (Triple.getArch()) {
4360 default:
4361 case llvm::Triple::x86:
4362 // this->MCountName = ".mcount";
4363 break;
4364 case llvm::Triple::mips:
4365 case llvm::Triple::mipsel:
4366 case llvm::Triple::ppc:
4367 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004368 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004369 // this->MCountName = "_mcount";
4370 break;
4371 case llvm::Triple::arm:
4372 // this->MCountName = "__mcount";
4373 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004374 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004375 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004376};
4377
Douglas Gregor9fabd852011-07-01 22:41:14 +00004378// x86-32 RTEMS target
4379class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4380public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004381 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4382 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004383 SizeType = UnsignedLong;
4384 IntPtrType = SignedLong;
4385 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004386 }
Craig Topper3164f332014-03-11 03:39:26 +00004387 void getTargetDefines(const LangOptions &Opts,
4388 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004389 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4390 Builder.defineMacro("__INTEL__");
4391 Builder.defineMacro("__rtems__");
4392 }
4393};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004394
Eli Friedman3fd920a2008-08-20 02:34:37 +00004395// x86-64 generic target
4396class X86_64TargetInfo : public X86TargetInfo {
4397public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004398 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4399 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004400 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004401 bool IsWinCOFF =
4402 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004403 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004404 LongDoubleWidth = 128;
4405 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004406 LargeArrayMinWidth = 128;
4407 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004408 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004409 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4410 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4411 IntPtrType = IsX32 ? SignedInt : SignedLong;
4412 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004413 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004414 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004415
Eric Christopher917e9522014-11-18 22:36:15 +00004416 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004417 resetDataLayout(IsX32
4418 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4419 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4420 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004421
4422 // Use fpret only for long double.
4423 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004424
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004425 // Use fp2ret for _Complex long double.
4426 ComplexLongDoubleUsesFP2Ret = true;
4427
Charles Davisc7d5c942015-09-17 20:55:33 +00004428 // Make __builtin_ms_va_list available.
4429 HasBuiltinMSVaList = true;
4430
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004431 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004432 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004433 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004434 }
Craig Topper3164f332014-03-11 03:39:26 +00004435 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004436 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004437 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004438
Craig Topper3164f332014-03-11 03:39:26 +00004439 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004440 if (RegNo == 0) return 0;
4441 if (RegNo == 1) return 1;
4442 return -1;
4443 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004444
Craig Topper3164f332014-03-11 03:39:26 +00004445 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004446 switch (CC) {
4447 case CC_C:
4448 case CC_Swift:
4449 case CC_X86VectorCall:
4450 case CC_IntelOclBicc:
4451 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004452 case CC_PreserveMost:
4453 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004454 return CCCR_OK;
4455 default:
4456 return CCCR_Warning;
4457 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004458 }
4459
Craig Topper3164f332014-03-11 03:39:26 +00004460 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004461 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004462 }
4463
Pavel Chupinfd223e12014-08-04 12:39:43 +00004464 // for x32 we need it here explicitly
4465 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004466 unsigned getUnwindWordWidth() const override { return 64; }
4467 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004468
4469 bool validateGlobalRegisterVariable(StringRef RegName,
4470 unsigned RegSize,
4471 bool &HasSizeMismatch) const override {
4472 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4473 // handle.
4474 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4475 // Check that the register size is 64-bit.
4476 HasSizeMismatch = RegSize != 64;
4477 return true;
4478 }
4479
4480 // Check if the register is a 32-bit register the backend can handle.
4481 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4482 HasSizeMismatch);
4483 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004484};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004485
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004486// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004487class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004488public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004489 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4490 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004491 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004492 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004493 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004494 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004495 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004496 SizeType = UnsignedLongLong;
4497 PtrDiffType = SignedLongLong;
4498 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004499 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004500
Craig Topper3164f332014-03-11 03:39:26 +00004501 void getTargetDefines(const LangOptions &Opts,
4502 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004503 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004504 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004505 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004506
Craig Topper3164f332014-03-11 03:39:26 +00004507 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004508 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004509 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004510
Craig Topper3164f332014-03-11 03:39:26 +00004511 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004512 switch (CC) {
4513 case CC_X86StdCall:
4514 case CC_X86ThisCall:
4515 case CC_X86FastCall:
4516 return CCCR_Ignore;
4517 case CC_C:
4518 case CC_X86VectorCall:
4519 case CC_IntelOclBicc:
4520 case CC_X86_64SysV:
4521 return CCCR_OK;
4522 default:
4523 return CCCR_Warning;
4524 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004525 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004526};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004527
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004528// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004529class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004530public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004531 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4532 const TargetOptions &Opts)
4533 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004534 LongDoubleWidth = LongDoubleAlign = 64;
4535 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004536 }
Craig Topper3164f332014-03-11 03:39:26 +00004537 void getTargetDefines(const LangOptions &Opts,
4538 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004539 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4540 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004541 Builder.defineMacro("_M_X64", "100");
4542 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004543 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004544};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004545
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004546// x86-64 MinGW target
4547class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4548public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004549 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4550 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004551 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4552 // with x86 FP ops. Weird.
4553 LongDoubleWidth = LongDoubleAlign = 128;
4554 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4555 }
4556
Craig Topper3164f332014-03-11 03:39:26 +00004557 void getTargetDefines(const LangOptions &Opts,
4558 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004559 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004560 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004561 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004562 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004563
4564 // GCC defines this macro when it is using __gxx_personality_seh0.
4565 if (!Opts.SjLjExceptions)
4566 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004567 }
4568};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004569
Yaron Kerend030d112015-07-22 17:38:19 +00004570// x86-64 Cygwin target
4571class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4572public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004573 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4574 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004575 TLSSupported = false;
4576 WCharType = UnsignedShort;
4577 }
4578 void getTargetDefines(const LangOptions &Opts,
4579 MacroBuilder &Builder) const override {
4580 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4581 Builder.defineMacro("__x86_64__");
4582 Builder.defineMacro("__CYGWIN__");
4583 Builder.defineMacro("__CYGWIN64__");
4584 addCygMingDefines(Opts, Builder);
4585 DefineStd(Builder, "unix", Opts);
4586 if (Opts.CPlusPlus)
4587 Builder.defineMacro("_GNU_SOURCE");
4588
4589 // GCC defines this macro when it is using __gxx_personality_seh0.
4590 if (!Opts.SjLjExceptions)
4591 Builder.defineMacro("__SEH__");
4592 }
4593};
4594
Eli Friedman2857ccb2009-07-01 03:36:11 +00004595class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4596public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004597 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4598 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004599 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004600 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4601 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004602 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004603 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004604 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004605 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004606
4607 bool handleTargetFeatures(std::vector<std::string> &Features,
4608 DiagnosticsEngine &Diags) override {
4609 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4610 Diags))
4611 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004612 // We now know the features we have: we can decide how to align vectors.
4613 MaxVectorAlign =
4614 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004615 return true;
4616 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004617};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004618
Eli Friedman245f2292009-07-05 22:31:18 +00004619class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4620public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004621 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4622 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004623 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004624 Int64Type = SignedLongLong;
4625 }
4626};
Eli Friedman245f2292009-07-05 22:31:18 +00004627
Eli Friedman9fa28852012-08-08 23:57:20 +00004628class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4629public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004630 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4631 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004632 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004633 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004634 }
4635};
Tim Northover9bb857a2013-01-31 12:13:10 +00004636
Eli Friedmanf05b7722008-08-20 07:44:10 +00004637class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004638 // Possible FPU choices.
4639 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004640 VFP2FPU = (1 << 0),
4641 VFP3FPU = (1 << 1),
4642 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004643 NeonFPU = (1 << 3),
4644 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004645 };
4646
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004647 // Possible HWDiv features.
4648 enum HWDivMode {
4649 HWDivThumb = (1 << 0),
4650 HWDivARM = (1 << 1)
4651 };
4652
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004653 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004654 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004655 }
4656
4657 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4658 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004659
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004660 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004661
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004662 StringRef CPUProfile;
4663 StringRef CPUAttr;
4664
Rafael Espindolaeb265472013-08-21 21:59:03 +00004665 enum {
4666 FP_Default,
4667 FP_VFP,
4668 FP_Neon
4669 } FPMath;
4670
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004671 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004672 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004673 unsigned ArchProfile;
4674 unsigned ArchVersion;
4675
Bernard Ogdenda13af32013-10-24 18:32:51 +00004676 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004677
Logan Chien57086ce2012-10-10 06:56:20 +00004678 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004679 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004680
4681 // Initialized via features.
4682 unsigned SoftFloat : 1;
4683 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004684
Bernard Ogden18b57012013-10-29 09:47:51 +00004685 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004686 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004687 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004688 unsigned Unaligned : 1;
4689
4690 enum {
4691 LDREX_B = (1 << 0), /// byte (8-bit)
4692 LDREX_H = (1 << 1), /// half (16-bit)
4693 LDREX_W = (1 << 2), /// word (32-bit)
4694 LDREX_D = (1 << 3), /// double (64-bit)
4695 };
4696
4697 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004698
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004699 // ACLE 6.5.1 Hardware floating point
4700 enum {
4701 HW_FP_HP = (1 << 1), /// half (16-bit)
4702 HW_FP_SP = (1 << 2), /// single (32-bit)
4703 HW_FP_DP = (1 << 3), /// double (64-bit)
4704 };
4705 uint32_t HW_FP;
4706
Chris Lattner5cc15e02010-03-03 19:03:45 +00004707 static const Builtin::Info BuiltinInfo[];
4708
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004709 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004710 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004711
4712 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004713 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004714
Renato Golin0201a9e2016-09-22 19:28:20 +00004715 // size_t is unsigned long on MachO-derived environments, NetBSD,
4716 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004717 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004718 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004719 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004720 SizeType = UnsignedLong;
4721 else
4722 SizeType = UnsignedInt;
4723
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004724 switch (T.getOS()) {
4725 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004726 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004727 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004728 break;
4729 case llvm::Triple::Win32:
4730 WCharType = UnsignedShort;
4731 break;
4732 case llvm::Triple::Linux:
4733 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004734 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4735 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004736 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004737 }
4738
4739 UseBitFieldTypeAlignment = true;
4740
4741 ZeroLengthBitfieldBoundary = 0;
4742
Tim Northover147cd2f2014-10-14 22:12:21 +00004743 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4744 // so set preferred for small types to 32.
4745 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004746 resetDataLayout(BigEndian
4747 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4748 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004749 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004750 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004751 resetDataLayout("e"
4752 "-m:w"
4753 "-p:32:32"
4754 "-i64:64"
4755 "-v128:64:128"
4756 "-a:0:32"
4757 "-n32"
4758 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004759 } else if (T.isOSNaCl()) {
4760 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004761 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004762 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004763 resetDataLayout(BigEndian
4764 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4765 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004766 }
4767
4768 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004769 }
4770
Tim Northover5627d392015-10-30 16:30:45 +00004771 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004772 const llvm::Triple &T = getTriple();
4773
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004774 IsAAPCS = false;
4775
Tim Northover5627d392015-10-30 16:30:45 +00004776 if (IsAAPCS16)
4777 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4778 else
4779 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004780
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004781 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004782 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004783 SizeType = UnsignedInt;
4784 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004785 SizeType = UnsignedLong;
4786
4787 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4788 WCharType = SignedInt;
4789
4790 // Do not respect the alignment of bit-field types when laying out
4791 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4792 UseBitFieldTypeAlignment = false;
4793
4794 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4795 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4796 /// gcc.
4797 ZeroLengthBitfieldBoundary = 32;
4798
Tim Northover5627d392015-10-30 16:30:45 +00004799 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4800 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004801 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004802 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004803 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004804 BigEndian
4805 ? "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 +00004806 : "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 +00004807 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004808 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004809 BigEndian
4810 ? "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 +00004811 : "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 +00004812
4813 // FIXME: Override "preferred align" for double and long long.
4814 }
4815
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004816 void setArchInfo() {
4817 StringRef ArchName = getTriple().getArchName();
4818
Renato Goline84b0002015-10-08 16:43:26 +00004819 ArchISA = llvm::ARM::parseArchISA(ArchName);
4820 CPU = llvm::ARM::getDefaultCPU(ArchName);
4821 unsigned AK = llvm::ARM::parseArch(ArchName);
4822 if (AK != llvm::ARM::AK_INVALID)
4823 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004824 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004825 }
4826
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004827 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004828 StringRef SubArch;
4829
4830 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004831 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004832 SubArch = llvm::ARM::getSubArch(ArchKind);
4833 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4834 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004835
4836 // cache CPU related strings
4837 CPUAttr = getCPUAttr();
4838 CPUProfile = getCPUProfile();
4839 }
4840
4841 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004842 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004843 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004844 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004845 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4846 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004847 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004848 if (ArchProfile == llvm::ARM::PK_M) {
4849 MaxAtomicPromoteWidth = 32;
4850 if (ShouldUseInlineAtomic)
4851 MaxAtomicInlineWidth = 32;
4852 }
4853 else {
4854 MaxAtomicPromoteWidth = 64;
4855 if (ShouldUseInlineAtomic)
4856 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004857 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004858 }
4859
4860 bool isThumb() const {
4861 return (ArchISA == llvm::ARM::IK_THUMB);
4862 }
4863
4864 bool supportsThumb() const {
4865 return CPUAttr.count('T') || ArchVersion >= 6;
4866 }
4867
4868 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004869 return CPUAttr.equals("6T2") ||
4870 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004871 }
4872
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004873 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004874 // For most sub-arches, the build attribute CPU name is enough.
4875 // For Cortex variants, it's slightly different.
4876 switch(ArchKind) {
4877 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004878 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004879 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004880 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004881 case llvm::ARM::AK_ARMV7S:
4882 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004883 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004884 return "7A";
4885 case llvm::ARM::AK_ARMV7R:
4886 return "7R";
4887 case llvm::ARM::AK_ARMV7M:
4888 return "7M";
4889 case llvm::ARM::AK_ARMV7EM:
4890 return "7EM";
4891 case llvm::ARM::AK_ARMV8A:
4892 return "8A";
4893 case llvm::ARM::AK_ARMV8_1A:
4894 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004895 case llvm::ARM::AK_ARMV8_2A:
4896 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004897 case llvm::ARM::AK_ARMV8MBaseline:
4898 return "8M_BASE";
4899 case llvm::ARM::AK_ARMV8MMainline:
4900 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004901 }
4902 }
4903
4904 StringRef getCPUProfile() const {
4905 switch(ArchProfile) {
4906 case llvm::ARM::PK_A:
4907 return "A";
4908 case llvm::ARM::PK_R:
4909 return "R";
4910 case llvm::ARM::PK_M:
4911 return "M";
4912 default:
4913 return "";
4914 }
4915 }
4916
Chris Lattner17df24e2008-04-21 18:56:49 +00004917public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004918 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004919 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4920 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004921
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004922 switch (getTriple().getOS()) {
4923 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004924 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004925 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004926 break;
4927 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004928 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004929 break;
4930 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004931
Renato Goline84b0002015-10-08 16:43:26 +00004932 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004933 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004934
Chris Lattner1a8f3942010-04-23 16:29:58 +00004935 // {} in inline assembly are neon specifiers, not assembly variant
4936 // specifiers.
4937 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004938
Eric Christopher0e261882014-12-05 01:06:59 +00004939 // FIXME: This duplicates code from the driver that sets the -target-abi
4940 // option - this code is used if -target-abi isn't passed and should
4941 // be unified in some way.
4942 if (Triple.isOSBinFormatMachO()) {
4943 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4944 // the frontend matches that.
4945 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4946 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004947 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004948 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004949 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004950 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004951 } else {
4952 setABI("apcs-gnu");
4953 }
4954 } else if (Triple.isOSWindows()) {
4955 // FIXME: this is invalid for WindowsCE
4956 setABI("aapcs");
4957 } else {
4958 // Select the default based on the platform.
4959 switch (Triple.getEnvironment()) {
4960 case llvm::Triple::Android:
4961 case llvm::Triple::GNUEABI:
4962 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004963 case llvm::Triple::MuslEABI:
4964 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004965 setABI("aapcs-linux");
4966 break;
4967 case llvm::Triple::EABIHF:
4968 case llvm::Triple::EABI:
4969 setABI("aapcs");
4970 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004971 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004972 setABI("apcs-gnu");
4973 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004974 default:
4975 if (Triple.getOS() == llvm::Triple::NetBSD)
4976 setABI("apcs-gnu");
4977 else
4978 setABI("aapcs");
4979 break;
4980 }
4981 }
John McCall86353412010-08-21 22:46:04 +00004982
4983 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004984 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004985
Renato Golin15b86152015-07-03 16:41:13 +00004986 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004987 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004988
James Molloya7139222012-03-12 09:14:10 +00004989 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004990 // the alignment of the zero-length bitfield is greater than the member
4991 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004992 // zero length bitfield.
4993 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004994
4995 if (Triple.getOS() == llvm::Triple::Linux ||
4996 Triple.getOS() == llvm::Triple::UnknownOS)
4997 this->MCountName =
4998 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004999 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005000
Alp Toker4925ba72014-06-07 23:30:42 +00005001 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005002
Craig Topper3164f332014-03-11 03:39:26 +00005003 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005004 ABI = Name;
5005
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005006 // The defaults (above) are for AAPCS, check if we need to change them.
5007 //
5008 // FIXME: We need support for -meabi... we could just mangle it into the
5009 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005010 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005011 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005012 return true;
5013 }
5014 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5015 setABIAAPCS();
5016 return true;
5017 }
5018 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005019 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005020
Renato Golinf5c4dec2015-05-27 13:33:00 +00005021 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005022 bool
5023 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5024 StringRef CPU,
5025 const std::vector<std::string> &FeaturesVec) const override {
5026
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005027 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005028 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005029
5030 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005031 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005032 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5033
5034 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005035 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005036 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5037
5038 for (const char *Feature : TargetFeatures)
5039 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00005040 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005041
Eric Christopher007b0a02015-08-28 22:32:01 +00005042 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005043 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005044
Craig Topper3164f332014-03-11 03:39:26 +00005045 bool handleTargetFeatures(std::vector<std::string> &Features,
5046 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005047 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005048 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005049 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005050 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005051 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005052 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005053 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005054
Ranjeet Singhac08e532015-06-24 23:39:25 +00005055 // This does not diagnose illegal cases like having both
5056 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5057 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005058 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005059 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005060 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005061 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005062 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005063 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005064 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005065 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005066 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005067 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005068 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005069 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005070 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005071 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005072 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005073 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005074 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005075 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005076 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005077 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005078 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005079 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005080 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005081 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005082 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005083 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005084 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005085 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005086 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005087 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005088 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005089 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005090 } else if (Feature == "+strict-align") {
5091 Unaligned = 0;
5092 } else if (Feature == "+fp16") {
5093 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005094 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005095 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005096 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005097
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005098 switch (ArchVersion) {
5099 case 6:
5100 if (ArchProfile == llvm::ARM::PK_M)
5101 LDREX = 0;
5102 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5103 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5104 else
5105 LDREX = LDREX_W;
5106 break;
5107 case 7:
5108 if (ArchProfile == llvm::ARM::PK_M)
5109 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5110 else
5111 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5112 break;
5113 case 8:
5114 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5115 }
5116
Rafael Espindolaeb265472013-08-21 21:59:03 +00005117 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5118 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5119 return false;
5120 }
5121
5122 if (FPMath == FP_Neon)
5123 Features.push_back("+neonfp");
5124 else if (FPMath == FP_VFP)
5125 Features.push_back("-neonfp");
5126
Daniel Dunbar893d4752009-12-19 04:15:38 +00005127 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005128 auto Feature =
5129 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5130 if (Feature != Features.end())
5131 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005132
Rafael Espindolaeb265472013-08-21 21:59:03 +00005133 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005134 }
5135
Craig Topper3164f332014-03-11 03:39:26 +00005136 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005137 return llvm::StringSwitch<bool>(Feature)
5138 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005139 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005140 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005141 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005142 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005143 .Case("hwdiv", HWDiv & HWDivThumb)
5144 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005145 .Default(false);
5146 }
Renato Golin15b86152015-07-03 16:41:13 +00005147
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005148 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005149 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005150 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005151
Renato Golin15b86152015-07-03 16:41:13 +00005152 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005153 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005154 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005155 CPU = Name;
5156 return true;
5157 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005158
Craig Topper3164f332014-03-11 03:39:26 +00005159 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005160
Craig Topper3164f332014-03-11 03:39:26 +00005161 void getTargetDefines(const LangOptions &Opts,
5162 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005163 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005164 Builder.defineMacro("__arm");
5165 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005166 // For bare-metal none-eabi.
5167 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5168 getTriple().getEnvironment() == llvm::Triple::EABI)
5169 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005170
Chris Lattnerecd49032009-03-02 22:27:17 +00005171 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005172 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005173
5174 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5175 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005176 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005177 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5178
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005179 if (!CPUAttr.empty())
5180 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005181
5182 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005183 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005184 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005185
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005186 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005187 // ACLE 6.5.7 Crypto Extension
5188 if (Crypto)
5189 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5190 // ACLE 6.5.8 CRC32 Extension
5191 if (CRC)
5192 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5193 // ACLE 6.5.10 Numeric Maximum and Minimum
5194 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5195 // ACLE 6.5.9 Directed Rounding
5196 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005197 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005198
5199 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5200 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005201 // NOTE that the default profile is assumed to be 'A'
5202 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005203 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5204
Bradley Smithf4affc12016-03-03 13:52:22 +00005205 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5206 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5207 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5208 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005209 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005210 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005211 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005212 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5213
5214 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5215 // instruction set such as ARM or Thumb.
5216 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5217
5218 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5219
5220 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005221 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005222 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005223
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005224 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005225 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005226 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005227
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005228 // ACLE 6.4.4 LDREX/STREX
5229 if (LDREX)
5230 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5231
5232 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005233 if (ArchVersion == 5 ||
5234 (ArchVersion == 6 && CPUProfile != "M") ||
5235 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005236 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5237
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005238 // ACLE 6.5.1 Hardware Floating Point
5239 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005240 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005241
Yi Konga44c4d72014-06-27 21:25:42 +00005242 // ACLE predefines.
5243 Builder.defineMacro("__ARM_ACLE", "200");
5244
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005245 // FP16 support (we currently only support IEEE format).
5246 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5247 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5248
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005249 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005250 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005251 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5252
Mike Stump9d54bd72009-04-08 02:07:04 +00005253 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005254
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005255 // FIXME: It's more complicated than this and we don't really support
5256 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005257 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005258 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005259 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005260
David Tweed8f676532012-10-25 13:33:01 +00005261 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005262 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005263 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005264 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005265 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005266 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005267 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005268
Tim Northover28fc0e12016-04-28 13:59:55 +00005269 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5270 ABI == "aapcs16")
5271 Builder.defineMacro("__ARM_PCS_VFP", "1");
5272
Daniel Dunbar893d4752009-12-19 04:15:38 +00005273 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005274 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005275
Zijiao Ma56a83722016-08-17 02:13:33 +00005276 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005277 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005278
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005279 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005280 Builder.defineMacro("__THUMBEL__");
5281 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005282 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005283 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005284 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005285
5286 // ACLE 6.4.9 32-bit SIMD instructions
5287 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5288 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5289
5290 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005291 if (((HWDiv & HWDivThumb) && isThumb()) ||
5292 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005293 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005294 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005295 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005296
5297 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005298 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005299
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005300 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005301 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005302 if (FPU & VFP2FPU)
5303 Builder.defineMacro("__ARM_VFPV2__");
5304 if (FPU & VFP3FPU)
5305 Builder.defineMacro("__ARM_VFPV3__");
5306 if (FPU & VFP4FPU)
5307 Builder.defineMacro("__ARM_VFPV4__");
5308 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005309
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005310 // This only gets set when Neon instructions are actually available, unlike
5311 // the VFP define, hence the soft float and arch check. This is subtly
5312 // different from gcc, we follow the intent which was that it should be set
5313 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005314 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005315 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005316 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005317 // current AArch32 NEON implementations do not support double-precision
5318 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005319 Builder.defineMacro("__ARM_NEON_FP",
5320 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005321 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005322
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005323 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5324 Opts.ShortWChar ? "2" : "4");
5325
5326 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5327 Opts.ShortEnums ? "1" : "4");
5328
Bradley Smithf4affc12016-03-03 13:52:22 +00005329 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005330 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5333 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5334 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005335
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005336 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005337 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005338 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005339 }
5340
5341 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005342 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005343 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5344 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005345 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005346 }
5347
5348 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005349 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005350 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005351
5352 if (Opts.UnsafeFPMath)
5353 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005354
5355 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5356 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005357 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005358
Craig Topper6c03a542015-10-19 04:51:35 +00005359 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5360 return llvm::makeArrayRef(BuiltinInfo,
5361 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005362 }
Craig Topper3164f332014-03-11 03:39:26 +00005363 bool isCLZForZeroUndef() const override { return false; }
5364 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005365 return IsAAPCS
5366 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005367 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5368 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005369 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005370 ArrayRef<const char *> getGCCRegNames() const override;
5371 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005372 bool validateAsmConstraint(const char *&Name,
5373 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005374 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005375 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005376 case 'l': // r0-r7
5377 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005378 case 't': // VFP Floating point register single precision
5379 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005380 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005381 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005382 case 'I':
5383 case 'J':
5384 case 'K':
5385 case 'L':
5386 case 'M':
5387 // FIXME
5388 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005389 case 'Q': // A memory address that is a single base register.
5390 Info.setAllowsMemory();
5391 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005392 case 'U': // a memory reference...
5393 switch (Name[1]) {
5394 case 'q': // ...ARMV4 ldrsb
5395 case 'v': // ...VFP load/store (reg+constant offset)
5396 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005397 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005398 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005399 case 'n': // valid address for Neon doubleword vector load/store
5400 case 'm': // valid address for Neon element and structure load/store
5401 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005402 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005403 Info.setAllowsMemory();
5404 Name++;
5405 return true;
5406 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005407 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005408 return false;
5409 }
Craig Topper3164f332014-03-11 03:39:26 +00005410 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005411 std::string R;
5412 switch (*Constraint) {
5413 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005414 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005415 Constraint++;
5416 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005417 case 'p': // 'p' should be translated to 'r' by default.
5418 R = std::string("r");
5419 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005420 default:
5421 return std::string(1, *Constraint);
5422 }
5423 return R;
5424 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005425 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005426 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005427 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005428 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005429 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005430
Bill Wendling9d1ee112012-10-25 23:28:48 +00005431 // Strip off constraint modifiers.
5432 while (Constraint[0] == '=' ||
5433 Constraint[0] == '+' ||
5434 Constraint[0] == '&')
5435 Constraint = Constraint.substr(1);
5436
5437 switch (Constraint[0]) {
5438 default: break;
5439 case 'r': {
5440 switch (Modifier) {
5441 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005442 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005443 case 'q':
5444 // A register of size 32 cannot fit a vector type.
5445 return false;
5446 }
5447 }
5448 }
5449
5450 return true;
5451 }
Craig Topper3164f332014-03-11 03:39:26 +00005452 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005453 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005454 return "";
5455 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005456
Craig Topper3164f332014-03-11 03:39:26 +00005457 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005458 switch (CC) {
5459 case CC_AAPCS:
5460 case CC_AAPCS_VFP:
5461 case CC_Swift:
5462 return CCCR_OK;
5463 default:
5464 return CCCR_Warning;
5465 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005466 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005467
Craig Topper3164f332014-03-11 03:39:26 +00005468 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005469 if (RegNo == 0) return 0;
5470 if (RegNo == 1) return 1;
5471 return -1;
5472 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005473
5474 bool hasSjLjLowering() const override {
5475 return true;
5476 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005477};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005478
Rafael Espindolaeb265472013-08-21 21:59:03 +00005479bool ARMTargetInfo::setFPMath(StringRef Name) {
5480 if (Name == "neon") {
5481 FPMath = FP_Neon;
5482 return true;
5483 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5484 Name == "vfp4") {
5485 FPMath = FP_VFP;
5486 return true;
5487 }
5488 return false;
5489}
5490
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005491const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005492 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005493 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005494 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5495
5496 // Float registers
5497 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5498 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5499 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005500 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005501
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005502 // Double registers
5503 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5504 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005505 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5506 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005507
5508 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005509 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5510 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005511};
5512
Craig Topperf054e3a2015-10-19 03:52:27 +00005513ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5514 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005515}
5516
5517const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005518 { { "a1" }, "r0" },
5519 { { "a2" }, "r1" },
5520 { { "a3" }, "r2" },
5521 { { "a4" }, "r3" },
5522 { { "v1" }, "r4" },
5523 { { "v2" }, "r5" },
5524 { { "v3" }, "r6" },
5525 { { "v4" }, "r7" },
5526 { { "v5" }, "r8" },
5527 { { "v6", "rfp" }, "r9" },
5528 { { "sl" }, "r10" },
5529 { { "fp" }, "r11" },
5530 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005531 { { "r13" }, "sp" },
5532 { { "r14" }, "lr" },
5533 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005534 // The S, D and Q registers overlap, but aren't really aliases; we
5535 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005536};
5537
Craig Topperf054e3a2015-10-19 03:52:27 +00005538ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5539 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005540}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005541
5542const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005543#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005544 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005545#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5546 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005547#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005548
Craig Topper07d3b622015-08-07 05:14:44 +00005549#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005550 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005551#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005552 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005553#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5554 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005555#include "clang/Basic/BuiltinsARM.def"
5556};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005557
5558class ARMleTargetInfo : public ARMTargetInfo {
5559public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005560 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005561 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005562 void getTargetDefines(const LangOptions &Opts,
5563 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005564 Builder.defineMacro("__ARMEL__");
5565 ARMTargetInfo::getTargetDefines(Opts, Builder);
5566 }
5567};
5568
5569class ARMbeTargetInfo : public ARMTargetInfo {
5570public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005571 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005572 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005573 void getTargetDefines(const LangOptions &Opts,
5574 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005575 Builder.defineMacro("__ARMEB__");
5576 Builder.defineMacro("__ARM_BIG_ENDIAN");
5577 ARMTargetInfo::getTargetDefines(Opts, Builder);
5578 }
5579};
Chris Lattner17df24e2008-04-21 18:56:49 +00005580
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005581class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5582 const llvm::Triple Triple;
5583public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005584 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5585 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005586 WCharType = UnsignedShort;
5587 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005588 }
5589 void getVisualStudioDefines(const LangOptions &Opts,
5590 MacroBuilder &Builder) const {
5591 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5592
5593 // FIXME: this is invalid for WindowsCE
5594 Builder.defineMacro("_M_ARM_NT", "1");
5595 Builder.defineMacro("_M_ARMT", "_M_ARM");
5596 Builder.defineMacro("_M_THUMB", "_M_ARM");
5597
5598 assert((Triple.getArch() == llvm::Triple::arm ||
5599 Triple.getArch() == llvm::Triple::thumb) &&
5600 "invalid architecture for Windows ARM target info");
5601 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5602 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5603
5604 // TODO map the complete set of values
5605 // 31: VFPv3 40: VFPv4
5606 Builder.defineMacro("_M_ARM_FP", "31");
5607 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005608 BuiltinVaListKind getBuiltinVaListKind() const override {
5609 return TargetInfo::CharPtrBuiltinVaList;
5610 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005611 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5612 switch (CC) {
5613 case CC_X86StdCall:
5614 case CC_X86ThisCall:
5615 case CC_X86FastCall:
5616 case CC_X86VectorCall:
5617 return CCCR_Ignore;
5618 case CC_C:
5619 return CCCR_OK;
5620 default:
5621 return CCCR_Warning;
5622 }
5623 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005624};
5625
5626// Windows ARM + Itanium C++ ABI Target
5627class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5628public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005629 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5630 const TargetOptions &Opts)
5631 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005632 TheCXXABI.set(TargetCXXABI::GenericARM);
5633 }
5634
5635 void getTargetDefines(const LangOptions &Opts,
5636 MacroBuilder &Builder) const override {
5637 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5638
5639 if (Opts.MSVCCompat)
5640 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5641 }
5642};
5643
5644// Windows ARM, MS (C++) ABI
5645class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5646public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005647 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5648 const TargetOptions &Opts)
5649 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005650 TheCXXABI.set(TargetCXXABI::Microsoft);
5651 }
5652
5653 void getTargetDefines(const LangOptions &Opts,
5654 MacroBuilder &Builder) const override {
5655 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5656 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5657 }
5658};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005659
Yaron Keren321249c2015-07-15 13:32:23 +00005660// ARM MinGW target
5661class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5662public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005663 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5664 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005665 TheCXXABI.set(TargetCXXABI::GenericARM);
5666 }
5667
5668 void getTargetDefines(const LangOptions &Opts,
5669 MacroBuilder &Builder) const override {
5670 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5671 DefineStd(Builder, "WIN32", Opts);
5672 DefineStd(Builder, "WINNT", Opts);
5673 Builder.defineMacro("_ARM_");
5674 addMinGWDefines(Opts, Builder);
5675 }
5676};
5677
5678// ARM Cygwin target
5679class CygwinARMTargetInfo : public ARMleTargetInfo {
5680public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005681 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5682 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005683 TLSSupported = false;
5684 WCharType = UnsignedShort;
5685 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005686 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005687 }
5688 void getTargetDefines(const LangOptions &Opts,
5689 MacroBuilder &Builder) const override {
5690 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5691 Builder.defineMacro("_ARM_");
5692 Builder.defineMacro("__CYGWIN__");
5693 Builder.defineMacro("__CYGWIN32__");
5694 DefineStd(Builder, "unix", Opts);
5695 if (Opts.CPlusPlus)
5696 Builder.defineMacro("_GNU_SOURCE");
5697 }
5698};
5699
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005700class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005701protected:
Craig Topper3164f332014-03-11 03:39:26 +00005702 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5703 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005704 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005705 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005706
Torok Edwinb2b37c62009-06-30 17:10:35 +00005707public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005708 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5709 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005710 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005711 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005712 // FIXME: This should be based off of the target features in
5713 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005714 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005715
Tim Northoverd88ecb32016-01-27 19:32:40 +00005716 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005717 // Darwin on iOS uses a variant of the ARM C++ ABI.
5718 TheCXXABI.set(TargetCXXABI::WatchOS);
5719
5720 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5721 // size_t is long, it's a bit weird for it to be int.
5722 PtrDiffType = SignedLong;
5723
5724 // BOOL should be a real boolean on the new ABI
5725 UseSignedCharForObjCBool = false;
5726 } else
5727 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005728 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005729};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005730
Tim Northover573cbee2014-05-24 12:52:07 +00005731class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005732 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005733 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5734 static const char *const GCCRegNames[];
5735
James Molloy75f5f9e2014-04-16 15:33:48 +00005736 enum FPUModeEnum {
5737 FPUMode,
5738 NeonMode
5739 };
5740
5741 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005742 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005743 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005744 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005745 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005746
Tim Northovera2ee4332014-03-29 15:09:45 +00005747 static const Builtin::Info BuiltinInfo[];
5748
5749 std::string ABI;
5750
5751public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005752 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005753 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005754 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5755 WCharType = SignedInt;
5756
5757 // NetBSD apparently prefers consistency across ARM targets to consistency
5758 // across 64-bit targets.
5759 Int64Type = SignedLongLong;
5760 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005761 } else {
5762 WCharType = UnsignedInt;
5763 Int64Type = SignedLong;
5764 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005765 }
5766
Tim Northovera2ee4332014-03-29 15:09:45 +00005767 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005768 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005769 MaxAtomicInlineWidth = 128;
5770 MaxAtomicPromoteWidth = 128;
5771
Tim Northovera6a19f12015-02-06 01:25:07 +00005772 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005773 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5774
Tim Northovera2ee4332014-03-29 15:09:45 +00005775 // {} in inline assembly are neon specifiers, not assembly variant
5776 // specifiers.
5777 NoAsmVariants = true;
5778
Tim Northover7ad87af2015-01-16 18:44:04 +00005779 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5780 // contributes to the alignment of the containing aggregate in the same way
5781 // a plain (non bit-field) member of that type would, without exception for
5782 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005783 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005784 UseZeroLengthBitfieldAlignment = true;
5785
Tim Northover573cbee2014-05-24 12:52:07 +00005786 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005787 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005788
5789 if (Triple.getOS() == llvm::Triple::Linux ||
5790 Triple.getOS() == llvm::Triple::UnknownOS)
5791 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005792 }
5793
Alp Toker4925ba72014-06-07 23:30:42 +00005794 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005795 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005796 if (Name != "aapcs" && Name != "darwinpcs")
5797 return false;
5798
5799 ABI = Name;
5800 return true;
5801 }
5802
David Blaikie1cbb9712014-11-14 19:09:44 +00005803 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005804 return Name == "generic" ||
5805 llvm::AArch64::parseCPUArch(Name) !=
5806 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005807 }
5808
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005809 void getTargetDefines(const LangOptions &Opts,
5810 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005811 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005812 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005813
5814 // Target properties.
5815 Builder.defineMacro("_LP64");
5816 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005817
5818 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5819 Builder.defineMacro("__ARM_ACLE", "200");
5820 Builder.defineMacro("__ARM_ARCH", "8");
5821 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5822
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005823 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005824 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005825 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005826
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005827 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5828 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5829 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5830 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005831 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005832 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5833 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005834
5835 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5836
5837 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005838 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005839
5840 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5841 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005842 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5843 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005844
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005845 if (Opts.UnsafeFPMath)
5846 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005847
5848 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5849
5850 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5851 Opts.ShortEnums ? "1" : "4");
5852
James Molloy75f5f9e2014-04-16 15:33:48 +00005853 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005854 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005855 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005856 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005857 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005858
Bradley Smith418c5932014-05-02 15:17:51 +00005859 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005860 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005861
James Molloy75f5f9e2014-04-16 15:33:48 +00005862 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005863 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5864
5865 if (Unaligned)
5866 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005867
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005868 if (V8_1A)
5869 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5870
Reid Klecknerd167d422015-05-06 15:31:46 +00005871 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5872 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5873 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5874 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5875 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005876 }
5877
Craig Topper6c03a542015-10-19 04:51:35 +00005878 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5879 return llvm::makeArrayRef(BuiltinInfo,
5880 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005881 }
5882
David Blaikie1cbb9712014-11-14 19:09:44 +00005883 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005884 return Feature == "aarch64" ||
5885 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005886 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005887 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005888 }
5889
James Molloy5e73df52014-04-16 15:06:20 +00005890 bool handleTargetFeatures(std::vector<std::string> &Features,
5891 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005892 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005893 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005894 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005895 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005896 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005897
Eric Christopher610fe112015-08-26 08:21:55 +00005898 for (const auto &Feature : Features) {
5899 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005900 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005901 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005902 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005903 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005904 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005905 if (Feature == "+strict-align")
5906 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005907 if (Feature == "+v8.1a")
5908 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005909 }
5910
James Y Knightb214cbc2016-03-04 19:00:41 +00005911 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005912
5913 return true;
5914 }
5915
John McCall477f2bb2016-03-03 06:39:32 +00005916 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5917 switch (CC) {
5918 case CC_C:
5919 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005920 case CC_PreserveMost:
5921 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005922 return CCCR_OK;
5923 default:
5924 return CCCR_Warning;
5925 }
5926 }
5927
David Blaikie1cbb9712014-11-14 19:09:44 +00005928 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005929
David Blaikie1cbb9712014-11-14 19:09:44 +00005930 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005931 return TargetInfo::AArch64ABIBuiltinVaList;
5932 }
5933
Craig Topperf054e3a2015-10-19 03:52:27 +00005934 ArrayRef<const char *> getGCCRegNames() const override;
5935 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005936
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005937 bool validateAsmConstraint(const char *&Name,
5938 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005939 switch (*Name) {
5940 default:
5941 return false;
5942 case 'w': // Floating point and SIMD registers (V0-V31)
5943 Info.setAllowsRegister();
5944 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005945 case 'I': // Constant that can be used with an ADD instruction
5946 case 'J': // Constant that can be used with a SUB instruction
5947 case 'K': // Constant that can be used with a 32-bit logical instruction
5948 case 'L': // Constant that can be used with a 64-bit logical instruction
5949 case 'M': // Constant that can be used as a 32-bit MOV immediate
5950 case 'N': // Constant that can be used as a 64-bit MOV immediate
5951 case 'Y': // Floating point constant zero
5952 case 'Z': // Integer constant zero
5953 return true;
5954 case 'Q': // A memory reference with base register and no offset
5955 Info.setAllowsMemory();
5956 return true;
5957 case 'S': // A symbolic address
5958 Info.setAllowsRegister();
5959 return true;
5960 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005961 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5962 // Utf: A memory address suitable for ldp/stp in TF mode.
5963 // Usa: An absolute symbolic address.
5964 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5965 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005966 case 'z': // Zero register, wzr or xzr
5967 Info.setAllowsRegister();
5968 return true;
5969 case 'x': // Floating point and SIMD registers (V0-V15)
5970 Info.setAllowsRegister();
5971 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005972 }
5973 return false;
5974 }
5975
Akira Hatanaka987f1862014-08-22 06:05:21 +00005976 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005977 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005978 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005979 // Strip off constraint modifiers.
5980 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5981 Constraint = Constraint.substr(1);
5982
5983 switch (Constraint[0]) {
5984 default:
5985 return true;
5986 case 'z':
5987 case 'r': {
5988 switch (Modifier) {
5989 case 'x':
5990 case 'w':
5991 // For now assume that the person knows what they're
5992 // doing with the modifier.
5993 return true;
5994 default:
5995 // By default an 'r' constraint will be in the 'x'
5996 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005997 if (Size == 64)
5998 return true;
5999
6000 SuggestedModifier = "w";
6001 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006002 }
6003 }
6004 }
6005 }
6006
David Blaikie1cbb9712014-11-14 19:09:44 +00006007 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006008
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006009 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006010 if (RegNo == 0)
6011 return 0;
6012 if (RegNo == 1)
6013 return 1;
6014 return -1;
6015 }
6016};
6017
Tim Northover573cbee2014-05-24 12:52:07 +00006018const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006019 // 32-bit Integer registers
6020 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6021 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6022 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6023
6024 // 64-bit Integer registers
6025 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6026 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6027 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6028
6029 // 32-bit floating point regsisters
6030 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6031 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6032 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6033
6034 // 64-bit floating point regsisters
6035 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6036 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6037 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6038
6039 // Vector registers
6040 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6041 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6042 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6043};
6044
Craig Topperf054e3a2015-10-19 03:52:27 +00006045ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6046 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006047}
6048
Tim Northover573cbee2014-05-24 12:52:07 +00006049const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006050 { { "w31" }, "wsp" },
6051 { { "x29" }, "fp" },
6052 { { "x30" }, "lr" },
6053 { { "x31" }, "sp" },
6054 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6055 // don't want to substitute one of these for a different-sized one.
6056};
6057
Craig Topperf054e3a2015-10-19 03:52:27 +00006058ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6059 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006060}
6061
Tim Northover573cbee2014-05-24 12:52:07 +00006062const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006063#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006064 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006065#include "clang/Basic/BuiltinsNEON.def"
6066
6067#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006068 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006069#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006070};
James Molloy5e73df52014-04-16 15:06:20 +00006071
Tim Northover573cbee2014-05-24 12:52:07 +00006072class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006073 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006074 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006075 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006076 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006077 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006078 }
6079
6080public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006081 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6082 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006083 }
James Molloy5e73df52014-04-16 15:06:20 +00006084 void getTargetDefines(const LangOptions &Opts,
6085 MacroBuilder &Builder) const override {
6086 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006087 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006088 }
6089};
6090
Tim Northover573cbee2014-05-24 12:52:07 +00006091class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006092 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006093 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006094 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006095 }
6096
6097public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006098 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6099 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006100 void getTargetDefines(const LangOptions &Opts,
6101 MacroBuilder &Builder) const override {
6102 Builder.defineMacro("__AARCH64EB__");
6103 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6104 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006105 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006106 }
6107};
Tim Northovera2ee4332014-03-29 15:09:45 +00006108
Tim Northover573cbee2014-05-24 12:52:07 +00006109class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006110protected:
6111 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6112 MacroBuilder &Builder) const override {
6113 Builder.defineMacro("__AARCH64_SIMD__");
6114 Builder.defineMacro("__ARM64_ARCH_8__");
6115 Builder.defineMacro("__ARM_NEON__");
6116 Builder.defineMacro("__LITTLE_ENDIAN__");
6117 Builder.defineMacro("__REGISTER_PREFIX__", "");
6118 Builder.defineMacro("__arm64", "1");
6119 Builder.defineMacro("__arm64__", "1");
6120
6121 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6122 }
6123
Tim Northovera2ee4332014-03-29 15:09:45 +00006124public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006125 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6126 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006127 Int64Type = SignedLongLong;
6128 WCharType = SignedInt;
6129 UseSignedCharForObjCBool = false;
6130
Tim Northovera6a19f12015-02-06 01:25:07 +00006131 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006132 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6133
6134 TheCXXABI.set(TargetCXXABI::iOS64);
6135 }
6136
David Blaikie1cbb9712014-11-14 19:09:44 +00006137 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006138 return TargetInfo::CharPtrBuiltinVaList;
6139 }
6140};
Tim Northovera2ee4332014-03-29 15:09:45 +00006141
Tony Linthicum76329bf2011-12-12 21:14:55 +00006142// Hexagon abstract base class
6143class HexagonTargetInfo : public TargetInfo {
6144 static const Builtin::Info BuiltinInfo[];
6145 static const char * const GCCRegNames[];
6146 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6147 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006148 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006149 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006150
Tony Linthicum76329bf2011-12-12 21:14:55 +00006151public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006152 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6153 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006154 // Specify the vector alignment explicitly. For v512x1, the calculated
6155 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6156 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006157 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006158 "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 +00006159 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006160 SizeType = UnsignedInt;
6161 PtrDiffType = SignedInt;
6162 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006163
6164 // {} in inline assembly are packet specifiers, not assembly variant
6165 // specifiers.
6166 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006167
6168 LargeArrayMinWidth = 64;
6169 LargeArrayAlign = 64;
6170 UseBitFieldTypeAlignment = true;
6171 ZeroLengthBitfieldBoundary = 32;
6172 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006173 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006174 }
6175
Craig Topper6c03a542015-10-19 04:51:35 +00006176 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6177 return llvm::makeArrayRef(BuiltinInfo,
6178 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006179 }
6180
Craig Topper3164f332014-03-11 03:39:26 +00006181 bool validateAsmConstraint(const char *&Name,
6182 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006183 switch (*Name) {
6184 case 'v':
6185 case 'q':
6186 if (HasHVX) {
6187 Info.setAllowsRegister();
6188 return true;
6189 }
6190 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006191 case 's':
6192 // Relocatable constant.
6193 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006194 }
6195 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006196 }
6197
Craig Topper3164f332014-03-11 03:39:26 +00006198 void getTargetDefines(const LangOptions &Opts,
6199 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006200
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006201 bool isCLZForZeroUndef() const override { return false; }
6202
Craig Topper3164f332014-03-11 03:39:26 +00006203 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006204 return llvm::StringSwitch<bool>(Feature)
6205 .Case("hexagon", true)
6206 .Case("hvx", HasHVX)
6207 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006208 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006209 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006210 }
Craig Topper3164f332014-03-11 03:39:26 +00006211
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006212 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6213 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6214 const override;
6215
6216 bool handleTargetFeatures(std::vector<std::string> &Features,
6217 DiagnosticsEngine &Diags) override;
6218
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006219 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6220 bool Enabled) const override;
6221
Craig Topper3164f332014-03-11 03:39:26 +00006222 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006223 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006224 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006225 ArrayRef<const char *> getGCCRegNames() const override;
6226 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006227 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006228 return "";
6229 }
Sebastian Pop86500282012-01-13 20:37:10 +00006230
6231 static const char *getHexagonCPUSuffix(StringRef Name) {
6232 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006233 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006234 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006235 .Case("hexagonv55", "55")
6236 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006237 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006238 }
6239
Craig Topper3164f332014-03-11 03:39:26 +00006240 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006241 if (!getHexagonCPUSuffix(Name))
6242 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006243 CPU = Name;
6244 return true;
6245 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006246
6247 int getEHDataRegisterNumber(unsigned RegNo) const override {
6248 return RegNo < 2 ? RegNo : -1;
6249 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006250};
6251
6252void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006253 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006254 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006255 Builder.defineMacro("__hexagon__", "1");
6256
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006257 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006258 Builder.defineMacro("__HEXAGON_V4__");
6259 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006260 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006261 Builder.defineMacro("__QDSP6_V4__");
6262 Builder.defineMacro("__QDSP6_ARCH__", "4");
6263 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006264 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006265 Builder.defineMacro("__HEXAGON_V5__");
6266 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6267 if(Opts.HexagonQdsp6Compat) {
6268 Builder.defineMacro("__QDSP6_V5__");
6269 Builder.defineMacro("__QDSP6_ARCH__", "5");
6270 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006271 } else if (CPU == "hexagonv55") {
6272 Builder.defineMacro("__HEXAGON_V55__");
6273 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6274 Builder.defineMacro("__QDSP6_V55__");
6275 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006276 } else if (CPU == "hexagonv60") {
6277 Builder.defineMacro("__HEXAGON_V60__");
6278 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6279 Builder.defineMacro("__QDSP6_V60__");
6280 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006281 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006282
6283 if (hasFeature("hvx")) {
6284 Builder.defineMacro("__HVX__");
6285 if (hasFeature("hvx-double"))
6286 Builder.defineMacro("__HVXDBL__");
6287 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006288}
6289
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006290bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6291 DiagnosticsEngine &Diags, StringRef CPU,
6292 const std::vector<std::string> &FeaturesVec) const {
6293 // Default for v60: -hvx, -hvx-double.
6294 Features["hvx"] = false;
6295 Features["hvx-double"] = false;
6296 Features["long-calls"] = false;
6297
6298 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6299}
6300
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006301bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6302 DiagnosticsEngine &Diags) {
6303 for (auto &F : Features) {
6304 if (F == "+hvx")
6305 HasHVX = true;
6306 else if (F == "-hvx")
6307 HasHVX = HasHVXDouble = false;
6308 else if (F == "+hvx-double")
6309 HasHVX = HasHVXDouble = true;
6310 else if (F == "-hvx-double")
6311 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006312
6313 if (F == "+long-calls")
6314 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006315 else if (F == "-long-calls")
6316 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006317 }
6318 return true;
6319}
6320
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006321void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6322 StringRef Name, bool Enabled) const {
6323 if (Enabled) {
6324 if (Name == "hvx-double")
6325 Features["hvx"] = true;
6326 } else {
6327 if (Name == "hvx")
6328 Features["hvx-double"] = false;
6329 }
6330 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006331}
6332
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006333const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006334 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6335 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6336 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6337 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6338 "p0", "p1", "p2", "p3",
6339 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6340};
6341
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006342ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006343 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006344}
6345
Tony Linthicum76329bf2011-12-12 21:14:55 +00006346const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6347 { { "sp" }, "r29" },
6348 { { "fp" }, "r30" },
6349 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006350};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006351
Craig Topperf054e3a2015-10-19 03:52:27 +00006352ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6353 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006354}
6355
6356
6357const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006358#define BUILTIN(ID, TYPE, ATTRS) \
6359 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6360#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6361 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006362#include "clang/Basic/BuiltinsHexagon.def"
6363};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006364
Jacques Pienaard964cc22016-03-28 21:02:54 +00006365class LanaiTargetInfo : public TargetInfo {
6366 // Class for Lanai (32-bit).
6367 // The CPU profiles supported by the Lanai backend
6368 enum CPUKind {
6369 CK_NONE,
6370 CK_V11,
6371 } CPU;
6372
6373 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6374 static const char *const GCCRegNames[];
6375
6376public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006377 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6378 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006379 // Description string has to be kept in sync with backend.
6380 resetDataLayout("E" // Big endian
6381 "-m:e" // ELF name manging
6382 "-p:32:32" // 32 bit pointers, 32 bit aligned
6383 "-i64:64" // 64 bit integers, 64 bit aligned
6384 "-a:0:32" // 32 bit alignment of objects of aggregate type
6385 "-n32" // 32 bit native integer width
6386 "-S64" // 64 bit natural stack alignment
6387 );
6388
6389 // Setting RegParmMax equal to what mregparm was set to in the old
6390 // toolchain
6391 RegParmMax = 4;
6392
6393 // Set the default CPU to V11
6394 CPU = CK_V11;
6395
6396 // Temporary approach to make everything at least word-aligned and allow for
6397 // safely casting between pointers with different alignment requirements.
6398 // TODO: Remove this when there are no more cast align warnings on the
6399 // firmware.
6400 MinGlobalAlign = 32;
6401 }
6402
6403 void getTargetDefines(const LangOptions &Opts,
6404 MacroBuilder &Builder) const override {
6405 // Define __lanai__ when building for target lanai.
6406 Builder.defineMacro("__lanai__");
6407
6408 // Set define for the CPU specified.
6409 switch (CPU) {
6410 case CK_V11:
6411 Builder.defineMacro("__LANAI_V11__");
6412 break;
6413 case CK_NONE:
6414 llvm_unreachable("Unhandled target CPU");
6415 }
6416 }
6417
6418 bool setCPU(const std::string &Name) override {
6419 CPU = llvm::StringSwitch<CPUKind>(Name)
6420 .Case("v11", CK_V11)
6421 .Default(CK_NONE);
6422
6423 return CPU != CK_NONE;
6424 }
6425
6426 bool hasFeature(StringRef Feature) const override {
6427 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6428 }
6429
6430 ArrayRef<const char *> getGCCRegNames() const override;
6431
6432 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6433
6434 BuiltinVaListKind getBuiltinVaListKind() const override {
6435 return TargetInfo::VoidPtrBuiltinVaList;
6436 }
6437
6438 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6439
6440 bool validateAsmConstraint(const char *&Name,
6441 TargetInfo::ConstraintInfo &info) const override {
6442 return false;
6443 }
6444
6445 const char *getClobbers() const override { return ""; }
6446};
6447
6448const char *const LanaiTargetInfo::GCCRegNames[] = {
6449 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6450 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6451 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6452
6453ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6454 return llvm::makeArrayRef(GCCRegNames);
6455}
6456
6457const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6458 {{"pc"}, "r2"},
6459 {{"sp"}, "r4"},
6460 {{"fp"}, "r5"},
6461 {{"rv"}, "r8"},
6462 {{"rr1"}, "r10"},
6463 {{"rr2"}, "r11"},
6464 {{"rca"}, "r15"},
6465};
6466
6467ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6468 return llvm::makeArrayRef(GCCRegAliases);
6469}
6470
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006471// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6472class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006473 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6474 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006475 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006477 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006478 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006479
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006480 int getEHDataRegisterNumber(unsigned RegNo) const override {
6481 if (RegNo == 0) return 24;
6482 if (RegNo == 1) return 25;
6483 return -1;
6484 }
6485
Craig Topper3164f332014-03-11 03:39:26 +00006486 bool handleTargetFeatures(std::vector<std::string> &Features,
6487 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006488 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006489 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6490 if (Feature != Features.end()) {
6491 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006492 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006493 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006494 }
Craig Topper3164f332014-03-11 03:39:26 +00006495 void getTargetDefines(const LangOptions &Opts,
6496 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006497 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006498 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006499
6500 if (SoftFloat)
6501 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006502 }
Craig Topper3164f332014-03-11 03:39:26 +00006503
6504 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006505 return llvm::StringSwitch<bool>(Feature)
6506 .Case("softfloat", SoftFloat)
6507 .Case("sparc", true)
6508 .Default(false);
6509 }
Craig Topper3164f332014-03-11 03:39:26 +00006510
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006511 bool hasSjLjLowering() const override {
6512 return true;
6513 }
6514
Craig Topper6c03a542015-10-19 04:51:35 +00006515 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006516 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006517 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006518 }
Craig Topper3164f332014-03-11 03:39:26 +00006519 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006520 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006521 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006522 ArrayRef<const char *> getGCCRegNames() const override;
6523 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006524 bool validateAsmConstraint(const char *&Name,
6525 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006526 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006527 switch (*Name) {
6528 case 'I': // Signed 13-bit constant
6529 case 'J': // Zero
6530 case 'K': // 32-bit constant with the low 12 bits clear
6531 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6532 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6533 case 'N': // Same as 'K' but zext (required for SIMode)
6534 case 'O': // The constant 4096
6535 return true;
6536 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006537 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006538 }
Craig Topper3164f332014-03-11 03:39:26 +00006539 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006540 // FIXME: Implement!
6541 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006542 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006543
6544 // No Sparc V7 for now, the backend doesn't support it anyway.
6545 enum CPUKind {
6546 CK_GENERIC,
6547 CK_V8,
6548 CK_SUPERSPARC,
6549 CK_SPARCLITE,
6550 CK_F934,
6551 CK_HYPERSPARC,
6552 CK_SPARCLITE86X,
6553 CK_SPARCLET,
6554 CK_TSC701,
6555 CK_V9,
6556 CK_ULTRASPARC,
6557 CK_ULTRASPARC3,
6558 CK_NIAGARA,
6559 CK_NIAGARA2,
6560 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006561 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006562 CK_MYRIAD2100,
6563 CK_MYRIAD2150,
6564 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006565 CK_LEON2,
6566 CK_LEON2_AT697E,
6567 CK_LEON2_AT697F,
6568 CK_LEON3,
6569 CK_LEON3_UT699,
6570 CK_LEON3_GR712RC,
6571 CK_LEON4,
6572 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006573 } CPU = CK_GENERIC;
6574
6575 enum CPUGeneration {
6576 CG_V8,
6577 CG_V9,
6578 };
6579
6580 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6581 switch (Kind) {
6582 case CK_GENERIC:
6583 case CK_V8:
6584 case CK_SUPERSPARC:
6585 case CK_SPARCLITE:
6586 case CK_F934:
6587 case CK_HYPERSPARC:
6588 case CK_SPARCLITE86X:
6589 case CK_SPARCLET:
6590 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006591 case CK_MYRIAD2100:
6592 case CK_MYRIAD2150:
6593 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006594 case CK_LEON2:
6595 case CK_LEON2_AT697E:
6596 case CK_LEON2_AT697F:
6597 case CK_LEON3:
6598 case CK_LEON3_UT699:
6599 case CK_LEON3_GR712RC:
6600 case CK_LEON4:
6601 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006602 return CG_V8;
6603 case CK_V9:
6604 case CK_ULTRASPARC:
6605 case CK_ULTRASPARC3:
6606 case CK_NIAGARA:
6607 case CK_NIAGARA2:
6608 case CK_NIAGARA3:
6609 case CK_NIAGARA4:
6610 return CG_V9;
6611 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006612 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006613 }
6614
6615 CPUKind getCPUKind(StringRef Name) const {
6616 return llvm::StringSwitch<CPUKind>(Name)
6617 .Case("v8", CK_V8)
6618 .Case("supersparc", CK_SUPERSPARC)
6619 .Case("sparclite", CK_SPARCLITE)
6620 .Case("f934", CK_F934)
6621 .Case("hypersparc", CK_HYPERSPARC)
6622 .Case("sparclite86x", CK_SPARCLITE86X)
6623 .Case("sparclet", CK_SPARCLET)
6624 .Case("tsc701", CK_TSC701)
6625 .Case("v9", CK_V9)
6626 .Case("ultrasparc", CK_ULTRASPARC)
6627 .Case("ultrasparc3", CK_ULTRASPARC3)
6628 .Case("niagara", CK_NIAGARA)
6629 .Case("niagara2", CK_NIAGARA2)
6630 .Case("niagara3", CK_NIAGARA3)
6631 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006632 .Case("ma2100", CK_MYRIAD2100)
6633 .Case("ma2150", CK_MYRIAD2150)
6634 .Case("ma2450", CK_MYRIAD2450)
6635 // FIXME: the myriad2[.n] spellings are obsolete,
6636 // but a grace period is needed to allow updating dependent builds.
6637 .Case("myriad2", CK_MYRIAD2100)
6638 .Case("myriad2.1", CK_MYRIAD2100)
6639 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006640 .Case("leon2", CK_LEON2)
6641 .Case("at697e", CK_LEON2_AT697E)
6642 .Case("at697f", CK_LEON2_AT697F)
6643 .Case("leon3", CK_LEON3)
6644 .Case("ut699", CK_LEON3_UT699)
6645 .Case("gr712rc", CK_LEON3_GR712RC)
6646 .Case("leon4", CK_LEON4)
6647 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006648 .Default(CK_GENERIC);
6649 }
6650
6651 bool setCPU(const std::string &Name) override {
6652 CPU = getCPUKind(Name);
6653 return CPU != CK_GENERIC;
6654 }
Gabor Greif49991682008-02-21 16:29:08 +00006655};
6656
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006657const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006658 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6659 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6660 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6661 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6662};
6663
Craig Topperf054e3a2015-10-19 03:52:27 +00006664ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6665 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006666}
6667
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006668const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006669 { { "g0" }, "r0" },
6670 { { "g1" }, "r1" },
6671 { { "g2" }, "r2" },
6672 { { "g3" }, "r3" },
6673 { { "g4" }, "r4" },
6674 { { "g5" }, "r5" },
6675 { { "g6" }, "r6" },
6676 { { "g7" }, "r7" },
6677 { { "o0" }, "r8" },
6678 { { "o1" }, "r9" },
6679 { { "o2" }, "r10" },
6680 { { "o3" }, "r11" },
6681 { { "o4" }, "r12" },
6682 { { "o5" }, "r13" },
6683 { { "o6", "sp" }, "r14" },
6684 { { "o7" }, "r15" },
6685 { { "l0" }, "r16" },
6686 { { "l1" }, "r17" },
6687 { { "l2" }, "r18" },
6688 { { "l3" }, "r19" },
6689 { { "l4" }, "r20" },
6690 { { "l5" }, "r21" },
6691 { { "l6" }, "r22" },
6692 { { "l7" }, "r23" },
6693 { { "i0" }, "r24" },
6694 { { "i1" }, "r25" },
6695 { { "i2" }, "r26" },
6696 { { "i3" }, "r27" },
6697 { { "i4" }, "r28" },
6698 { { "i5" }, "r29" },
6699 { { "i6", "fp" }, "r30" },
6700 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006701};
6702
Craig Topperf054e3a2015-10-19 03:52:27 +00006703ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6704 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006705}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006706
6707// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6708class SparcV8TargetInfo : public SparcTargetInfo {
6709public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006710 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6711 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006712 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006713 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6714 switch (getTriple().getOS()) {
6715 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006716 SizeType = UnsignedInt;
6717 IntPtrType = SignedInt;
6718 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006719 break;
6720 case llvm::Triple::NetBSD:
6721 case llvm::Triple::OpenBSD:
6722 SizeType = UnsignedLong;
6723 IntPtrType = SignedLong;
6724 PtrDiffType = SignedLong;
6725 break;
Brad Smith56495d52015-08-13 22:00:53 +00006726 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006727 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006728 }
6729
Craig Topper3164f332014-03-11 03:39:26 +00006730 void getTargetDefines(const LangOptions &Opts,
6731 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006732 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006733 switch (getCPUGeneration(CPU)) {
6734 case CG_V8:
6735 Builder.defineMacro("__sparcv8");
6736 if (getTriple().getOS() != llvm::Triple::Solaris)
6737 Builder.defineMacro("__sparcv8__");
6738 break;
6739 case CG_V9:
6740 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006741 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006742 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006743 Builder.defineMacro("__sparc_v9__");
6744 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006745 break;
6746 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006747 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006748 std::string MyriadArchValue, Myriad2Value;
6749 Builder.defineMacro("__sparc_v8__");
6750 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006751 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006752 case CK_MYRIAD2150:
6753 MyriadArchValue = "__ma2150";
6754 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006755 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006756 case CK_MYRIAD2450:
6757 MyriadArchValue = "__ma2450";
6758 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006759 break;
6760 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006761 MyriadArchValue = "__ma2100";
6762 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006763 break;
6764 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006765 Builder.defineMacro(MyriadArchValue, "1");
6766 Builder.defineMacro(MyriadArchValue+"__", "1");
6767 Builder.defineMacro("__myriad2__", Myriad2Value);
6768 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006769 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006770 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006771
6772 bool hasSjLjLowering() const override {
6773 return true;
6774 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006775};
6776
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006777// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6778class SparcV8elTargetInfo : public SparcV8TargetInfo {
6779 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006780 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6781 : SparcV8TargetInfo(Triple, Opts) {
6782 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006783 }
6784};
6785
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006786// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6787class SparcV9TargetInfo : public SparcTargetInfo {
6788public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006789 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6790 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006791 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006792 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006793 // This is an LP64 platform.
6794 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006795
6796 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006797 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006798 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006799 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006800 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006801 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006802
6803 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6804 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6805 LongDoubleWidth = 128;
6806 LongDoubleAlign = 128;
6807 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006808 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006809 }
6810
Craig Topper3164f332014-03-11 03:39:26 +00006811 void getTargetDefines(const LangOptions &Opts,
6812 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006813 SparcTargetInfo::getTargetDefines(Opts, Builder);
6814 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006815 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006816 // Solaris doesn't need these variants, but the BSDs do.
6817 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006818 Builder.defineMacro("__sparc64__");
6819 Builder.defineMacro("__sparc_v9__");
6820 Builder.defineMacro("__sparcv9__");
6821 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006822 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006823
Craig Topper3164f332014-03-11 03:39:26 +00006824 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006825 if (!SparcTargetInfo::setCPU(Name))
6826 return false;
6827 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006828 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006829};
6830
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006831class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006832 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006833 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006834 std::string CPU;
6835 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006836 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006837
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006838public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006839 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006840 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6841 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006842 IntMaxType = SignedLong;
6843 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006844 TLSSupported = true;
6845 IntWidth = IntAlign = 32;
6846 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6847 PointerWidth = PointerAlign = 64;
6848 LongDoubleWidth = 128;
6849 LongDoubleAlign = 64;
6850 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006851 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006852 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006853 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 +00006854 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6855 }
6856 void getTargetDefines(const LangOptions &Opts,
6857 MacroBuilder &Builder) const override {
6858 Builder.defineMacro("__s390__");
6859 Builder.defineMacro("__s390x__");
6860 Builder.defineMacro("__zarch__");
6861 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006862
6863 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6864 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6865 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6866 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6867
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006868 if (HasTransactionalExecution)
6869 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006870 if (Opts.ZVector)
6871 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006872 }
Craig Topper6c03a542015-10-19 04:51:35 +00006873 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6874 return llvm::makeArrayRef(BuiltinInfo,
6875 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006876 }
6877
Craig Topperf054e3a2015-10-19 03:52:27 +00006878 ArrayRef<const char *> getGCCRegNames() const override;
6879 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006880 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006881 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006882 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006883 bool validateAsmConstraint(const char *&Name,
6884 TargetInfo::ConstraintInfo &info) const override;
6885 const char *getClobbers() const override {
6886 // FIXME: Is this really right?
6887 return "";
6888 }
6889 BuiltinVaListKind getBuiltinVaListKind() const override {
6890 return TargetInfo::SystemZBuiltinVaList;
6891 }
6892 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006893 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006894 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6895 .Case("z10", true)
6896 .Case("z196", true)
6897 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006898 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006899 .Default(false);
6900
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006901 return CPUKnown;
6902 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006903 bool
6904 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6905 StringRef CPU,
6906 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006907 if (CPU == "zEC12")
6908 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006909 if (CPU == "z13") {
6910 Features["transactional-execution"] = true;
6911 Features["vector"] = true;
6912 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006913 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006914 }
6915
6916 bool handleTargetFeatures(std::vector<std::string> &Features,
6917 DiagnosticsEngine &Diags) override {
6918 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006919 for (const auto &Feature : Features) {
6920 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006921 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006922 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006923 HasVector = true;
6924 }
6925 // If we use the vector ABI, vector types are 64-bit aligned.
6926 if (HasVector) {
6927 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006928 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6929 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006930 }
6931 return true;
6932 }
6933
6934 bool hasFeature(StringRef Feature) const override {
6935 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006936 .Case("systemz", true)
6937 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006938 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006939 .Default(false);
6940 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006941
Bryan Chane3f1ed52016-04-28 13:56:43 +00006942 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6943 switch (CC) {
6944 case CC_C:
6945 case CC_Swift:
6946 return CCCR_OK;
6947 default:
6948 return CCCR_Warning;
6949 }
6950 }
6951
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006952 StringRef getABI() const override {
6953 if (HasVector)
6954 return "vector";
6955 return "";
6956 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006957
6958 bool useFloat128ManglingForLongDouble() const override {
6959 return true;
6960 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006961};
6962
6963const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6964#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006965 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006966#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6967 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006968#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006969};
6970
6971const char *const SystemZTargetInfo::GCCRegNames[] = {
6972 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6973 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6974 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6975 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6976};
6977
Craig Topperf054e3a2015-10-19 03:52:27 +00006978ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6979 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006980}
6981
6982bool SystemZTargetInfo::
6983validateAsmConstraint(const char *&Name,
6984 TargetInfo::ConstraintInfo &Info) const {
6985 switch (*Name) {
6986 default:
6987 return false;
6988
6989 case 'a': // Address register
6990 case 'd': // Data register (equivalent to 'r')
6991 case 'f': // Floating-point register
6992 Info.setAllowsRegister();
6993 return true;
6994
6995 case 'I': // Unsigned 8-bit constant
6996 case 'J': // Unsigned 12-bit constant
6997 case 'K': // Signed 16-bit constant
6998 case 'L': // Signed 20-bit displacement (on all targets we support)
6999 case 'M': // 0x7fffffff
7000 return true;
7001
7002 case 'Q': // Memory with base and unsigned 12-bit displacement
7003 case 'R': // Likewise, plus an index
7004 case 'S': // Memory with base and signed 20-bit displacement
7005 case 'T': // Likewise, plus an index
7006 Info.setAllowsMemory();
7007 return true;
7008 }
7009}
Ulrich Weigand47445072013-05-06 16:26:41 +00007010
Eric Christopherc48497a2015-09-18 21:26:24 +00007011class MSP430TargetInfo : public TargetInfo {
7012 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007013
Eric Christopherc48497a2015-09-18 21:26:24 +00007014public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007015 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7016 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007017 TLSSupported = false;
7018 IntWidth = 16;
7019 IntAlign = 16;
7020 LongWidth = 32;
7021 LongLongWidth = 64;
7022 LongAlign = LongLongAlign = 16;
7023 PointerWidth = 16;
7024 PointerAlign = 16;
7025 SuitableAlign = 16;
7026 SizeType = UnsignedInt;
7027 IntMaxType = SignedLongLong;
7028 IntPtrType = SignedInt;
7029 PtrDiffType = SignedInt;
7030 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007031 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007032 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007033 void getTargetDefines(const LangOptions &Opts,
7034 MacroBuilder &Builder) const override {
7035 Builder.defineMacro("MSP430");
7036 Builder.defineMacro("__MSP430__");
7037 // FIXME: defines for different 'flavours' of MCU
7038 }
Craig Topper6c03a542015-10-19 04:51:35 +00007039 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007040 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007041 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007042 }
7043 bool hasFeature(StringRef Feature) const override {
7044 return Feature == "msp430";
7045 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007046 ArrayRef<const char *> getGCCRegNames() const override;
7047 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007048 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007049 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007050 }
7051 bool validateAsmConstraint(const char *&Name,
7052 TargetInfo::ConstraintInfo &info) const override {
7053 // FIXME: implement
7054 switch (*Name) {
7055 case 'K': // the constant 1
7056 case 'L': // constant -1^20 .. 1^19
7057 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007058 return true;
7059 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007060 // No target constraints for now.
7061 return false;
7062 }
7063 const char *getClobbers() const override {
7064 // FIXME: Is this really right?
7065 return "";
7066 }
7067 BuiltinVaListKind getBuiltinVaListKind() const override {
7068 // FIXME: implement
7069 return TargetInfo::CharPtrBuiltinVaList;
7070 }
7071};
7072
7073const char *const MSP430TargetInfo::GCCRegNames[] = {
7074 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7075 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7076
Craig Topperf054e3a2015-10-19 03:52:27 +00007077ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7078 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007079}
7080
7081// LLVM and Clang cannot be used directly to output native binaries for
7082// target, but is used to compile C code to llvm bitcode with correct
7083// type and alignment information.
7084//
7085// TCE uses the llvm bitcode as input and uses it for generating customized
7086// target processor and program binary. TCE co-design environment is
7087// publicly available in http://tce.cs.tut.fi
7088
7089static const unsigned TCEOpenCLAddrSpaceMap[] = {
7090 3, // opencl_global
7091 4, // opencl_local
7092 5, // opencl_constant
7093 // FIXME: generic has to be added to the target
7094 0, // opencl_generic
7095 0, // cuda_device
7096 0, // cuda_constant
7097 0 // cuda_shared
7098};
7099
7100class TCETargetInfo : public TargetInfo {
7101public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007102 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7103 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007104 TLSSupported = false;
7105 IntWidth = 32;
7106 LongWidth = LongLongWidth = 32;
7107 PointerWidth = 32;
7108 IntAlign = 32;
7109 LongAlign = LongLongAlign = 32;
7110 PointerAlign = 32;
7111 SuitableAlign = 32;
7112 SizeType = UnsignedInt;
7113 IntMaxType = SignedLong;
7114 IntPtrType = SignedInt;
7115 PtrDiffType = SignedInt;
7116 FloatWidth = 32;
7117 FloatAlign = 32;
7118 DoubleWidth = 32;
7119 DoubleAlign = 32;
7120 LongDoubleWidth = 32;
7121 LongDoubleAlign = 32;
7122 FloatFormat = &llvm::APFloat::IEEEsingle;
7123 DoubleFormat = &llvm::APFloat::IEEEsingle;
7124 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007125 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7126 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007127 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7128 UseAddrSpaceMapMangling = true;
7129 }
7130
7131 void getTargetDefines(const LangOptions &Opts,
7132 MacroBuilder &Builder) const override {
7133 DefineStd(Builder, "tce", Opts);
7134 Builder.defineMacro("__TCE__");
7135 Builder.defineMacro("__TCE_V1__");
7136 }
7137 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7138
Craig Topper6c03a542015-10-19 04:51:35 +00007139 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007140 const char *getClobbers() const override { return ""; }
7141 BuiltinVaListKind getBuiltinVaListKind() const override {
7142 return TargetInfo::VoidPtrBuiltinVaList;
7143 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007144 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007145 bool validateAsmConstraint(const char *&Name,
7146 TargetInfo::ConstraintInfo &info) const override {
7147 return true;
7148 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007149 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7150 return None;
7151 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007152};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007153
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007154class BPFTargetInfo : public TargetInfo {
7155public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007156 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7157 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007158 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7159 SizeType = UnsignedLong;
7160 PtrDiffType = SignedLong;
7161 IntPtrType = SignedLong;
7162 IntMaxType = SignedLong;
7163 Int64Type = SignedLong;
7164 RegParmMax = 5;
7165 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007166 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007167 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007168 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007169 }
7170 MaxAtomicPromoteWidth = 64;
7171 MaxAtomicInlineWidth = 64;
7172 TLSSupported = false;
7173 }
7174 void getTargetDefines(const LangOptions &Opts,
7175 MacroBuilder &Builder) const override {
7176 DefineStd(Builder, "bpf", Opts);
7177 Builder.defineMacro("__BPF__");
7178 }
7179 bool hasFeature(StringRef Feature) const override {
7180 return Feature == "bpf";
7181 }
7182
Craig Topper6c03a542015-10-19 04:51:35 +00007183 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007184 const char *getClobbers() const override {
7185 return "";
7186 }
7187 BuiltinVaListKind getBuiltinVaListKind() const override {
7188 return TargetInfo::VoidPtrBuiltinVaList;
7189 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007190 ArrayRef<const char *> getGCCRegNames() const override {
7191 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007192 }
7193 bool validateAsmConstraint(const char *&Name,
7194 TargetInfo::ConstraintInfo &info) const override {
7195 return true;
7196 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007197 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7198 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007199 }
7200};
7201
Daniel Sanders4672af62016-05-27 11:51:02 +00007202class MipsTargetInfo : public TargetInfo {
7203 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007204 StringRef Layout;
7205
7206 if (ABI == "o32")
7207 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7208 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007209 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007210 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007211 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007212 else
7213 llvm_unreachable("Invalid ABI");
7214
7215 if (BigEndian)
7216 resetDataLayout(("E-" + Layout).str());
7217 else
7218 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007219 }
7220
Akira Hatanaka9064e362013-10-29 18:30:33 +00007221
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007222 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007223 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007224 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007225 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007226 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007227 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007228 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007229 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007230 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007231 enum DspRevEnum {
7232 NoDSP, DSP1, DSP2
7233 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007234 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007235
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007236protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007237 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007238 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007239
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007240public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007241 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007242 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7243 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7244 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007245 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007246
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007247 setABI((getTriple().getArch() == llvm::Triple::mips ||
7248 getTriple().getArch() == llvm::Triple::mipsel)
7249 ? "o32"
7250 : "n64");
7251
7252 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007253 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007254
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007255 bool isNaN2008Default() const {
7256 return CPU == "mips32r6" || CPU == "mips64r6";
7257 }
7258
7259 bool isFP64Default() const {
7260 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7261 }
7262
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007263 bool isNan2008() const override {
7264 return IsNan2008;
7265 }
7266
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007267 bool processorSupportsGPR64() const {
7268 return llvm::StringSwitch<bool>(CPU)
7269 .Case("mips3", true)
7270 .Case("mips4", true)
7271 .Case("mips5", true)
7272 .Case("mips64", true)
7273 .Case("mips64r2", true)
7274 .Case("mips64r3", true)
7275 .Case("mips64r5", true)
7276 .Case("mips64r6", true)
7277 .Case("octeon", true)
7278 .Default(false);
7279 return false;
7280 }
7281
Alp Toker4925ba72014-06-07 23:30:42 +00007282 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007283 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007284 if (Name == "o32") {
7285 setO32ABITypes();
7286 ABI = Name;
7287 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007288 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007289
7290 if (Name == "n32") {
7291 setN32ABITypes();
7292 ABI = Name;
7293 return true;
7294 }
7295 if (Name == "n64") {
7296 setN64ABITypes();
7297 ABI = Name;
7298 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007299 }
7300 return false;
7301 }
7302
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007303 void setO32ABITypes() {
7304 Int64Type = SignedLongLong;
7305 IntMaxType = Int64Type;
7306 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7307 LongDoubleWidth = LongDoubleAlign = 64;
7308 LongWidth = LongAlign = 32;
7309 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7310 PointerWidth = PointerAlign = 32;
7311 PtrDiffType = SignedInt;
7312 SizeType = UnsignedInt;
7313 SuitableAlign = 64;
7314 }
7315
7316 void setN32N64ABITypes() {
7317 LongDoubleWidth = LongDoubleAlign = 128;
7318 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7319 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7320 LongDoubleWidth = LongDoubleAlign = 64;
7321 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7322 }
7323 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7324 SuitableAlign = 128;
7325 }
7326
Daniel Sanders4672af62016-05-27 11:51:02 +00007327 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007328 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007329 Int64Type = SignedLong;
7330 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007331 LongWidth = LongAlign = 64;
7332 PointerWidth = PointerAlign = 64;
7333 PtrDiffType = SignedLong;
7334 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007335 }
7336
7337 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007338 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007339 Int64Type = SignedLongLong;
7340 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007341 LongWidth = LongAlign = 32;
7342 PointerWidth = PointerAlign = 32;
7343 PtrDiffType = SignedInt;
7344 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007345 }
7346
Craig Topper3164f332014-03-11 03:39:26 +00007347 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007348 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007349 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007350 .Case("mips1", true)
7351 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007352 .Case("mips3", true)
7353 .Case("mips4", true)
7354 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007355 .Case("mips32", true)
7356 .Case("mips32r2", true)
7357 .Case("mips32r3", true)
7358 .Case("mips32r5", true)
7359 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007360 .Case("mips64", true)
7361 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007362 .Case("mips64r3", true)
7363 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007364 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007365 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007366 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007367 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007368 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007369 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007370 bool
7371 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7372 StringRef CPU,
7373 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007374 if (CPU.empty())
7375 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007376 if (CPU == "octeon")
7377 Features["mips64r2"] = Features["cnmips"] = true;
7378 else
7379 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007380 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007381 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007382
Craig Topper3164f332014-03-11 03:39:26 +00007383 void getTargetDefines(const LangOptions &Opts,
7384 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007385 if (BigEndian) {
7386 DefineStd(Builder, "MIPSEB", Opts);
7387 Builder.defineMacro("_MIPSEB");
7388 } else {
7389 DefineStd(Builder, "MIPSEL", Opts);
7390 Builder.defineMacro("_MIPSEL");
7391 }
7392
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007393 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007394 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007395 if (Opts.GNUMode)
7396 Builder.defineMacro("mips");
7397
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007398 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007399 Builder.defineMacro("__mips", "32");
7400 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7401 } else {
7402 Builder.defineMacro("__mips", "64");
7403 Builder.defineMacro("__mips64");
7404 Builder.defineMacro("__mips64__");
7405 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7406 }
7407
7408 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7409 .Cases("mips32", "mips64", "1")
7410 .Cases("mips32r2", "mips64r2", "2")
7411 .Cases("mips32r3", "mips64r3", "3")
7412 .Cases("mips32r5", "mips64r5", "5")
7413 .Cases("mips32r6", "mips64r6", "6")
7414 .Default("");
7415 if (!ISARev.empty())
7416 Builder.defineMacro("__mips_isa_rev", ISARev);
7417
7418 if (ABI == "o32") {
7419 Builder.defineMacro("__mips_o32");
7420 Builder.defineMacro("_ABIO32", "1");
7421 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007422 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007423 Builder.defineMacro("__mips_n32");
7424 Builder.defineMacro("_ABIN32", "2");
7425 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7426 } else if (ABI == "n64") {
7427 Builder.defineMacro("__mips_n64");
7428 Builder.defineMacro("_ABI64", "3");
7429 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7430 } else
7431 llvm_unreachable("Invalid ABI.");
7432
Simon Atanasyan683535b2012-08-29 19:14:58 +00007433 Builder.defineMacro("__REGISTER_PREFIX__", "");
7434
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007435 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007436 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007437 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007438 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007439 case SoftFloat:
7440 Builder.defineMacro("__mips_soft_float", Twine(1));
7441 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007442 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007443
Simon Atanasyan16071912013-04-14 14:07:30 +00007444 if (IsSingleFloat)
7445 Builder.defineMacro("__mips_single_float", Twine(1));
7446
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007447 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7448 Builder.defineMacro("_MIPS_FPSET",
7449 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7450
Simon Atanasyan72244b62012-07-05 16:06:06 +00007451 if (IsMips16)
7452 Builder.defineMacro("__mips16", Twine(1));
7453
Simon Atanasyan60777612013-04-14 14:07:51 +00007454 if (IsMicromips)
7455 Builder.defineMacro("__mips_micromips", Twine(1));
7456
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007457 if (IsNan2008)
7458 Builder.defineMacro("__mips_nan2008", Twine(1));
7459
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007460 switch (DspRev) {
7461 default:
7462 break;
7463 case DSP1:
7464 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7465 Builder.defineMacro("__mips_dsp", Twine(1));
7466 break;
7467 case DSP2:
7468 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7469 Builder.defineMacro("__mips_dspr2", Twine(1));
7470 Builder.defineMacro("__mips_dsp", Twine(1));
7471 break;
7472 }
7473
Jack Carter44ff1e52013-08-12 17:20:29 +00007474 if (HasMSA)
7475 Builder.defineMacro("__mips_msa", Twine(1));
7476
Simon Atanasyan26f19672012-04-05 19:28:31 +00007477 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7478 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7479 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007480
7481 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7482 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007483
7484 // These shouldn't be defined for MIPS-I but there's no need to check
7485 // for that since MIPS-I isn't supported.
7486 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7487 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7488 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007489
7490 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7491 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7492 // the instructions exist but using them violates the ABI since they
7493 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7494 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007495 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007496 }
7497
Craig Topper6c03a542015-10-19 04:51:35 +00007498 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7499 return llvm::makeArrayRef(BuiltinInfo,
7500 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007501 }
Craig Topper3164f332014-03-11 03:39:26 +00007502 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007503 return llvm::StringSwitch<bool>(Feature)
7504 .Case("mips", true)
7505 .Case("fp64", HasFP64)
7506 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007507 }
Craig Topper3164f332014-03-11 03:39:26 +00007508 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007509 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007510 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007511 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007512 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007513 // CPU register names
7514 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007515 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7516 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7517 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007518 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7519 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007520 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7521 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7522 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7523 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007524 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007525 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007526 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7527 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007528 // MSA register names
7529 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7530 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7531 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7532 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7533 // MSA control register names
7534 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7535 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007536 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007537 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007538 }
Craig Topper3164f332014-03-11 03:39:26 +00007539 bool validateAsmConstraint(const char *&Name,
7540 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007541 switch (*Name) {
7542 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007543 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007544 case 'r': // CPU registers.
7545 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007546 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007547 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007548 case 'c': // $25 for indirect jumps
7549 case 'l': // lo register
7550 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007551 Info.setAllowsRegister();
7552 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007553 case 'I': // Signed 16-bit constant
7554 case 'J': // Integer 0
7555 case 'K': // Unsigned 16-bit constant
7556 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7557 case 'M': // Constants not loadable via lui, addiu, or ori
7558 case 'N': // Constant -1 to -65535
7559 case 'O': // A signed 15-bit constant
7560 case 'P': // A constant between 1 go 65535
7561 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007562 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007563 Info.setAllowsMemory();
7564 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007565 case 'Z':
7566 if (Name[1] == 'C') { // An address usable by ll, and sc.
7567 Info.setAllowsMemory();
7568 Name++; // Skip over 'Z'.
7569 return true;
7570 }
7571 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007572 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007573 }
7574
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007575 std::string convertConstraint(const char *&Constraint) const override {
7576 std::string R;
7577 switch (*Constraint) {
7578 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7579 if (Constraint[1] == 'C') {
7580 R = std::string("^") + std::string(Constraint, 2);
7581 Constraint++;
7582 return R;
7583 }
7584 break;
7585 }
7586 return TargetInfo::convertConstraint(Constraint);
7587 }
7588
Craig Topper3164f332014-03-11 03:39:26 +00007589 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007590 // In GCC, $1 is not widely used in generated code (it's used only in a few
7591 // specific situations), so there is no real need for users to add it to
7592 // the clobbers list if they want to use it in their inline assembly code.
7593 //
7594 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7595 // code generation, so using it in inline assembly without adding it to the
7596 // clobbers list can cause conflicts between the inline assembly code and
7597 // the surrounding generated code.
7598 //
7599 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7600 // operands, which will conflict with the ".set at" assembler option (which
7601 // we use only for inline assembly, in order to maintain compatibility with
7602 // GCC) and will also conflict with the user's usage of $1.
7603 //
7604 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7605 // register for generated code is to automatically clobber $1 for all inline
7606 // assembly code.
7607 //
7608 // FIXME: We should automatically clobber $1 only for inline assembly code
7609 // which actually uses it. This would allow LLVM to use $1 for inline
7610 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007611 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007612 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007613
Craig Topper3164f332014-03-11 03:39:26 +00007614 bool handleTargetFeatures(std::vector<std::string> &Features,
7615 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007616 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007617 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007618 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007619 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007620 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007621 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007622 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007623
Eric Christopher610fe112015-08-26 08:21:55 +00007624 for (const auto &Feature : Features) {
7625 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007626 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007627 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007628 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007629 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007630 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007631 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007632 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007633 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007634 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007635 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007636 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007637 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007638 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007639 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007640 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007641 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007642 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007643 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007644 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007645 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007646 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007647 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007648
James Y Knightb214cbc2016-03-04 19:00:41 +00007649 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007650
Rafael Espindolaeb265472013-08-21 21:59:03 +00007651 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007652 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007653
Craig Topper3164f332014-03-11 03:39:26 +00007654 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007655 if (RegNo == 0) return 4;
7656 if (RegNo == 1) return 5;
7657 return -1;
7658 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007659
7660 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007661
7662 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7663 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7664 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7665 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7666 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7667 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7668 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7669 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7670 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7671 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7672 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7673 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7674 {{"ra"}, "$31"}};
7675 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7676 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7677 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7678 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7679 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7680 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7681 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7682 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7683 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7684 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7685 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7686 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007687 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007688 return llvm::makeArrayRef(O32RegAliases);
7689 return llvm::makeArrayRef(NewABIRegAliases);
7690 }
7691
7692 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007693 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007694 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007695
7696 bool validateTarget(DiagnosticsEngine &Diags) const override {
7697 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7698 // this yet. It's better to fail here than on the backend assertion.
7699 if (processorSupportsGPR64() && ABI == "o32") {
7700 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7701 return false;
7702 }
7703
7704 // 64-bit ABI's require 64-bit CPU's.
7705 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7706 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7707 return false;
7708 }
7709
7710 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7711 // can't handle this yet. It's better to fail here than on the
7712 // backend assertion.
7713 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7714 getTriple().getArch() == llvm::Triple::mips64el) &&
7715 ABI == "o32") {
7716 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7717 << ABI << getTriple().str();
7718 return false;
7719 }
7720
7721 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7722 // can't handle this yet. It's better to fail here than on the
7723 // backend assertion.
7724 if ((getTriple().getArch() == llvm::Triple::mips ||
7725 getTriple().getArch() == llvm::Triple::mipsel) &&
7726 (ABI == "n32" || ABI == "n64")) {
7727 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7728 << ABI << getTriple().str();
7729 return false;
7730 }
7731
7732 return true;
7733 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007734};
7735
Daniel Sanders4672af62016-05-27 11:51:02 +00007736const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007737#define BUILTIN(ID, TYPE, ATTRS) \
7738 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7739#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7740 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007741#include "clang/Basic/BuiltinsMips.def"
7742};
7743
Ivan Krasindd7403e2011-08-24 20:22:22 +00007744class PNaClTargetInfo : public TargetInfo {
7745public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007746 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7747 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007748 this->LongAlign = 32;
7749 this->LongWidth = 32;
7750 this->PointerAlign = 32;
7751 this->PointerWidth = 32;
7752 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007753 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007754 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007755 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007756 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007757 this->SizeType = TargetInfo::UnsignedInt;
7758 this->PtrDiffType = TargetInfo::SignedInt;
7759 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007760 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007761 }
7762
Craig Toppere6f17d02014-03-11 04:07:52 +00007763 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007764 Builder.defineMacro("__le32__");
7765 Builder.defineMacro("__pnacl__");
7766 }
Craig Topper3164f332014-03-11 03:39:26 +00007767 void getTargetDefines(const LangOptions &Opts,
7768 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007769 getArchDefines(Opts, Builder);
7770 }
Craig Topper3164f332014-03-11 03:39:26 +00007771 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007772 return Feature == "pnacl";
7773 }
Craig Topper6c03a542015-10-19 04:51:35 +00007774 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007775 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007776 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007777 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007778 ArrayRef<const char *> getGCCRegNames() const override;
7779 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007780 bool validateAsmConstraint(const char *&Name,
7781 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007782 return false;
7783 }
7784
Craig Topper3164f332014-03-11 03:39:26 +00007785 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007786 return "";
7787 }
7788};
7789
Craig Topperf054e3a2015-10-19 03:52:27 +00007790ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7791 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007792}
7793
Craig Topperf054e3a2015-10-19 03:52:27 +00007794ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7795 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007796}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007797
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007798// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007799class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007800public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007801 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7802 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007803
7804 BuiltinVaListKind getBuiltinVaListKind() const override {
7805 return TargetInfo::PNaClABIBuiltinVaList;
7806 }
7807};
7808
JF Bastien643817d2014-09-12 17:52:47 +00007809class Le64TargetInfo : public TargetInfo {
7810 static const Builtin::Info BuiltinInfo[];
7811
7812public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007813 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7814 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007815 NoAsmVariants = true;
7816 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7817 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007818 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007819 }
7820
7821 void getTargetDefines(const LangOptions &Opts,
7822 MacroBuilder &Builder) const override {
7823 DefineStd(Builder, "unix", Opts);
7824 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7825 Builder.defineMacro("__ELF__");
7826 }
Craig Topper6c03a542015-10-19 04:51:35 +00007827 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7828 return llvm::makeArrayRef(BuiltinInfo,
7829 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007830 }
7831 BuiltinVaListKind getBuiltinVaListKind() const override {
7832 return TargetInfo::PNaClABIBuiltinVaList;
7833 }
7834 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007835 ArrayRef<const char *> getGCCRegNames() const override {
7836 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007837 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007838 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7839 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007840 }
7841 bool validateAsmConstraint(const char *&Name,
7842 TargetInfo::ConstraintInfo &Info) const override {
7843 return false;
7844 }
7845
7846 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007847};
Dan Gohmanc2853072015-09-03 22:51:53 +00007848
7849class WebAssemblyTargetInfo : public TargetInfo {
7850 static const Builtin::Info BuiltinInfo[];
7851
7852 enum SIMDEnum {
7853 NoSIMD,
7854 SIMD128,
7855 } SIMDLevel;
7856
7857public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007858 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007859 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007860 NoAsmVariants = true;
7861 SuitableAlign = 128;
7862 LargeArrayMinWidth = 128;
7863 LargeArrayAlign = 128;
7864 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007865 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007866 LongDoubleWidth = LongDoubleAlign = 128;
7867 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007868 SizeType = UnsignedInt;
7869 PtrDiffType = SignedInt;
7870 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007871 }
7872
7873protected:
7874 void getTargetDefines(const LangOptions &Opts,
7875 MacroBuilder &Builder) const override {
7876 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7877 if (SIMDLevel >= SIMD128)
7878 Builder.defineMacro("__wasm_simd128__");
7879 }
7880
7881private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007882 bool
7883 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7884 StringRef CPU,
7885 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007886 if (CPU == "bleeding-edge")
7887 Features["simd128"] = true;
7888 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7889 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007890 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007891 return llvm::StringSwitch<bool>(Feature)
7892 .Case("simd128", SIMDLevel >= SIMD128)
7893 .Default(false);
7894 }
7895 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007896 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007897 for (const auto &Feature : Features) {
7898 if (Feature == "+simd128") {
7899 SIMDLevel = std::max(SIMDLevel, SIMD128);
7900 continue;
7901 }
7902 if (Feature == "-simd128") {
7903 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7904 continue;
7905 }
7906
7907 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7908 << "-target-feature";
7909 return false;
7910 }
7911 return true;
7912 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007913 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007914 return llvm::StringSwitch<bool>(Name)
7915 .Case("mvp", true)
7916 .Case("bleeding-edge", true)
7917 .Case("generic", true)
7918 .Default(false);
7919 }
Craig Topper6c03a542015-10-19 04:51:35 +00007920 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7921 return llvm::makeArrayRef(BuiltinInfo,
7922 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007923 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007924 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007925 return VoidPtrBuiltinVaList;
7926 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007927 ArrayRef<const char *> getGCCRegNames() const final {
7928 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007929 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007930 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7931 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007932 }
7933 bool
7934 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007935 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007936 return false;
7937 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007938 const char *getClobbers() const final { return ""; }
7939 bool isCLZForZeroUndef() const final { return false; }
7940 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007941 IntType getIntTypeByWidth(unsigned BitWidth,
7942 bool IsSigned) const final {
7943 // WebAssembly prefers long long for explicitly 64-bit integers.
7944 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7945 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7946 }
7947 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7948 bool IsSigned) const final {
7949 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7950 return BitWidth == 64
7951 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7952 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7953 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007954};
7955
7956const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7957#define BUILTIN(ID, TYPE, ATTRS) \
7958 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7959#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7960 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7961#include "clang/Basic/BuiltinsWebAssembly.def"
7962};
7963
7964class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7965public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007966 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7967 const TargetOptions &Opts)
7968 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007969 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007970 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007971 }
7972
7973protected:
7974 void getTargetDefines(const LangOptions &Opts,
7975 MacroBuilder &Builder) const override {
7976 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7977 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7978 }
7979};
7980
7981class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7982public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007983 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7984 const TargetOptions &Opts)
7985 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007986 LongAlign = LongWidth = 64;
7987 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007988 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007989 SizeType = UnsignedLong;
7990 PtrDiffType = SignedLong;
7991 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007992 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007993 }
7994
7995protected:
7996 void getTargetDefines(const LangOptions &Opts,
7997 MacroBuilder &Builder) const override {
7998 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7999 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8000 }
8001};
8002
JF Bastien643817d2014-09-12 17:52:47 +00008003const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8004#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008005 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008006#include "clang/Basic/BuiltinsLe64.def"
8007};
8008
Eric Christopherc48497a2015-09-18 21:26:24 +00008009static const unsigned SPIRAddrSpaceMap[] = {
8010 1, // opencl_global
8011 3, // opencl_local
8012 2, // opencl_constant
8013 4, // opencl_generic
8014 0, // cuda_device
8015 0, // cuda_constant
8016 0 // cuda_shared
8017};
8018class SPIRTargetInfo : public TargetInfo {
8019public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008020 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8021 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008022 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8023 "SPIR target must use unknown OS");
8024 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8025 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008026 TLSSupported = false;
8027 LongWidth = LongAlign = 64;
8028 AddrSpaceMap = &SPIRAddrSpaceMap;
8029 UseAddrSpaceMapMangling = true;
8030 // Define available target features
8031 // These must be defined in sorted order!
8032 NoAsmVariants = true;
8033 }
8034 void getTargetDefines(const LangOptions &Opts,
8035 MacroBuilder &Builder) const override {
8036 DefineStd(Builder, "SPIR", Opts);
8037 }
8038 bool hasFeature(StringRef Feature) const override {
8039 return Feature == "spir";
8040 }
Craig Topper3164f332014-03-11 03:39:26 +00008041
Craig Topper6c03a542015-10-19 04:51:35 +00008042 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008043 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008044 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008045 bool validateAsmConstraint(const char *&Name,
8046 TargetInfo::ConstraintInfo &info) const override {
8047 return true;
8048 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008049 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8050 return None;
8051 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008052 BuiltinVaListKind getBuiltinVaListKind() const override {
8053 return TargetInfo::VoidPtrBuiltinVaList;
8054 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008055
Eric Christopherc48497a2015-09-18 21:26:24 +00008056 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008057 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8058 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008059 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008060
Eric Christopherc48497a2015-09-18 21:26:24 +00008061 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8062 return CC_SpirFunction;
8063 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008064
8065 void setSupportedOpenCLOpts() override {
8066 // Assume all OpenCL extensions and optional core features are supported
8067 // for SPIR since it is a generic target.
8068 getSupportedOpenCLOpts().setAll();
8069 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008070};
Guy Benyeib798fc92012-12-11 21:38:14 +00008071
Eric Christopherc48497a2015-09-18 21:26:24 +00008072class SPIR32TargetInfo : public SPIRTargetInfo {
8073public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008074 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8075 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008076 PointerWidth = PointerAlign = 32;
8077 SizeType = TargetInfo::UnsignedInt;
8078 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008079 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8080 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008081 }
8082 void getTargetDefines(const LangOptions &Opts,
8083 MacroBuilder &Builder) const override {
8084 DefineStd(Builder, "SPIR32", Opts);
8085 }
8086};
Guy Benyeib798fc92012-12-11 21:38:14 +00008087
Eric Christopherc48497a2015-09-18 21:26:24 +00008088class SPIR64TargetInfo : public SPIRTargetInfo {
8089public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008090 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8091 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008092 PointerWidth = PointerAlign = 64;
8093 SizeType = TargetInfo::UnsignedLong;
8094 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008095 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8096 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008097 }
8098 void getTargetDefines(const LangOptions &Opts,
8099 MacroBuilder &Builder) const override {
8100 DefineStd(Builder, "SPIR64", Opts);
8101 }
8102};
Guy Benyeib798fc92012-12-11 21:38:14 +00008103
Robert Lytton0e076492013-08-13 09:43:10 +00008104class XCoreTargetInfo : public TargetInfo {
8105 static const Builtin::Info BuiltinInfo[];
8106public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008107 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8108 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008109 NoAsmVariants = true;
8110 LongLongAlign = 32;
8111 SuitableAlign = 32;
8112 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008113 SizeType = UnsignedInt;
8114 PtrDiffType = SignedInt;
8115 IntPtrType = SignedInt;
8116 WCharType = UnsignedChar;
8117 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008118 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008119 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8120 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008121 }
Craig Topper3164f332014-03-11 03:39:26 +00008122 void getTargetDefines(const LangOptions &Opts,
8123 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008124 Builder.defineMacro("__XS1B__");
8125 }
Craig Topper6c03a542015-10-19 04:51:35 +00008126 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8127 return llvm::makeArrayRef(BuiltinInfo,
8128 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008129 }
Craig Topper3164f332014-03-11 03:39:26 +00008130 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008131 return TargetInfo::VoidPtrBuiltinVaList;
8132 }
Craig Topper3164f332014-03-11 03:39:26 +00008133 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008134 return "";
8135 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008136 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008137 static const char * const GCCRegNames[] = {
8138 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8139 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8140 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008141 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008142 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008143 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8144 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008145 }
Craig Topper3164f332014-03-11 03:39:26 +00008146 bool validateAsmConstraint(const char *&Name,
8147 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008148 return false;
8149 }
Craig Topper3164f332014-03-11 03:39:26 +00008150 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008151 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8152 return (RegNo < 2)? RegNo : -1;
8153 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008154 bool allowsLargerPreferedTypeAlignment() const override {
8155 return false;
8156 }
Robert Lytton0e076492013-08-13 09:43:10 +00008157};
8158
8159const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008160#define BUILTIN(ID, TYPE, ATTRS) \
8161 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8162#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8163 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008164#include "clang/Basic/BuiltinsXCore.def"
8165};
Robert Lytton0e076492013-08-13 09:43:10 +00008166
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008167// x86_32 Android target
8168class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8169public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008170 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8171 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008172 SuitableAlign = 32;
8173 LongDoubleWidth = 64;
8174 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8175 }
8176};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008177
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008178// x86_64 Android target
8179class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8180public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008181 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8182 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008183 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8184 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008185
8186 bool useFloat128ManglingForLongDouble() const override {
8187 return true;
8188 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008189};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008190
8191// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8192class RenderScript32TargetInfo : public ARMleTargetInfo {
8193public:
8194 RenderScript32TargetInfo(const llvm::Triple &Triple,
8195 const TargetOptions &Opts)
8196 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8197 Triple.getOSName(),
8198 Triple.getEnvironmentName()),
8199 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008200 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008201 LongWidth = LongAlign = 64;
8202 }
8203 void getTargetDefines(const LangOptions &Opts,
8204 MacroBuilder &Builder) const override {
8205 Builder.defineMacro("__RENDERSCRIPT__");
8206 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8207 }
8208};
8209
8210// 64-bit RenderScript is aarch64
8211class RenderScript64TargetInfo : public AArch64leTargetInfo {
8212public:
8213 RenderScript64TargetInfo(const llvm::Triple &Triple,
8214 const TargetOptions &Opts)
8215 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8216 Triple.getOSName(),
8217 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008218 Opts) {
8219 IsRenderScriptTarget = true;
8220 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008221
8222 void getTargetDefines(const LangOptions &Opts,
8223 MacroBuilder &Builder) const override {
8224 Builder.defineMacro("__RENDERSCRIPT__");
8225 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8226 }
8227};
8228
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008229} // end anonymous namespace
8230
Chris Lattner5ba61f02006-10-14 07:39:34 +00008231//===----------------------------------------------------------------------===//
8232// Driver code
8233//===----------------------------------------------------------------------===//
8234
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8236 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008237 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008238
Daniel Dunbar52322032009-08-18 05:47:58 +00008239 switch (Triple.getArch()) {
8240 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008241 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008242
Tim Northover2a0783d2014-05-30 14:14:07 +00008243 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008244 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008245
8246 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008247 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008248
Jacques Pienaard964cc22016-03-28 21:02:54 +00008249 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008250 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008251
Tim Northover2a0783d2014-05-30 14:14:07 +00008252 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008253 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008254 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008255
8256 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008257 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008258 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008259 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008260 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008261 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008262 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008263 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008264 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008265 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008266 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008267 }
8268
Christian Pirker9b019ae2014-02-25 13:51:00 +00008269 case llvm::Triple::aarch64_be:
8270 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008271 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008272 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008273 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008274 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008275 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008276 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008277 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008278 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008279 }
8280
Daniel Dunbar52322032009-08-18 05:47:58 +00008281 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008282 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008283 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008284 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008285
Daniel Dunbar52322032009-08-18 05:47:58 +00008286 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008287 case llvm::Triple::CloudABI:
8288 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008289 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008290 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008291 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008292 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008293 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008294 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008295 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008296 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008297 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008298 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008299 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008300 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008301 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008302 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008303 case llvm::Triple::Win32:
8304 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008305 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008306 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008307 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008308 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008309 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008310 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008311 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008312 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008313 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008314 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008315 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008316 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008317 }
8318
8319 case llvm::Triple::armeb:
8320 case llvm::Triple::thumbeb:
8321 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008322 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008323
8324 switch (os) {
8325 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008326 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008327 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008328 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008329 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008330 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008331 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008332 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008333 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008334 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008335 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008336 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008337 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008338 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008339 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008340 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008341 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008342
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008343 case llvm::Triple::bpfeb:
8344 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008345 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008346
Daniel Dunbar52322032009-08-18 05:47:58 +00008347 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008348 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008349
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008350 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008351 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008352 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008353 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008354 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008355 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008356 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008357 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008358 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008359 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008360 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008361 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008362 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008363
8364 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008365 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008366 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008367 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008368 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008369 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008370 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008371 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008372 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008373 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008374 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008375 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008376 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008377 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008378 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008379
Akira Hatanakabef17452011-09-20 19:21:49 +00008380 case llvm::Triple::mips64:
8381 switch (os) {
8382 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008383 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008384 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008385 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008386 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008387 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008388 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008389 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008390 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008391 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008392 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008393 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008394 }
8395
8396 case llvm::Triple::mips64el:
8397 switch (os) {
8398 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008399 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008400 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008401 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008402 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008403 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008404 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008405 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008406 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008407 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008408 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008409 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008410 }
8411
Ivan Krasindd7403e2011-08-24 20:22:22 +00008412 case llvm::Triple::le32:
8413 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008414 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008415 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008416 default:
8417 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008418 }
8419
JF Bastien643817d2014-09-12 17:52:47 +00008420 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008421 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008422
Daniel Dunbar52322032009-08-18 05:47:58 +00008423 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008424 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008425 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008426 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008427 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008428 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008429 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008430 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008431 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008432 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008433 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008434 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008435 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008436 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008437 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008438 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008439 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008440
8441 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008442 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008443 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008444 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008445 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008446 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008447 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008448 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008449 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008450 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008451 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008452 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008453 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008454 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008455 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008456
Bill Schmidt778d3872013-07-26 01:36:11 +00008457 case llvm::Triple::ppc64le:
8458 switch (os) {
8459 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008460 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008461 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008462 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008463 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008464 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008465 }
8466
Peter Collingbournec947aae2012-05-20 23:28:41 +00008467 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008468 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008469 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008470 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008471
Tom Stellardd8e38a32015-01-06 20:34:47 +00008472 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008473 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008474 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008475
Daniel Dunbar52322032009-08-18 05:47:58 +00008476 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008477 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008478 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008479 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008480 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008481 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008482 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008483 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008484 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008485 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008486 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008487 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008488 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008489 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008490 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008491
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008492 // The 'sparcel' architecture copies all the above cases except for Solaris.
8493 case llvm::Triple::sparcel:
8494 switch (os) {
8495 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008496 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008497 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008498 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008499 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008500 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008501 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008502 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008503 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008504 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008505 }
8506
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008507 case llvm::Triple::sparcv9:
8508 switch (os) {
8509 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008510 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008511 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008512 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008513 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008514 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008515 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008516 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008517 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008518 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008519 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008520 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008521 }
8522
Ulrich Weigand47445072013-05-06 16:26:41 +00008523 case llvm::Triple::systemz:
8524 switch (os) {
8525 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008526 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008527 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008528 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008529 }
8530
Eli Friedmana9c3d712009-08-19 20:47:07 +00008531 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008532 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008533
Daniel Dunbar52322032009-08-18 05:47:58 +00008534 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008535 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008536 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008537
Daniel Dunbar52322032009-08-18 05:47:58 +00008538 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008539 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008540 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008541 case llvm::Triple::Linux: {
8542 switch (Triple.getEnvironment()) {
8543 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008544 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008545 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008546 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008547 }
8548 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008549 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008550 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008551 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008552 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008553 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008554 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008555 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008556 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008557 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008558 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008559 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008560 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008561 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008562 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008563 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008564 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008565 case llvm::Triple::Win32: {
8566 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008567 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008568 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008569 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008570 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008571 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008572 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008573 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008574 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008575 }
8576 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008577 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008578 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008579 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008580 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008581 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008582 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008583 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008584 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008585 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008586 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008587 }
8588
8589 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008590 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008591 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008592
Daniel Dunbar52322032009-08-18 05:47:58 +00008593 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008594 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008595 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008596 case llvm::Triple::Linux: {
8597 switch (Triple.getEnvironment()) {
8598 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008599 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008600 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008601 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008602 }
8603 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008604 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008605 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008606 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008607 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008608 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008609 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008610 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008611 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008612 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008613 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008614 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008615 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008616 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008617 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008618 case llvm::Triple::Win32: {
8619 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008620 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008621 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008622 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008623 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008624 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008625 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008626 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008627 }
8628 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008629 case llvm::Triple::Haiku:
8630 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008631 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008632 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008633 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008634 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008635 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008636 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008637 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008638
Douglas Katzman78d7c542015-05-12 21:18:10 +00008639 case llvm::Triple::spir: {
8640 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8641 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8642 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008643 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008644 }
8645 case llvm::Triple::spir64: {
8646 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8647 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8648 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008649 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008650 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008651 case llvm::Triple::wasm32:
8652 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8653 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008654 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008655 case llvm::Triple::wasm64:
8656 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8657 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008658 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008659
8660 case llvm::Triple::renderscript32:
8661 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8662 case llvm::Triple::renderscript64:
8663 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008664 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008665}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008666
8667/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008668/// options.
Alp Toker80758082014-07-06 05:26:44 +00008669TargetInfo *
8670TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008671 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008672 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008673
8674 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008675 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008676 if (!Target) {
8677 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008678 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008679 }
Alp Toker80758082014-07-06 05:26:44 +00008680 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008681
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008682 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008683 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8684 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008685 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008686 }
8687
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008688 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008689 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8690 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008691 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008692 }
8693
Rafael Espindolaeb265472013-08-21 21:59:03 +00008694 // Set the fp math unit.
8695 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8696 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008697 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008698 }
8699
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008700 // Compute the default target features, we need the target to handle this
8701 // because features may have dependencies on one another.
8702 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008703 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8704 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008705 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008706
8707 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008708 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008709 for (const auto &F : Features)
8710 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8711
Eric Christopher3ff21b32013-10-16 21:26:26 +00008712 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008713 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008714
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008715 Target->setSupportedOpenCLOpts();
8716
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008717 if (!Target->validateTarget(Diags))
8718 return nullptr;
8719
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008720 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008721}