blob: 126492d27b9071f7803c4581dd0bb68edea07a04 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346 DefineStd(Builder, "unix", Opts);
347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
391 DefineStd(Builder, "unix", Opts);
392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
414 DefineStd(Builder, "unix", Opts);
415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000809 // RegParmMax is inherited from the underlying architecture.
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
Petr Hosek62e1d232016-10-06 06:08:09 +0000826// Fuchsia Target
827template<typename Target>
828class FuchsiaTargetInfo : public OSTargetInfo<Target> {
829protected:
830 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
831 MacroBuilder &Builder) const override {
832 Builder.defineMacro("__Fuchsia__");
833 Builder.defineMacro("__ELF__");
834 if (Opts.POSIXThreads)
835 Builder.defineMacro("_REENTRANT");
836 // Required by the libc++ locale support.
837 if (Opts.CPlusPlus)
838 Builder.defineMacro("_GNU_SOURCE");
839 }
840public:
841 FuchsiaTargetInfo(const llvm::Triple &Triple,
842 const TargetOptions &Opts)
843 : OSTargetInfo<Target>(Triple, Opts) {
844 this->MCountName = "__mcount";
845 }
846};
847
Dan Gohmanc2853072015-09-03 22:51:53 +0000848// WebAssembly target
849template <typename Target>
850class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
851 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000852 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000853 // A common platform macro.
854 if (Opts.POSIXThreads)
855 Builder.defineMacro("_REENTRANT");
856 // Follow g++ convention and predefine _GNU_SOURCE for C++.
857 if (Opts.CPlusPlus)
858 Builder.defineMacro("_GNU_SOURCE");
859 }
860
861 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000862 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000863 return ".text.__startup";
864 }
865
866public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000867 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
868 const TargetOptions &Opts)
869 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000870 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000871 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
872 }
873};
Dan Gohmanc2853072015-09-03 22:51:53 +0000874
Chris Lattner09d98f52008-10-05 21:50:58 +0000875//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000876// Specific target implementations.
877//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000878
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000879// PPC abstract base class
880class PPCTargetInfo : public TargetInfo {
881 static const Builtin::Info BuiltinInfo[];
882 static const char * const GCCRegNames[];
883 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000884 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000885
886 // Target cpu features.
887 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000888 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000889 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000890 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000891 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000892 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000893 bool HasBPERMD;
894 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000895 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000896
Ulrich Weigand8afad612014-07-28 13:17:52 +0000897protected:
898 std::string ABI;
899
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000900public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000901 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000902 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
903 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000904 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000905 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000906 LongDoubleWidth = LongDoubleAlign = 128;
907 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
908 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000909
Hal Finkel6b984f02012-07-03 16:51:04 +0000910 /// \brief Flags for architecture specific defines.
911 typedef enum {
912 ArchDefineNone = 0,
913 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
914 ArchDefinePpcgr = 1 << 1,
915 ArchDefinePpcsq = 1 << 2,
916 ArchDefine440 = 1 << 3,
917 ArchDefine603 = 1 << 4,
918 ArchDefine604 = 1 << 5,
919 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000920 ArchDefinePwr5 = 1 << 7,
921 ArchDefinePwr5x = 1 << 8,
922 ArchDefinePwr6 = 1 << 9,
923 ArchDefinePwr6x = 1 << 10,
924 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000925 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000926 ArchDefinePwr9 = 1 << 13,
927 ArchDefineA2 = 1 << 14,
928 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000929 } ArchDefineTypes;
930
Bill Schmidt38378a02013-02-01 20:23:10 +0000931 // Note: GCC recognizes the following additional cpus:
932 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
933 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
934 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000935 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000936 bool CPUKnown = llvm::StringSwitch<bool>(Name)
937 .Case("generic", true)
938 .Case("440", true)
939 .Case("450", true)
940 .Case("601", true)
941 .Case("602", true)
942 .Case("603", true)
943 .Case("603e", true)
944 .Case("603ev", true)
945 .Case("604", true)
946 .Case("604e", true)
947 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000948 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000949 .Case("g3", true)
950 .Case("7400", true)
951 .Case("g4", true)
952 .Case("7450", true)
953 .Case("g4+", true)
954 .Case("750", true)
955 .Case("970", true)
956 .Case("g5", true)
957 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000958 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000959 .Case("e500mc", true)
960 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000961 .Case("power3", true)
962 .Case("pwr3", true)
963 .Case("power4", true)
964 .Case("pwr4", true)
965 .Case("power5", true)
966 .Case("pwr5", true)
967 .Case("power5x", true)
968 .Case("pwr5x", true)
969 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000970 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000971 .Case("power6x", true)
972 .Case("pwr6x", true)
973 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000974 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000975 .Case("power8", true)
976 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000977 .Case("power9", true)
978 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000979 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000980 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000981 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000982 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000983 .Case("powerpc64le", true)
984 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000985 .Default(false);
986
987 if (CPUKnown)
988 CPU = Name;
989
990 return CPUKnown;
991 }
992
Ulrich Weigand8afad612014-07-28 13:17:52 +0000993
994 StringRef getABI() const override { return ABI; }
995
Craig Topper6c03a542015-10-19 04:51:35 +0000996 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
997 return llvm::makeArrayRef(BuiltinInfo,
998 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000999 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001000
Craig Topper3164f332014-03-11 03:39:26 +00001001 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001002
Craig Topper3164f332014-03-11 03:39:26 +00001003 void getTargetDefines(const LangOptions &Opts,
1004 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001005
Eric Christopher8c47b422015-10-09 18:39:55 +00001006 bool
1007 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1008 StringRef CPU,
1009 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001010
Craig Topper3164f332014-03-11 03:39:26 +00001011 bool handleTargetFeatures(std::vector<std::string> &Features,
1012 DiagnosticsEngine &Diags) override;
1013 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001014 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1015 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001016
Craig Topperf054e3a2015-10-19 03:52:27 +00001017 ArrayRef<const char *> getGCCRegNames() const override;
1018 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001019 bool validateAsmConstraint(const char *&Name,
1020 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001021 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001022 default: return false;
1023 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001024 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001025 case 'b': // Base register
1026 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001027 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001028 break;
1029 // FIXME: The following are added to allow parsing.
1030 // I just took a guess at what the actions should be.
1031 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001032 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001033 case 'v': // Altivec vector register
1034 Info.setAllowsRegister();
1035 break;
1036 case 'w':
1037 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 case 'd':// VSX vector register to hold vector double data
1039 case 'f':// VSX vector register to hold vector float data
1040 case 's':// VSX vector register to hold scalar float data
1041 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001042 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001043 break;
1044 default:
1045 return false;
1046 }
1047 Info.setAllowsRegister();
1048 Name++; // Skip over 'w'.
1049 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001050 case 'h': // `MQ', `CTR', or `LINK' register
1051 case 'q': // `MQ' register
1052 case 'c': // `CTR' register
1053 case 'l': // `LINK' register
1054 case 'x': // `CR' register (condition register) number 0
1055 case 'y': // `CR' register (condition register)
1056 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001057 Info.setAllowsRegister();
1058 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001059 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001060 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // (use `L' instead for SImode constants)
1062 case 'K': // Unsigned 16-bit constant
1063 case 'L': // Signed 16-bit constant shifted left 16 bits
1064 case 'M': // Constant larger than 31
1065 case 'N': // Exact power of 2
1066 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001067 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001068 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001069 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001070 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001071 break;
1072 case 'm': // Memory operand. Note that on PowerPC targets, m can
1073 // include addresses that update the base register. It
1074 // is therefore only safe to use `m' in an asm statement
1075 // if that asm statement accesses the operand exactly once.
1076 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001077 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001078 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001079 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001081 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1082 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // register to be updated.
1084 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001085 if (Name[1] != 's')
1086 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001087 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001088 // include any automodification of the base register. Unlike
1089 // `m', this constraint can be used in asm statements that
1090 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001091 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001092 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001093 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001094 break;
1095 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001096 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001097 case 'Z': // Memory operand that is an indexed or indirect from a
1098 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001099 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001100 Info.setAllowsMemory();
1101 Info.setAllowsRegister();
1102 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001103 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001104 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001105 // register (`p' is preferable for asm statements)
1106 case 'S': // Constant suitable as a 64-bit mask operand
1107 case 'T': // Constant suitable as a 32-bit mask operand
1108 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001109 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001110 // instructions
1111 case 'W': // Vector constant that does not require memory
1112 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001113 break;
1114 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001115 }
John Thompson07a61a42010-06-24 22:44:13 +00001116 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001117 }
Craig Topper3164f332014-03-11 03:39:26 +00001118 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001119 std::string R;
1120 switch (*Constraint) {
1121 case 'e':
1122 case 'w':
1123 // Two-character constraint; add "^" hint for later parsing.
1124 R = std::string("^") + std::string(Constraint, 2);
1125 Constraint++;
1126 break;
1127 default:
1128 return TargetInfo::convertConstraint(Constraint);
1129 }
1130 return R;
1131 }
Craig Topper3164f332014-03-11 03:39:26 +00001132 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001133 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001134 }
Craig Topper3164f332014-03-11 03:39:26 +00001135 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001136 if (RegNo == 0) return 3;
1137 if (RegNo == 1) return 4;
1138 return -1;
1139 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001140
1141 bool hasSjLjLowering() const override {
1142 return true;
1143 }
David Majnemer2617ea62015-06-09 18:05:33 +00001144
1145 bool useFloat128ManglingForLongDouble() const override {
1146 return LongDoubleWidth == 128 &&
1147 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1148 getTriple().isOSBinFormatELF();
1149 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001150};
Anders Carlssonf511f642007-11-27 04:11:28 +00001151
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001152const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001153#define BUILTIN(ID, TYPE, ATTRS) \
1154 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1155#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1156 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001157#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001158};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001159
Eric Christopher917e9522014-11-18 22:36:15 +00001160/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001161/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001162bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001163 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001164 for (const auto &Feature : Features) {
1165 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001166 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001167 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001168 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001169 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001170 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001171 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001172 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001173 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001174 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001175 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001176 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001177 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001178 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001179 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001180 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001181 } else if (Feature == "+float128") {
1182 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001183 } else if (Feature == "+power9-vector") {
1184 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001185 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001186 // TODO: Finish this list and add an assert that we've handled them
1187 // all.
1188 }
Eric Christopher02c33352015-08-25 00:59:11 +00001189
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001190 return true;
1191}
1192
Chris Lattnerecd49032009-03-02 22:27:17 +00001193/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1194/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001195void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001196 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001197 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001198 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001199 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001200 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001201 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001203 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001205 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001206 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001207 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001208 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001209
Chris Lattnerecd49032009-03-02 22:27:17 +00001210 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001211 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1212 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001213 } else {
1214 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1215 getTriple().getOS() != llvm::Triple::OpenBSD)
1216 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001217 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001218
Ulrich Weigand8afad612014-07-28 13:17:52 +00001219 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001220 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001221 Builder.defineMacro("_CALL_ELF", "1");
1222 if (ABI == "elfv2")
1223 Builder.defineMacro("_CALL_ELF", "2");
1224
Chris Lattnerecd49032009-03-02 22:27:17 +00001225 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001226 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1227 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001228
Chris Lattnerecd49032009-03-02 22:27:17 +00001229 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001230 if (LongDoubleWidth == 128)
1231 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001232
John Thompsone467e192009-11-19 17:18:50 +00001233 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001234 Builder.defineMacro("__VEC__", "10206");
1235 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001236 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001237
1238 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001239 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1240 .Case("440", ArchDefineName)
1241 .Case("450", ArchDefineName | ArchDefine440)
1242 .Case("601", ArchDefineName)
1243 .Case("602", ArchDefineName | ArchDefinePpcgr)
1244 .Case("603", ArchDefineName | ArchDefinePpcgr)
1245 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1246 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1247 .Case("604", ArchDefineName | ArchDefinePpcgr)
1248 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1249 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001250 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001251 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1252 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1253 .Case("750", ArchDefineName | ArchDefinePpcgr)
1254 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1255 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001256 .Case("a2", ArchDefineA2)
1257 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001258 .Case("pwr3", ArchDefinePpcgr)
1259 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1260 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1261 | ArchDefinePpcsq)
1262 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1263 | ArchDefinePpcgr | ArchDefinePpcsq)
1264 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1265 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1266 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1267 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1268 | ArchDefinePpcsq)
1269 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1270 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001271 | ArchDefinePpcgr | ArchDefinePpcsq)
1272 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1273 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1274 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001275 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1276 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1277 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1278 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001279 .Case("power3", ArchDefinePpcgr)
1280 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1281 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1282 | ArchDefinePpcsq)
1283 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1284 | ArchDefinePpcgr | ArchDefinePpcsq)
1285 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1286 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1287 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1288 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1289 | ArchDefinePpcsq)
1290 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1291 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001292 | ArchDefinePpcgr | ArchDefinePpcsq)
1293 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1294 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1295 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001296 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1297 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1298 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1299 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001300 .Default(ArchDefineNone);
1301
1302 if (defs & ArchDefineName)
1303 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1304 if (defs & ArchDefinePpcgr)
1305 Builder.defineMacro("_ARCH_PPCGR");
1306 if (defs & ArchDefinePpcsq)
1307 Builder.defineMacro("_ARCH_PPCSQ");
1308 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001309 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001310 if (defs & ArchDefine603)
1311 Builder.defineMacro("_ARCH_603");
1312 if (defs & ArchDefine604)
1313 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001314 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001315 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001316 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001317 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001318 if (defs & ArchDefinePwr5x)
1319 Builder.defineMacro("_ARCH_PWR5X");
1320 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001321 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001322 if (defs & ArchDefinePwr6x)
1323 Builder.defineMacro("_ARCH_PWR6X");
1324 if (defs & ArchDefinePwr7)
1325 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001326 if (defs & ArchDefinePwr8)
1327 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001328 if (defs & ArchDefinePwr9)
1329 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001330 if (defs & ArchDefineA2)
1331 Builder.defineMacro("_ARCH_A2");
1332 if (defs & ArchDefineA2q) {
1333 Builder.defineMacro("_ARCH_A2Q");
1334 Builder.defineMacro("_ARCH_QP");
1335 }
1336
1337 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1338 Builder.defineMacro("__bg__");
1339 Builder.defineMacro("__THW_BLUEGENE__");
1340 Builder.defineMacro("__bgq__");
1341 Builder.defineMacro("__TOS_BGQ__");
1342 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001343
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001344 if (HasVSX)
1345 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001346 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001347 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001348 if (HasP8Crypto)
1349 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001350 if (HasHTM)
1351 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001352 if (HasFloat128)
1353 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001354 if (HasP9Vector)
1355 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001356
1357 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1358 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1360 if (PointerWidth == 64)
1361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001362
Bill Schmidt38378a02013-02-01 20:23:10 +00001363 // FIXME: The following are not yet generated here by Clang, but are
1364 // generated by GCC:
1365 //
1366 // _SOFT_FLOAT_
1367 // __RECIP_PRECISION__
1368 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001369 // __RECIP__
1370 // __RECIPF__
1371 // __RSQRTE__
1372 // __RSQRTEF__
1373 // _SOFT_DOUBLE_
1374 // __NO_LWSYNC__
1375 // __HAVE_BSWAP__
1376 // __LONGDOUBLE128
1377 // __CMODEL_MEDIUM__
1378 // __CMODEL_LARGE__
1379 // _CALL_SYSV
1380 // _CALL_DARWIN
1381 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001382}
1383
Eric Christophera8a14c32015-08-31 18:39:16 +00001384// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001385// explicitly turned off vsx and turned on any of:
1386// - power8-vector
1387// - direct-move
1388// - float128
1389// - power9-vector
1390// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001391// set of options.
1392static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001393 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001394
1395 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1396 FeaturesVec.end()) {
1397 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1398 FeaturesVec.end()) {
1399 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1400 << "-mno-vsx";
1401 return false;
1402 }
1403
1404 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1405 FeaturesVec.end()) {
1406 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1407 << "-mno-vsx";
1408 return false;
1409 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001410
1411 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1412 FeaturesVec.end()) {
1413 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1414 << "-mno-vsx";
1415 return false;
1416 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001417
1418 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1419 FeaturesVec.end()) {
1420 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1421 << "-mno-vsx";
1422 return false;
1423 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001424 }
1425
1426 return true;
1427}
1428
Eric Christopher8c47b422015-10-09 18:39:55 +00001429bool PPCTargetInfo::initFeatureMap(
1430 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1431 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001432 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1433 .Case("7400", true)
1434 .Case("g4", true)
1435 .Case("7450", true)
1436 .Case("g4+", true)
1437 .Case("970", true)
1438 .Case("g5", true)
1439 .Case("pwr6", true)
1440 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001441 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001442 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001443 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001444 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001445 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001446
1447 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001448 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001449 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1450 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001451 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001452 .Case("pwr8", true)
1453 .Default(false);
1454 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1455 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001456 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001457 .Case("pwr8", true)
1458 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001459 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1460 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001461 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001462 .Case("pwr8", true)
1463 .Case("pwr7", true)
1464 .Default(false);
1465 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1466 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001467 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001468 .Case("pwr8", true)
1469 .Case("pwr7", true)
1470 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001471 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1472 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001473 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001474 .Case("pwr8", true)
1475 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001476 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1477 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001478 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001479 .Case("pwr8", true)
1480 .Case("pwr7", true)
1481 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001482
Eric Christophera8a14c32015-08-31 18:39:16 +00001483 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1484 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001485
Eric Christopher007b0a02015-08-28 22:32:01 +00001486 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001487}
1488
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001489bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001490 return llvm::StringSwitch<bool>(Feature)
1491 .Case("powerpc", true)
1492 .Case("vsx", HasVSX)
1493 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001494 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001495 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001496 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001497 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001498 .Case("bpermd", HasBPERMD)
1499 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001500 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001501 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001502 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001503}
Chris Lattner17df24e2008-04-21 18:56:49 +00001504
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001505void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1506 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001507 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1508 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1509 // incompatible options.
1510 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001511 if (Name == "direct-move" ||
1512 Name == "power8-vector" ||
1513 Name == "float128" ||
1514 Name == "power9-vector") {
1515 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001516 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001517 if (Name == "power9-vector")
1518 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001519 } else {
1520 Features[Name] = true;
1521 }
1522 } else {
1523 if (Name == "vsx") {
1524 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001525 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001526 } else {
1527 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001528 }
1529 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001530}
1531
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001532const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001533 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1534 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1535 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1536 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1537 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1538 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1539 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1540 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001541 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001542 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001543 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001544 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1545 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1546 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1547 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001548 "vrsave", "vscr",
1549 "spe_acc", "spefscr",
1550 "sfp"
1551};
Chris Lattner10a5b382007-01-29 05:24:35 +00001552
Craig Topperf054e3a2015-10-19 03:52:27 +00001553ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1554 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001555}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001556
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1558 // While some of these aliases do map to different registers
1559 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001560 { { "0" }, "r0" },
1561 { { "1"}, "r1" },
1562 { { "2" }, "r2" },
1563 { { "3" }, "r3" },
1564 { { "4" }, "r4" },
1565 { { "5" }, "r5" },
1566 { { "6" }, "r6" },
1567 { { "7" }, "r7" },
1568 { { "8" }, "r8" },
1569 { { "9" }, "r9" },
1570 { { "10" }, "r10" },
1571 { { "11" }, "r11" },
1572 { { "12" }, "r12" },
1573 { { "13" }, "r13" },
1574 { { "14" }, "r14" },
1575 { { "15" }, "r15" },
1576 { { "16" }, "r16" },
1577 { { "17" }, "r17" },
1578 { { "18" }, "r18" },
1579 { { "19" }, "r19" },
1580 { { "20" }, "r20" },
1581 { { "21" }, "r21" },
1582 { { "22" }, "r22" },
1583 { { "23" }, "r23" },
1584 { { "24" }, "r24" },
1585 { { "25" }, "r25" },
1586 { { "26" }, "r26" },
1587 { { "27" }, "r27" },
1588 { { "28" }, "r28" },
1589 { { "29" }, "r29" },
1590 { { "30" }, "r30" },
1591 { { "31" }, "r31" },
1592 { { "fr0" }, "f0" },
1593 { { "fr1" }, "f1" },
1594 { { "fr2" }, "f2" },
1595 { { "fr3" }, "f3" },
1596 { { "fr4" }, "f4" },
1597 { { "fr5" }, "f5" },
1598 { { "fr6" }, "f6" },
1599 { { "fr7" }, "f7" },
1600 { { "fr8" }, "f8" },
1601 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001602 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001603 { { "fr11" }, "f11" },
1604 { { "fr12" }, "f12" },
1605 { { "fr13" }, "f13" },
1606 { { "fr14" }, "f14" },
1607 { { "fr15" }, "f15" },
1608 { { "fr16" }, "f16" },
1609 { { "fr17" }, "f17" },
1610 { { "fr18" }, "f18" },
1611 { { "fr19" }, "f19" },
1612 { { "fr20" }, "f20" },
1613 { { "fr21" }, "f21" },
1614 { { "fr22" }, "f22" },
1615 { { "fr23" }, "f23" },
1616 { { "fr24" }, "f24" },
1617 { { "fr25" }, "f25" },
1618 { { "fr26" }, "f26" },
1619 { { "fr27" }, "f27" },
1620 { { "fr28" }, "f28" },
1621 { { "fr29" }, "f29" },
1622 { { "fr30" }, "f30" },
1623 { { "fr31" }, "f31" },
1624 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001625};
1626
Craig Topperf054e3a2015-10-19 03:52:27 +00001627ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1628 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001629}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001630
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001631class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001632public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001633 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1634 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001635 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001636
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001637 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001638 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001639 case llvm::Triple::FreeBSD:
1640 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001641 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001642 PtrDiffType = SignedInt;
1643 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001644 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001645 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001646 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001647 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001648
Roman Divacky3ffe7462012-03-13 19:20:17 +00001649 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1650 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001651 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001652 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001653
1654 // PPC32 supports atomics up to 4 bytes.
1655 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001656 }
1657
Craig Topper3164f332014-03-11 03:39:26 +00001658 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001659 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001660 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001661 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001662};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001663
Bill Schmidt778d3872013-07-26 01:36:11 +00001664// Note: ABI differences may eventually require us to have a separate
1665// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001666class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001667public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001668 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1669 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001670 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001671 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001672 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001673
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001674 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001675 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001676 ABI = "elfv2";
1677 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001678 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001679 ABI = "elfv1";
1680 }
1681
1682 switch (getTriple().getOS()) {
1683 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001684 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001685 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001686 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001687 case llvm::Triple::NetBSD:
1688 IntMaxType = SignedLongLong;
1689 Int64Type = SignedLongLong;
1690 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001691 default:
1692 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001693 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001694
1695 // PPC64 supports atomics up to 8 bytes.
1696 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001697 }
Craig Topper3164f332014-03-11 03:39:26 +00001698 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001699 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001700 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001701 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001702 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001703 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001704 ABI = Name;
1705 return true;
1706 }
1707 return false;
1708 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001709};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001710
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001711class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001712public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1714 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001715 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001716 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001717 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001718 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001719 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001720 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001721 }
Craig Topper3164f332014-03-11 03:39:26 +00001722 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001723 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001724 }
1725};
1726
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001727class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001728public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001729 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1730 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001731 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001732 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001733 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001734 }
1735};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001736
Eric Christopherc48497a2015-09-18 21:26:24 +00001737static const unsigned NVPTXAddrSpaceMap[] = {
1738 1, // opencl_global
1739 3, // opencl_local
1740 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001741 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001742 0, // opencl_generic
1743 1, // cuda_device
1744 4, // cuda_constant
1745 3, // cuda_shared
1746};
1747
1748class NVPTXTargetInfo : public TargetInfo {
1749 static const char *const GCCRegNames[];
1750 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001751 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001752
Eric Christopherc48497a2015-09-18 21:26:24 +00001753public:
Justin Lebar76945b22016-04-29 23:05:19 +00001754 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001755 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001756 TLSSupported = false;
1757 LongWidth = LongAlign = 64;
1758 AddrSpaceMap = &NVPTXAddrSpaceMap;
1759 UseAddrSpaceMapMangling = true;
1760 // Define available target features
1761 // These must be defined in sorted order!
1762 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001763 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001764
1765 // If possible, get a TargetInfo for our host triple, so we can match its
1766 // types.
1767 llvm::Triple HostTriple(Opts.HostTriple);
1768 if (HostTriple.isNVPTX())
1769 return;
1770 std::unique_ptr<TargetInfo> HostTarget(
1771 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1772 if (!HostTarget) {
1773 return;
1774 }
1775
1776 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1777 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1778 BoolWidth = HostTarget->getBoolWidth();
1779 BoolAlign = HostTarget->getBoolAlign();
1780 IntWidth = HostTarget->getIntWidth();
1781 IntAlign = HostTarget->getIntAlign();
1782 HalfWidth = HostTarget->getHalfWidth();
1783 HalfAlign = HostTarget->getHalfAlign();
1784 FloatWidth = HostTarget->getFloatWidth();
1785 FloatAlign = HostTarget->getFloatAlign();
1786 DoubleWidth = HostTarget->getDoubleWidth();
1787 DoubleAlign = HostTarget->getDoubleAlign();
1788 LongWidth = HostTarget->getLongWidth();
1789 LongAlign = HostTarget->getLongAlign();
1790 LongLongWidth = HostTarget->getLongLongWidth();
1791 LongLongAlign = HostTarget->getLongLongAlign();
1792 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001793 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001794 DefaultAlignForAttributeAligned =
1795 HostTarget->getDefaultAlignForAttributeAligned();
1796 SizeType = HostTarget->getSizeType();
1797 IntMaxType = HostTarget->getIntMaxType();
1798 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1799 IntPtrType = HostTarget->getIntPtrType();
1800 WCharType = HostTarget->getWCharType();
1801 WIntType = HostTarget->getWIntType();
1802 Char16Type = HostTarget->getChar16Type();
1803 Char32Type = HostTarget->getChar32Type();
1804 Int64Type = HostTarget->getInt64Type();
1805 SigAtomicType = HostTarget->getSigAtomicType();
1806 ProcessIDType = HostTarget->getProcessIDType();
1807
1808 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1809 UseZeroLengthBitfieldAlignment =
1810 HostTarget->useZeroLengthBitfieldAlignment();
1811 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1812 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1813
Justin Lebar5057f172016-09-09 20:35:43 +00001814 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1815 // we need those macros to be identical on host and device, because (among
1816 // other things) they affect which standard library classes are defined, and
1817 // we need all classes to be defined on both the host and device.
1818 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1819
Justin Lebar76945b22016-04-29 23:05:19 +00001820 // Properties intentionally not copied from host:
1821 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1822 // host/device boundary.
1823 // - SuitableAlign: Not visible across the host/device boundary, and may
1824 // correctly be different on host/device, e.g. if host has wider vector
1825 // types than device.
1826 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1827 // as its double type, but that's not necessarily true on the host.
1828 // TODO: nvcc emits a warning when using long double on device; we should
1829 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001830 }
1831 void getTargetDefines(const LangOptions &Opts,
1832 MacroBuilder &Builder) const override {
1833 Builder.defineMacro("__PTX__");
1834 Builder.defineMacro("__NVPTX__");
1835 if (Opts.CUDAIsDevice) {
1836 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001837 std::string CUDAArchCode = [this] {
1838 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001839 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001840 assert(false && "No GPU arch when compiling CUDA device code.");
1841 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001842 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001843 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001844 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001845 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001846 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001847 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001848 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001849 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001850 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001851 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001852 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001853 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001854 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001855 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001856 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001857 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001858 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001859 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001860 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001861 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001862 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001863 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001864 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001865 return "620";
1866 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001867 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001868 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001869 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001870 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001871 }
Craig Topper6c03a542015-10-19 04:51:35 +00001872 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1873 return llvm::makeArrayRef(BuiltinInfo,
1874 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001875 }
Artem Belevichfda99052016-09-28 17:47:35 +00001876 bool
1877 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1878 StringRef CPU,
1879 const std::vector<std::string> &FeaturesVec) const override {
1880 Features["satom"] = GPU >= CudaArch::SM_60;
1881 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1882 }
1883
Eric Christopherc48497a2015-09-18 21:26:24 +00001884 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001885 return llvm::StringSwitch<bool>(Feature)
1886 .Cases("ptx", "nvptx", true)
1887 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1888 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001889 }
1890
Craig Topperf054e3a2015-10-19 03:52:27 +00001891 ArrayRef<const char *> getGCCRegNames() const override;
1892 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001893 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001894 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001895 }
1896 bool validateAsmConstraint(const char *&Name,
1897 TargetInfo::ConstraintInfo &Info) const override {
1898 switch (*Name) {
1899 default:
1900 return false;
1901 case 'c':
1902 case 'h':
1903 case 'r':
1904 case 'l':
1905 case 'f':
1906 case 'd':
1907 Info.setAllowsRegister();
1908 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001909 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001910 }
1911 const char *getClobbers() const override {
1912 // FIXME: Is this really right?
1913 return "";
1914 }
1915 BuiltinVaListKind getBuiltinVaListKind() const override {
1916 // FIXME: implement
1917 return TargetInfo::CharPtrBuiltinVaList;
1918 }
1919 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001920 GPU = StringToCudaArch(Name);
1921 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001922 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001923 void setSupportedOpenCLOpts() override {
1924 auto &Opts = getSupportedOpenCLOpts();
1925 Opts.cl_clang_storage_class_specifiers = 1;
1926 Opts.cl_khr_gl_sharing = 1;
1927 Opts.cl_khr_icd = 1;
1928
1929 Opts.cl_khr_fp64 = 1;
1930 Opts.cl_khr_byte_addressable_store = 1;
1931 Opts.cl_khr_global_int32_base_atomics = 1;
1932 Opts.cl_khr_global_int32_extended_atomics = 1;
1933 Opts.cl_khr_local_int32_base_atomics = 1;
1934 Opts.cl_khr_local_int32_extended_atomics = 1;
1935 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001936};
1937
1938const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1939#define BUILTIN(ID, TYPE, ATTRS) \
1940 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1941#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1942 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001943#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1944 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001945#include "clang/Basic/BuiltinsNVPTX.def"
1946};
1947
1948const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1949
Craig Topperf054e3a2015-10-19 03:52:27 +00001950ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1951 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001952}
1953
1954class NVPTX32TargetInfo : public NVPTXTargetInfo {
1955public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001956 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1957 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001958 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001959 PointerWidth = PointerAlign = 32;
1960 SizeType = TargetInfo::UnsignedInt;
1961 PtrDiffType = TargetInfo::SignedInt;
1962 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001963 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001964 }
1965};
1966
1967class NVPTX64TargetInfo : public NVPTXTargetInfo {
1968public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001969 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1970 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001971 PointerWidth = PointerAlign = 64;
1972 SizeType = TargetInfo::UnsignedLong;
1973 PtrDiffType = TargetInfo::SignedLong;
1974 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001975 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001976 }
1977};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001978
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001979static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001980 1, // opencl_global
1981 3, // opencl_local
1982 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001983 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001984 1, // cuda_device
1985 2, // cuda_constant
1986 3 // cuda_shared
1987};
1988
Tom Stellarda96344b2014-08-21 13:58:40 +00001989// If you edit the description strings, make sure you update
1990// getPointerWidthV().
1991
Craig Topper273dbc62015-10-18 05:29:26 +00001992static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001993 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1994 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001995
Craig Topper273dbc62015-10-18 05:29:26 +00001996static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001997 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001998 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1999 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002000
Matt Arsenault250024f2016-06-08 01:56:42 +00002001class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002002 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002003 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002004
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002005 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002006 enum GPUKind {
2007 GK_NONE,
2008 GK_R600,
2009 GK_R600_DOUBLE_OPS,
2010 GK_R700,
2011 GK_R700_DOUBLE_OPS,
2012 GK_EVERGREEN,
2013 GK_EVERGREEN_DOUBLE_OPS,
2014 GK_NORTHERN_ISLANDS,
2015 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002016 GK_GFX6,
2017 GK_GFX7,
2018 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00002019 } GPU;
2020
Jan Veselyeebeaea2015-05-04 19:53:36 +00002021 bool hasFP64:1;
2022 bool hasFMAF:1;
2023 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002024 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002025
Matt Arsenault250024f2016-06-08 01:56:42 +00002026 static bool isAMDGCN(const llvm::Triple &TT) {
2027 return TT.getArch() == llvm::Triple::amdgcn;
2028 }
2029
Eli Friedmand13b41e2012-10-12 23:32:00 +00002030public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002031 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002032 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002033 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002034 hasFP64(false),
2035 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002036 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002037 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002038 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002039 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002040 hasFMAF = true;
2041 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002042 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002043
2044 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2045 DataLayoutStringSI : DataLayoutStringR600);
2046
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002047 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002048 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002049 }
2050
Tom Stellarda96344b2014-08-21 13:58:40 +00002051 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2052 if (GPU <= GK_CAYMAN)
2053 return 32;
2054
2055 switch(AddrSpace) {
2056 default:
2057 return 64;
2058 case 0:
2059 case 3:
2060 case 5:
2061 return 32;
2062 }
2063 }
2064
Yaxun Liu26f75662016-08-19 05:17:25 +00002065 uint64_t getMaxPointerWidth() const override {
2066 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2067 }
2068
Craig Topper3164f332014-03-11 03:39:26 +00002069 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002070 return "";
2071 }
2072
Craig Topperf054e3a2015-10-19 03:52:27 +00002073 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002074
Craig Topperf054e3a2015-10-19 03:52:27 +00002075 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2076 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002077 }
2078
Craig Topper3164f332014-03-11 03:39:26 +00002079 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002080 TargetInfo::ConstraintInfo &Info) const override {
2081 switch (*Name) {
2082 default: break;
2083 case 'v': // vgpr
2084 case 's': // sgpr
2085 Info.setAllowsRegister();
2086 return true;
2087 }
2088 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002089 }
2090
Matt Arsenault250024f2016-06-08 01:56:42 +00002091 bool initFeatureMap(llvm::StringMap<bool> &Features,
2092 DiagnosticsEngine &Diags, StringRef CPU,
2093 const std::vector<std::string> &FeatureVec) const override;
2094
Yaxun Liu2c17e822016-08-09 19:43:38 +00002095 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2096 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002097 bool hasFP32Denormals = false;
2098 bool hasFP64Denormals = false;
2099 for (auto &I : TargetOpts.FeaturesAsWritten) {
2100 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2101 hasFP32Denormals = true;
2102 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2103 hasFP64Denormals = true;
2104 }
2105 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002106 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2107 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2108 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002109 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002110 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002111 }
2112
Craig Topper6c03a542015-10-19 04:51:35 +00002113 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2114 return llvm::makeArrayRef(BuiltinInfo,
2115 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002116 }
2117
Craig Topper3164f332014-03-11 03:39:26 +00002118 void getTargetDefines(const LangOptions &Opts,
2119 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002120 if (getTriple().getArch() == llvm::Triple::amdgcn)
2121 Builder.defineMacro("__AMDGCN__");
2122 else
2123 Builder.defineMacro("__R600__");
2124
Jan Veselyeebeaea2015-05-04 19:53:36 +00002125 if (hasFMAF)
2126 Builder.defineMacro("__HAS_FMAF__");
2127 if (hasLDEXPF)
2128 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002129 if (hasFP64)
2130 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002131 }
2132
Craig Topper3164f332014-03-11 03:39:26 +00002133 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002134 return TargetInfo::CharPtrBuiltinVaList;
2135 }
2136
Matt Arsenault250024f2016-06-08 01:56:42 +00002137 static GPUKind parseR600Name(StringRef Name) {
2138 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002139 .Case("r600" , GK_R600)
2140 .Case("rv610", GK_R600)
2141 .Case("rv620", GK_R600)
2142 .Case("rv630", GK_R600)
2143 .Case("rv635", GK_R600)
2144 .Case("rs780", GK_R600)
2145 .Case("rs880", GK_R600)
2146 .Case("rv670", GK_R600_DOUBLE_OPS)
2147 .Case("rv710", GK_R700)
2148 .Case("rv730", GK_R700)
2149 .Case("rv740", GK_R700_DOUBLE_OPS)
2150 .Case("rv770", GK_R700_DOUBLE_OPS)
2151 .Case("palm", GK_EVERGREEN)
2152 .Case("cedar", GK_EVERGREEN)
2153 .Case("sumo", GK_EVERGREEN)
2154 .Case("sumo2", GK_EVERGREEN)
2155 .Case("redwood", GK_EVERGREEN)
2156 .Case("juniper", GK_EVERGREEN)
2157 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2158 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2159 .Case("barts", GK_NORTHERN_ISLANDS)
2160 .Case("turks", GK_NORTHERN_ISLANDS)
2161 .Case("caicos", GK_NORTHERN_ISLANDS)
2162 .Case("cayman", GK_CAYMAN)
2163 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002164 .Default(GK_NONE);
2165 }
2166
2167 static GPUKind parseAMDGCNName(StringRef Name) {
2168 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002169 .Case("tahiti", GK_GFX6)
2170 .Case("pitcairn", GK_GFX6)
2171 .Case("verde", GK_GFX6)
2172 .Case("oland", GK_GFX6)
2173 .Case("hainan", GK_GFX6)
2174 .Case("bonaire", GK_GFX7)
2175 .Case("kabini", GK_GFX7)
2176 .Case("kaveri", GK_GFX7)
2177 .Case("hawaii", GK_GFX7)
2178 .Case("mullins", GK_GFX7)
2179 .Case("tonga", GK_GFX8)
2180 .Case("iceland", GK_GFX8)
2181 .Case("carrizo", GK_GFX8)
2182 .Case("fiji", GK_GFX8)
2183 .Case("stoney", GK_GFX8)
2184 .Case("polaris10", GK_GFX8)
2185 .Case("polaris11", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002186 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002187 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002188
Matt Arsenault250024f2016-06-08 01:56:42 +00002189 bool setCPU(const std::string &Name) override {
2190 if (getTriple().getArch() == llvm::Triple::amdgcn)
2191 GPU = parseAMDGCNName(Name);
2192 else
2193 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002194
Matt Arsenault250024f2016-06-08 01:56:42 +00002195 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002196 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002197
Jan Vesely211ba782016-06-17 02:25:03 +00002198 void setSupportedOpenCLOpts() override {
2199 auto &Opts = getSupportedOpenCLOpts();
2200 Opts.cl_clang_storage_class_specifiers = 1;
2201 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002202
Jan Vesely211ba782016-06-17 02:25:03 +00002203 if (hasFP64)
2204 Opts.cl_khr_fp64 = 1;
2205 if (GPU >= GK_EVERGREEN) {
2206 Opts.cl_khr_byte_addressable_store = 1;
2207 Opts.cl_khr_global_int32_base_atomics = 1;
2208 Opts.cl_khr_global_int32_extended_atomics = 1;
2209 Opts.cl_khr_local_int32_base_atomics = 1;
2210 Opts.cl_khr_local_int32_extended_atomics = 1;
2211 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002212 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002213 Opts.cl_khr_fp16 = 1;
2214 Opts.cl_khr_int64_base_atomics = 1;
2215 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002216 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002217 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002218 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002219 Opts.cl_amd_media_ops = 1;
2220 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002221 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002222 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002223
Yaxun Liu99444cb2016-08-03 20:38:06 +00002224 LangAS::ID getOpenCLImageAddrSpace() const override {
2225 return LangAS::opencl_constant;
2226 }
2227
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002228 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2229 switch (CC) {
2230 default:
2231 return CCCR_Warning;
2232 case CC_C:
2233 case CC_OpenCLKernel:
2234 return CCCR_OK;
2235 }
2236 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002237};
2238
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002239const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002240#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002241 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002242#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2243 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002244#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002245};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002246const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002247 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2248 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2249 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2250 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2251 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2252 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2253 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2254 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2255 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2256 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2257 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2258 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2259 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2260 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2261 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2262 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2263 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2264 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2265 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2266 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2267 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2268 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2269 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2270 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2271 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2272 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2273 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2274 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2275 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2276 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2277 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2278 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2279 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2280 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2281 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2282 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2283 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2284 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2285 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2286 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2287 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2288 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2289 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2290 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2291 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2292 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2293 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002294 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002295 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2296 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002297};
2298
Craig Topperf054e3a2015-10-19 03:52:27 +00002299ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2300 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002301}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002302
Matt Arsenault250024f2016-06-08 01:56:42 +00002303bool AMDGPUTargetInfo::initFeatureMap(
2304 llvm::StringMap<bool> &Features,
2305 DiagnosticsEngine &Diags, StringRef CPU,
2306 const std::vector<std::string> &FeatureVec) const {
2307
2308 // XXX - What does the member GPU mean if device name string passed here?
2309 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2310 if (CPU.empty())
2311 CPU = "tahiti";
2312
2313 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002314 case GK_GFX6:
2315 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002316 break;
2317
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002318 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002319 Features["s-memrealtime"] = true;
2320 Features["16-bit-insts"] = true;
2321 break;
2322
2323 case GK_NONE:
2324 return false;
2325 default:
2326 llvm_unreachable("unhandled subtarget");
2327 }
2328 } else {
2329 if (CPU.empty())
2330 CPU = "r600";
2331
2332 switch (parseR600Name(CPU)) {
2333 case GK_R600:
2334 case GK_R700:
2335 case GK_EVERGREEN:
2336 case GK_NORTHERN_ISLANDS:
2337 break;
2338 case GK_R600_DOUBLE_OPS:
2339 case GK_R700_DOUBLE_OPS:
2340 case GK_EVERGREEN_DOUBLE_OPS:
2341 case GK_CAYMAN:
2342 Features["fp64"] = true;
2343 break;
2344 case GK_NONE:
2345 return false;
2346 default:
2347 llvm_unreachable("unhandled subtarget");
2348 }
2349 }
2350
2351 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2352}
2353
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002354const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002355#define BUILTIN(ID, TYPE, ATTRS) \
2356 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002357#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002358 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002359#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2360 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002361#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002362
2363#define BUILTIN(ID, TYPE, ATTRS) \
2364 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2365#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2366 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2367#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002368};
Eli Friedmanb5366062008-05-20 14:21:01 +00002369
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002370
Nuno Lopescfca1f02009-12-23 17:49:57 +00002371static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002372 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2373 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002374 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002375 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2376 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2377 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002378 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002379 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2380 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002381 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2382 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2383 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2384 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2385 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2386 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2387 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2388 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002389};
2390
Eric Christophercdd36352011-06-21 00:05:20 +00002391const TargetInfo::AddlRegName AddlRegNames[] = {
2392 { { "al", "ah", "eax", "rax" }, 0 },
2393 { { "bl", "bh", "ebx", "rbx" }, 3 },
2394 { { "cl", "ch", "ecx", "rcx" }, 2 },
2395 { { "dl", "dh", "edx", "rdx" }, 1 },
2396 { { "esi", "rsi" }, 4 },
2397 { { "edi", "rdi" }, 5 },
2398 { { "esp", "rsp" }, 7 },
2399 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002400 { { "r8d", "r8w", "r8b" }, 38 },
2401 { { "r9d", "r9w", "r9b" }, 39 },
2402 { { "r10d", "r10w", "r10b" }, 40 },
2403 { { "r11d", "r11w", "r11b" }, 41 },
2404 { { "r12d", "r12w", "r12b" }, 42 },
2405 { { "r13d", "r13w", "r13b" }, 43 },
2406 { { "r14d", "r14w", "r14b" }, 44 },
2407 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002408};
2409
2410// X86 target abstract base class; x86-32 and x86-64 are very close, so
2411// most of the implementation can be shared.
2412class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002413 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002414 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002415 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002416 enum MMX3DNowEnum {
2417 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002418 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002419 enum XOPEnum {
2420 NoXOP,
2421 SSE4A,
2422 FMA4,
2423 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002424 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002425
Craig Topper543f3bd2015-10-14 23:47:57 +00002426 bool HasAES = false;
2427 bool HasPCLMUL = false;
2428 bool HasLZCNT = false;
2429 bool HasRDRND = false;
2430 bool HasFSGSBASE = false;
2431 bool HasBMI = false;
2432 bool HasBMI2 = false;
2433 bool HasPOPCNT = false;
2434 bool HasRTM = false;
2435 bool HasPRFCHW = false;
2436 bool HasRDSEED = false;
2437 bool HasADX = false;
2438 bool HasTBM = false;
2439 bool HasFMA = false;
2440 bool HasF16C = false;
2441 bool HasAVX512CD = false;
2442 bool HasAVX512ER = false;
2443 bool HasAVX512PF = false;
2444 bool HasAVX512DQ = false;
2445 bool HasAVX512BW = false;
2446 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002447 bool HasAVX512VBMI = false;
2448 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002449 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002450 bool HasMPX = false;
2451 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002452 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002453 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002454 bool HasXSAVE = false;
2455 bool HasXSAVEOPT = false;
2456 bool HasXSAVEC = false;
2457 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002458 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002459 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002460 bool HasCLFLUSHOPT = false;
2461 bool HasPCOMMIT = false;
2462 bool HasCLWB = false;
2463 bool HasUMIP = false;
2464 bool HasMOVBE = false;
2465 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002466
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002467 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2468 ///
2469 /// Each enumeration represents a particular CPU supported by Clang. These
2470 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2471 enum CPUKind {
2472 CK_Generic,
2473
2474 /// \name i386
2475 /// i386-generation processors.
2476 //@{
2477 CK_i386,
2478 //@}
2479
2480 /// \name i486
2481 /// i486-generation processors.
2482 //@{
2483 CK_i486,
2484 CK_WinChipC6,
2485 CK_WinChip2,
2486 CK_C3,
2487 //@}
2488
2489 /// \name i586
2490 /// i586-generation processors, P5 microarchitecture based.
2491 //@{
2492 CK_i586,
2493 CK_Pentium,
2494 CK_PentiumMMX,
2495 //@}
2496
2497 /// \name i686
2498 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2499 //@{
2500 CK_i686,
2501 CK_PentiumPro,
2502 CK_Pentium2,
2503 CK_Pentium3,
2504 CK_Pentium3M,
2505 CK_PentiumM,
2506 CK_C3_2,
2507
2508 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2509 /// Clang however has some logic to suport this.
2510 // FIXME: Warn, deprecate, and potentially remove this.
2511 CK_Yonah,
2512 //@}
2513
2514 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002515 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002516 //@{
2517 CK_Pentium4,
2518 CK_Pentium4M,
2519 CK_Prescott,
2520 CK_Nocona,
2521 //@}
2522
2523 /// \name Core
2524 /// Core microarchitecture based processors.
2525 //@{
2526 CK_Core2,
2527
2528 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2529 /// codename which GCC no longer accepts as an option to -march, but Clang
2530 /// has some logic for recognizing it.
2531 // FIXME: Warn, deprecate, and potentially remove this.
2532 CK_Penryn,
2533 //@}
2534
2535 /// \name Atom
2536 /// Atom processors
2537 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002538 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002539 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002540 //@}
2541
2542 /// \name Nehalem
2543 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002544 CK_Nehalem,
2545
2546 /// \name Westmere
2547 /// Westmere microarchitecture based processors.
2548 CK_Westmere,
2549
2550 /// \name Sandy Bridge
2551 /// Sandy Bridge microarchitecture based processors.
2552 CK_SandyBridge,
2553
2554 /// \name Ivy Bridge
2555 /// Ivy Bridge microarchitecture based processors.
2556 CK_IvyBridge,
2557
2558 /// \name Haswell
2559 /// Haswell microarchitecture based processors.
2560 CK_Haswell,
2561
2562 /// \name Broadwell
2563 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002564 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002565
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002566 /// \name Skylake Client
2567 /// Skylake client microarchitecture based processors.
2568 CK_SkylakeClient,
2569
2570 /// \name Skylake Server
2571 /// Skylake server microarchitecture based processors.
2572 CK_SkylakeServer,
2573
2574 /// \name Cannonlake Client
2575 /// Cannonlake client microarchitecture based processors.
2576 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002577
Craig Topper449314e2013-08-20 07:09:39 +00002578 /// \name Knights Landing
2579 /// Knights Landing processor.
2580 CK_KNL,
2581
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002582 /// \name Lakemont
2583 /// Lakemont microarchitecture based processors.
2584 CK_Lakemont,
2585
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002586 /// \name K6
2587 /// K6 architecture processors.
2588 //@{
2589 CK_K6,
2590 CK_K6_2,
2591 CK_K6_3,
2592 //@}
2593
2594 /// \name K7
2595 /// K7 architecture processors.
2596 //@{
2597 CK_Athlon,
2598 CK_AthlonThunderbird,
2599 CK_Athlon4,
2600 CK_AthlonXP,
2601 CK_AthlonMP,
2602 //@}
2603
2604 /// \name K8
2605 /// K8 architecture processors.
2606 //@{
2607 CK_Athlon64,
2608 CK_Athlon64SSE3,
2609 CK_AthlonFX,
2610 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002611 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002612 CK_Opteron,
2613 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002614 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002615 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002616
Benjamin Kramer569f2152012-01-10 11:50:18 +00002617 /// \name Bobcat
2618 /// Bobcat architecture processors.
2619 //@{
2620 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002621 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002622 //@}
2623
2624 /// \name Bulldozer
2625 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002626 //@{
2627 CK_BDVER1,
2628 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002629 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002630 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002631 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002632
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002633 /// This specification is deprecated and will be removed in the future.
2634 /// Users should prefer \see CK_K8.
2635 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002636 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002637 CK_x86_64,
2638 //@}
2639
2640 /// \name Geode
2641 /// Geode processors.
2642 //@{
2643 CK_Geode
2644 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002645 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002646
Eric Christopherc50738f2015-08-27 00:05:50 +00002647 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002648 return llvm::StringSwitch<CPUKind>(CPU)
2649 .Case("i386", CK_i386)
2650 .Case("i486", CK_i486)
2651 .Case("winchip-c6", CK_WinChipC6)
2652 .Case("winchip2", CK_WinChip2)
2653 .Case("c3", CK_C3)
2654 .Case("i586", CK_i586)
2655 .Case("pentium", CK_Pentium)
2656 .Case("pentium-mmx", CK_PentiumMMX)
2657 .Case("i686", CK_i686)
2658 .Case("pentiumpro", CK_PentiumPro)
2659 .Case("pentium2", CK_Pentium2)
2660 .Case("pentium3", CK_Pentium3)
2661 .Case("pentium3m", CK_Pentium3M)
2662 .Case("pentium-m", CK_PentiumM)
2663 .Case("c3-2", CK_C3_2)
2664 .Case("yonah", CK_Yonah)
2665 .Case("pentium4", CK_Pentium4)
2666 .Case("pentium4m", CK_Pentium4M)
2667 .Case("prescott", CK_Prescott)
2668 .Case("nocona", CK_Nocona)
2669 .Case("core2", CK_Core2)
2670 .Case("penryn", CK_Penryn)
2671 .Case("bonnell", CK_Bonnell)
2672 .Case("atom", CK_Bonnell) // Legacy name.
2673 .Case("silvermont", CK_Silvermont)
2674 .Case("slm", CK_Silvermont) // Legacy name.
2675 .Case("nehalem", CK_Nehalem)
2676 .Case("corei7", CK_Nehalem) // Legacy name.
2677 .Case("westmere", CK_Westmere)
2678 .Case("sandybridge", CK_SandyBridge)
2679 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2680 .Case("ivybridge", CK_IvyBridge)
2681 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2682 .Case("haswell", CK_Haswell)
2683 .Case("core-avx2", CK_Haswell) // Legacy name.
2684 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002685 .Case("skylake", CK_SkylakeClient)
2686 .Case("skylake-avx512", CK_SkylakeServer)
2687 .Case("skx", CK_SkylakeServer) // Legacy name.
2688 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002689 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002690 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002691 .Case("k6", CK_K6)
2692 .Case("k6-2", CK_K6_2)
2693 .Case("k6-3", CK_K6_3)
2694 .Case("athlon", CK_Athlon)
2695 .Case("athlon-tbird", CK_AthlonThunderbird)
2696 .Case("athlon-4", CK_Athlon4)
2697 .Case("athlon-xp", CK_AthlonXP)
2698 .Case("athlon-mp", CK_AthlonMP)
2699 .Case("athlon64", CK_Athlon64)
2700 .Case("athlon64-sse3", CK_Athlon64SSE3)
2701 .Case("athlon-fx", CK_AthlonFX)
2702 .Case("k8", CK_K8)
2703 .Case("k8-sse3", CK_K8SSE3)
2704 .Case("opteron", CK_Opteron)
2705 .Case("opteron-sse3", CK_OpteronSSE3)
2706 .Case("barcelona", CK_AMDFAM10)
2707 .Case("amdfam10", CK_AMDFAM10)
2708 .Case("btver1", CK_BTVER1)
2709 .Case("btver2", CK_BTVER2)
2710 .Case("bdver1", CK_BDVER1)
2711 .Case("bdver2", CK_BDVER2)
2712 .Case("bdver3", CK_BDVER3)
2713 .Case("bdver4", CK_BDVER4)
2714 .Case("x86-64", CK_x86_64)
2715 .Case("geode", CK_Geode)
2716 .Default(CK_Generic);
2717 }
2718
Rafael Espindolaeb265472013-08-21 21:59:03 +00002719 enum FPMathKind {
2720 FP_Default,
2721 FP_SSE,
2722 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002723 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002724
Eli Friedman3fd920a2008-08-20 02:34:37 +00002725public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002726 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2727 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002728 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002729 }
Craig Topper3164f332014-03-11 03:39:26 +00002730 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002731 // X87 evaluates with 80 bits "long double" precision.
2732 return SSELevel == NoSSE ? 2 : 0;
2733 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002734 ArrayRef<const char *> getGCCRegNames() const override {
2735 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002736 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002737 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2738 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002739 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002740 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2741 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002742 }
Eric Christopherd9832702015-06-29 21:00:05 +00002743 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002744 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002745 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002746
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002747 bool validateGlobalRegisterVariable(StringRef RegName,
2748 unsigned RegSize,
2749 bool &HasSizeMismatch) const override {
2750 // esp and ebp are the only 32-bit registers the x86 backend can currently
2751 // handle.
2752 if (RegName.equals("esp") || RegName.equals("ebp")) {
2753 // Check that the register size is 32-bit.
2754 HasSizeMismatch = RegSize != 32;
2755 return true;
2756 }
2757
2758 return false;
2759 }
2760
Akira Hatanaka974131e2014-09-18 18:17:18 +00002761 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2762
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002763 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2764
Akira Hatanaka974131e2014-09-18 18:17:18 +00002765 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2766
Craig Topper3164f332014-03-11 03:39:26 +00002767 std::string convertConstraint(const char *&Constraint) const override;
2768 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002769 return "~{dirflag},~{fpsr},~{flags}";
2770 }
Craig Topper3164f332014-03-11 03:39:26 +00002771 void getTargetDefines(const LangOptions &Opts,
2772 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002773 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2774 bool Enabled);
2775 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2776 bool Enabled);
2777 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2778 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002779 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2780 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002781 setFeatureEnabledImpl(Features, Name, Enabled);
2782 }
2783 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002784 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002785 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2786 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002787 bool
2788 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2789 StringRef CPU,
2790 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002791 bool hasFeature(StringRef Feature) const override;
2792 bool handleTargetFeatures(std::vector<std::string> &Features,
2793 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002794 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002795 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2796 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002797 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002798 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002799 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002800 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002801 return "no-mmx";
2802 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002803 }
Craig Topper3164f332014-03-11 03:39:26 +00002804 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002805 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002806
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002807 // Perform any per-CPU checks necessary to determine if this CPU is
2808 // acceptable.
2809 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2810 // invalid without explaining *why*.
2811 switch (CPU) {
2812 case CK_Generic:
2813 // No processor selected!
2814 return false;
2815
2816 case CK_i386:
2817 case CK_i486:
2818 case CK_WinChipC6:
2819 case CK_WinChip2:
2820 case CK_C3:
2821 case CK_i586:
2822 case CK_Pentium:
2823 case CK_PentiumMMX:
2824 case CK_i686:
2825 case CK_PentiumPro:
2826 case CK_Pentium2:
2827 case CK_Pentium3:
2828 case CK_Pentium3M:
2829 case CK_PentiumM:
2830 case CK_Yonah:
2831 case CK_C3_2:
2832 case CK_Pentium4:
2833 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002834 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002835 case CK_Prescott:
2836 case CK_K6:
2837 case CK_K6_2:
2838 case CK_K6_3:
2839 case CK_Athlon:
2840 case CK_AthlonThunderbird:
2841 case CK_Athlon4:
2842 case CK_AthlonXP:
2843 case CK_AthlonMP:
2844 case CK_Geode:
2845 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002846 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002847 return false;
2848
2849 // Fallthrough
2850 case CK_Nocona:
2851 case CK_Core2:
2852 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002853 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002854 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002855 case CK_Nehalem:
2856 case CK_Westmere:
2857 case CK_SandyBridge:
2858 case CK_IvyBridge:
2859 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002860 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002861 case CK_SkylakeClient:
2862 case CK_SkylakeServer:
2863 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002864 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002865 case CK_Athlon64:
2866 case CK_Athlon64SSE3:
2867 case CK_AthlonFX:
2868 case CK_K8:
2869 case CK_K8SSE3:
2870 case CK_Opteron:
2871 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002872 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002873 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002874 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002875 case CK_BDVER1:
2876 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002877 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002878 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002879 case CK_x86_64:
2880 return true;
2881 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002882 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002883 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002884
Craig Topper3164f332014-03-11 03:39:26 +00002885 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002886
Craig Topper3164f332014-03-11 03:39:26 +00002887 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002888 // Most of the non-ARM calling conventions are i386 conventions.
2889 switch (CC) {
2890 case CC_X86ThisCall:
2891 case CC_X86FastCall:
2892 case CC_X86StdCall:
2893 case CC_X86VectorCall:
2894 case CC_C:
2895 case CC_Swift:
2896 case CC_X86Pascal:
2897 case CC_IntelOclBicc:
2898 return CCCR_OK;
2899 default:
2900 return CCCR_Warning;
2901 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002902 }
2903
Craig Topper3164f332014-03-11 03:39:26 +00002904 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002905 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002906 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002907
2908 bool hasSjLjLowering() const override {
2909 return true;
2910 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002911
2912 void setSupportedOpenCLOpts() override {
2913 getSupportedOpenCLOpts().setAll();
2914 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002915};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002916
Rafael Espindolaeb265472013-08-21 21:59:03 +00002917bool X86TargetInfo::setFPMath(StringRef Name) {
2918 if (Name == "387") {
2919 FPMath = FP_387;
2920 return true;
2921 }
2922 if (Name == "sse") {
2923 FPMath = FP_SSE;
2924 return true;
2925 }
2926 return false;
2927}
2928
Eric Christopher007b0a02015-08-28 22:32:01 +00002929bool X86TargetInfo::initFeatureMap(
2930 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002931 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002932 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002933 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002934 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002935 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002936
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002937 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002938
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002939 // Enable X87 for all X86 processors but Lakemont.
2940 if (Kind != CK_Lakemont)
2941 setFeatureEnabledImpl(Features, "x87", true);
2942
2943 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002944 case CK_Generic:
2945 case CK_i386:
2946 case CK_i486:
2947 case CK_i586:
2948 case CK_Pentium:
2949 case CK_i686:
2950 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002951 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002952 break;
2953 case CK_PentiumMMX:
2954 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002955 case CK_K6:
2956 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002957 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002958 break;
2959 case CK_Pentium3:
2960 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002961 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002962 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002963 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002964 break;
2965 case CK_PentiumM:
2966 case CK_Pentium4:
2967 case CK_Pentium4M:
2968 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002969 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002970 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002971 break;
2972 case CK_Yonah:
2973 case CK_Prescott:
2974 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002975 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002976 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002977 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002978 break;
2979 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002980 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002981 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002982 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002983 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002984 break;
2985 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002986 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002987 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002988 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002989 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002990 case CK_Cannonlake:
2991 setFeatureEnabledImpl(Features, "avx512ifma", true);
2992 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2993 setFeatureEnabledImpl(Features, "sha", true);
2994 setFeatureEnabledImpl(Features, "umip", true);
2995 // FALLTHROUGH
2996 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002997 setFeatureEnabledImpl(Features, "avx512f", true);
2998 setFeatureEnabledImpl(Features, "avx512cd", true);
2999 setFeatureEnabledImpl(Features, "avx512dq", true);
3000 setFeatureEnabledImpl(Features, "avx512bw", true);
3001 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003002 setFeatureEnabledImpl(Features, "pku", true);
3003 setFeatureEnabledImpl(Features, "pcommit", true);
3004 setFeatureEnabledImpl(Features, "clwb", true);
3005 // FALLTHROUGH
3006 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003007 setFeatureEnabledImpl(Features, "xsavec", true);
3008 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003009 setFeatureEnabledImpl(Features, "mpx", true);
3010 setFeatureEnabledImpl(Features, "sgx", true);
3011 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003012 // FALLTHROUGH
3013 case CK_Broadwell:
3014 setFeatureEnabledImpl(Features, "rdseed", true);
3015 setFeatureEnabledImpl(Features, "adx", true);
3016 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003017 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003018 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003019 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003020 setFeatureEnabledImpl(Features, "bmi", true);
3021 setFeatureEnabledImpl(Features, "bmi2", true);
3022 setFeatureEnabledImpl(Features, "rtm", true);
3023 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003024 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003025 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003026 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003027 setFeatureEnabledImpl(Features, "rdrnd", true);
3028 setFeatureEnabledImpl(Features, "f16c", true);
3029 setFeatureEnabledImpl(Features, "fsgsbase", true);
3030 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003031 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003032 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003033 setFeatureEnabledImpl(Features, "xsave", true);
3034 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003035 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003036 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003037 case CK_Silvermont:
3038 setFeatureEnabledImpl(Features, "aes", true);
3039 setFeatureEnabledImpl(Features, "pclmul", true);
3040 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003041 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003042 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003043 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003044 setFeatureEnabledImpl(Features, "cx16", true);
3045 break;
3046 case CK_KNL:
3047 setFeatureEnabledImpl(Features, "avx512f", true);
3048 setFeatureEnabledImpl(Features, "avx512cd", true);
3049 setFeatureEnabledImpl(Features, "avx512er", true);
3050 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003051 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003052 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003053 setFeatureEnabledImpl(Features, "rdseed", true);
3054 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003055 setFeatureEnabledImpl(Features, "lzcnt", true);
3056 setFeatureEnabledImpl(Features, "bmi", true);
3057 setFeatureEnabledImpl(Features, "bmi2", true);
3058 setFeatureEnabledImpl(Features, "rtm", true);
3059 setFeatureEnabledImpl(Features, "fma", true);
3060 setFeatureEnabledImpl(Features, "rdrnd", true);
3061 setFeatureEnabledImpl(Features, "f16c", true);
3062 setFeatureEnabledImpl(Features, "fsgsbase", true);
3063 setFeatureEnabledImpl(Features, "aes", true);
3064 setFeatureEnabledImpl(Features, "pclmul", true);
3065 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003066 setFeatureEnabledImpl(Features, "xsaveopt", true);
3067 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003068 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003069 break;
3070 case CK_K6_2:
3071 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003072 case CK_WinChip2:
3073 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003074 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003075 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003076 case CK_Athlon:
3077 case CK_AthlonThunderbird:
3078 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003079 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003080 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003081 case CK_Athlon4:
3082 case CK_AthlonXP:
3083 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003084 setFeatureEnabledImpl(Features, "sse", true);
3085 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003086 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003087 break;
3088 case CK_K8:
3089 case CK_Opteron:
3090 case CK_Athlon64:
3091 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003092 setFeatureEnabledImpl(Features, "sse2", true);
3093 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003094 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003095 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003096 case CK_AMDFAM10:
3097 setFeatureEnabledImpl(Features, "sse4a", true);
3098 setFeatureEnabledImpl(Features, "lzcnt", true);
3099 setFeatureEnabledImpl(Features, "popcnt", true);
3100 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003101 case CK_K8SSE3:
3102 case CK_OpteronSSE3:
3103 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003104 setFeatureEnabledImpl(Features, "sse3", true);
3105 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003106 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003107 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003108 case CK_BTVER2:
3109 setFeatureEnabledImpl(Features, "avx", true);
3110 setFeatureEnabledImpl(Features, "aes", true);
3111 setFeatureEnabledImpl(Features, "pclmul", true);
3112 setFeatureEnabledImpl(Features, "bmi", true);
3113 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003114 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003115 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003116 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003117 setFeatureEnabledImpl(Features, "ssse3", true);
3118 setFeatureEnabledImpl(Features, "sse4a", true);
3119 setFeatureEnabledImpl(Features, "lzcnt", true);
3120 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003121 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003122 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003123 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003124 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003125 case CK_BDVER4:
3126 setFeatureEnabledImpl(Features, "avx2", true);
3127 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003128 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003129 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003130 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003131 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003132 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003133 // FALLTHROUGH
3134 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003135 setFeatureEnabledImpl(Features, "bmi", true);
3136 setFeatureEnabledImpl(Features, "fma", true);
3137 setFeatureEnabledImpl(Features, "f16c", true);
3138 setFeatureEnabledImpl(Features, "tbm", true);
3139 // FALLTHROUGH
3140 case CK_BDVER1:
3141 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003142 setFeatureEnabledImpl(Features, "xop", true);
3143 setFeatureEnabledImpl(Features, "lzcnt", true);
3144 setFeatureEnabledImpl(Features, "aes", true);
3145 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003146 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003147 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003148 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003149 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003150 break;
Eli Friedman33465822011-07-08 23:31:17 +00003151 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003152 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3153 return false;
3154
3155 // Can't do this earlier because we need to be able to explicitly enable
3156 // or disable these features and the things that they depend upon.
3157
3158 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3159 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003160 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003161 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3162 FeaturesVec.end())
3163 Features["popcnt"] = true;
3164
3165 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3166 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003167 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003168 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3169 FeaturesVec.end())
3170 Features["prfchw"] = true;
3171
Eric Christophera7260af2015-10-08 20:10:18 +00003172 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3173 // then enable MMX.
3174 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003175 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003176 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3177 FeaturesVec.end())
3178 Features["mmx"] = true;
3179
Eric Christopherbbd746d2015-10-08 20:10:14 +00003180 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003181}
3182
Rafael Espindolae62e2792013-08-20 13:44:29 +00003183void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003184 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003185 if (Enabled) {
3186 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003187 case AVX512F:
3188 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003189 case AVX2:
3190 Features["avx2"] = true;
3191 case AVX:
3192 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003193 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003194 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003195 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003196 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003197 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003198 case SSSE3:
3199 Features["ssse3"] = true;
3200 case SSE3:
3201 Features["sse3"] = true;
3202 case SSE2:
3203 Features["sse2"] = true;
3204 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003205 Features["sse"] = true;
3206 case NoSSE:
3207 break;
3208 }
3209 return;
3210 }
3211
3212 switch (Level) {
3213 case NoSSE:
3214 case SSE1:
3215 Features["sse"] = false;
3216 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003217 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3218 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003219 case SSE3:
3220 Features["sse3"] = false;
3221 setXOPLevel(Features, NoXOP, false);
3222 case SSSE3:
3223 Features["ssse3"] = false;
3224 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003225 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003226 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003227 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003228 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003229 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3230 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003231 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003232 case AVX2:
3233 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003234 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003235 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003236 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003237 Features["avx512vl"] = Features["avx512vbmi"] =
3238 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003239 }
3240}
3241
3242void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003243 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003244 if (Enabled) {
3245 switch (Level) {
3246 case AMD3DNowAthlon:
3247 Features["3dnowa"] = true;
3248 case AMD3DNow:
3249 Features["3dnow"] = true;
3250 case MMX:
3251 Features["mmx"] = true;
3252 case NoMMX3DNow:
3253 break;
3254 }
3255 return;
3256 }
3257
3258 switch (Level) {
3259 case NoMMX3DNow:
3260 case MMX:
3261 Features["mmx"] = false;
3262 case AMD3DNow:
3263 Features["3dnow"] = false;
3264 case AMD3DNowAthlon:
3265 Features["3dnowa"] = false;
3266 }
3267}
3268
3269void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003270 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003271 if (Enabled) {
3272 switch (Level) {
3273 case XOP:
3274 Features["xop"] = true;
3275 case FMA4:
3276 Features["fma4"] = true;
3277 setSSELevel(Features, AVX, true);
3278 case SSE4A:
3279 Features["sse4a"] = true;
3280 setSSELevel(Features, SSE3, true);
3281 case NoXOP:
3282 break;
3283 }
3284 return;
3285 }
3286
3287 switch (Level) {
3288 case NoXOP:
3289 case SSE4A:
3290 Features["sse4a"] = false;
3291 case FMA4:
3292 Features["fma4"] = false;
3293 case XOP:
3294 Features["xop"] = false;
3295 }
3296}
3297
Craig Topper86d79ef2013-09-17 04:51:29 +00003298void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3299 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003300 // This is a bit of a hack to deal with the sse4 target feature when used
3301 // as part of the target attribute. We handle sse4 correctly everywhere
3302 // else. See below for more information on how we handle the sse4 options.
3303 if (Name != "sse4")
3304 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003305
Craig Topper29561122013-09-19 01:13:07 +00003306 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003307 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003308 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003309 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003310 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003311 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003312 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003313 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003314 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003315 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003316 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003317 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003318 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003319 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003320 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003321 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003322 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003323 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003324 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003325 if (Enabled)
3326 setSSELevel(Features, SSE2, Enabled);
3327 } else if (Name == "pclmul") {
3328 if (Enabled)
3329 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003330 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003331 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003332 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003333 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003334 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003335 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003336 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3337 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3338 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003339 if (Enabled)
3340 setSSELevel(Features, AVX512F, Enabled);
3341 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003342 if (Enabled)
3343 setSSELevel(Features, AVX, Enabled);
3344 } else if (Name == "fma4") {
3345 setXOPLevel(Features, FMA4, Enabled);
3346 } else if (Name == "xop") {
3347 setXOPLevel(Features, XOP, Enabled);
3348 } else if (Name == "sse4a") {
3349 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003350 } else if (Name == "f16c") {
3351 if (Enabled)
3352 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003353 } else if (Name == "sha") {
3354 if (Enabled)
3355 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003356 } else if (Name == "sse4") {
3357 // We can get here via the __target__ attribute since that's not controlled
3358 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3359 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3360 // disabled.
3361 if (Enabled)
3362 setSSELevel(Features, SSE42, Enabled);
3363 else
3364 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003365 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003366 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003367 Features["xsaveopt"] = false;
3368 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003369 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003370 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003371 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003372}
3373
Eric Christopher3ff21b32013-10-16 21:26:26 +00003374/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003375/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003376bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003377 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003378 for (const auto &Feature : Features) {
3379 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003380 continue;
3381
Eric Christopher610fe112015-08-26 08:21:55 +00003382 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003383 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003384 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003385 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003386 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003387 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003388 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003389 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003390 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003391 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003392 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003393 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003394 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003395 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003396 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003397 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003398 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003399 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003400 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003401 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003402 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003403 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003404 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003405 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003406 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003407 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003408 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003409 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003410 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003411 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003412 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003413 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003414 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003415 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003416 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003417 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003418 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003419 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003420 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003421 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003422 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003423 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003424 } else if (Feature == "+avx512vbmi") {
3425 HasAVX512VBMI = true;
3426 } else if (Feature == "+avx512ifma") {
3427 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003428 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003429 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003430 } else if (Feature == "+mpx") {
3431 HasMPX = true;
3432 } else if (Feature == "+movbe") {
3433 HasMOVBE = true;
3434 } else if (Feature == "+sgx") {
3435 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003436 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003437 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003438 } else if (Feature == "+fxsr") {
3439 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003440 } else if (Feature == "+xsave") {
3441 HasXSAVE = true;
3442 } else if (Feature == "+xsaveopt") {
3443 HasXSAVEOPT = true;
3444 } else if (Feature == "+xsavec") {
3445 HasXSAVEC = true;
3446 } else if (Feature == "+xsaves") {
3447 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003448 } else if (Feature == "+mwaitx") {
3449 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003450 } else if (Feature == "+pku") {
3451 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003452 } else if (Feature == "+clflushopt") {
3453 HasCLFLUSHOPT = true;
3454 } else if (Feature == "+pcommit") {
3455 HasPCOMMIT = true;
3456 } else if (Feature == "+clwb") {
3457 HasCLWB = true;
3458 } else if (Feature == "+umip") {
3459 HasUMIP = true;
3460 } else if (Feature == "+prefetchwt1") {
3461 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003462 }
3463
Benjamin Kramer27402c62012-03-05 15:10:44 +00003464 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003465 .Case("+avx512f", AVX512F)
3466 .Case("+avx2", AVX2)
3467 .Case("+avx", AVX)
3468 .Case("+sse4.2", SSE42)
3469 .Case("+sse4.1", SSE41)
3470 .Case("+ssse3", SSSE3)
3471 .Case("+sse3", SSE3)
3472 .Case("+sse2", SSE2)
3473 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003474 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003475 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003476
Eli Friedman33465822011-07-08 23:31:17 +00003477 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003478 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003479 .Case("+3dnowa", AMD3DNowAthlon)
3480 .Case("+3dnow", AMD3DNow)
3481 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003482 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003483 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003484
3485 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003486 .Case("+xop", XOP)
3487 .Case("+fma4", FMA4)
3488 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003489 .Default(NoXOP);
3490 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003491 }
Eli Friedman33465822011-07-08 23:31:17 +00003492
Rafael Espindolaeb265472013-08-21 21:59:03 +00003493 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3494 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003495 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3496 (FPMath == FP_387 && SSELevel >= SSE1)) {
3497 Diags.Report(diag::err_target_unsupported_fpmath) <<
3498 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003499 return false;
3500 }
3501
Alexey Bataev00396512015-07-02 03:40:19 +00003502 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003503 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003504 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003505}
Chris Lattnerecd49032009-03-02 22:27:17 +00003506
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003507/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3508/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003509void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003510 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003511 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003512 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003513 Builder.defineMacro("__amd64__");
3514 Builder.defineMacro("__amd64");
3515 Builder.defineMacro("__x86_64");
3516 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003517 if (getTriple().getArchName() == "x86_64h") {
3518 Builder.defineMacro("__x86_64h");
3519 Builder.defineMacro("__x86_64h__");
3520 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003521 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003522 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003523 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003524
Chris Lattnerecd49032009-03-02 22:27:17 +00003525 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003526 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3527 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003528 switch (CPU) {
3529 case CK_Generic:
3530 break;
3531 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003532 // The rest are coming from the i386 define above.
3533 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003534 break;
3535 case CK_i486:
3536 case CK_WinChipC6:
3537 case CK_WinChip2:
3538 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003539 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003540 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003541 case CK_PentiumMMX:
3542 Builder.defineMacro("__pentium_mmx__");
3543 Builder.defineMacro("__tune_pentium_mmx__");
3544 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003545 case CK_i586:
3546 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003547 defineCPUMacros(Builder, "i586");
3548 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003549 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003550 case CK_Pentium3:
3551 case CK_Pentium3M:
3552 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003553 Builder.defineMacro("__tune_pentium3__");
3554 // Fallthrough
3555 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003556 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003557 Builder.defineMacro("__tune_pentium2__");
3558 // Fallthrough
3559 case CK_PentiumPro:
3560 Builder.defineMacro("__tune_i686__");
3561 Builder.defineMacro("__tune_pentiumpro__");
3562 // Fallthrough
3563 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003564 Builder.defineMacro("__i686");
3565 Builder.defineMacro("__i686__");
3566 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3567 Builder.defineMacro("__pentiumpro");
3568 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003569 break;
3570 case CK_Pentium4:
3571 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003572 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003573 break;
3574 case CK_Yonah:
3575 case CK_Prescott:
3576 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003577 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003578 break;
3579 case CK_Core2:
3580 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003581 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003582 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003583 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003584 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003585 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003586 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003587 defineCPUMacros(Builder, "slm");
3588 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003589 case CK_Nehalem:
3590 case CK_Westmere:
3591 case CK_SandyBridge:
3592 case CK_IvyBridge:
3593 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003594 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003595 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003596 // FIXME: Historically, we defined this legacy name, it would be nice to
3597 // remove it at some point. We've never exposed fine-grained names for
3598 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003599 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003600 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003601 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003602 defineCPUMacros(Builder, "skx");
3603 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003604 case CK_Cannonlake:
3605 break;
Craig Topper449314e2013-08-20 07:09:39 +00003606 case CK_KNL:
3607 defineCPUMacros(Builder, "knl");
3608 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003609 case CK_Lakemont:
3610 Builder.defineMacro("__tune_lakemont__");
3611 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003612 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003613 Builder.defineMacro("__k6_2__");
3614 Builder.defineMacro("__tune_k6_2__");
3615 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003616 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003617 if (CPU != CK_K6_2) { // In case of fallthrough
3618 // FIXME: GCC may be enabling these in cases where some other k6
3619 // architecture is specified but -m3dnow is explicitly provided. The
3620 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003621 Builder.defineMacro("__k6_3__");
3622 Builder.defineMacro("__tune_k6_3__");
3623 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003624 // Fallthrough
3625 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003626 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003627 break;
3628 case CK_Athlon:
3629 case CK_AthlonThunderbird:
3630 case CK_Athlon4:
3631 case CK_AthlonXP:
3632 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003633 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003634 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003635 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003636 Builder.defineMacro("__tune_athlon_sse__");
3637 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003638 break;
3639 case CK_K8:
3640 case CK_K8SSE3:
3641 case CK_x86_64:
3642 case CK_Opteron:
3643 case CK_OpteronSSE3:
3644 case CK_Athlon64:
3645 case CK_Athlon64SSE3:
3646 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003647 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003648 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003649 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003650 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003651 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003652 case CK_BTVER1:
3653 defineCPUMacros(Builder, "btver1");
3654 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003655 case CK_BTVER2:
3656 defineCPUMacros(Builder, "btver2");
3657 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003658 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003659 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003660 break;
3661 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003662 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003663 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003664 case CK_BDVER3:
3665 defineCPUMacros(Builder, "bdver3");
3666 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003667 case CK_BDVER4:
3668 defineCPUMacros(Builder, "bdver4");
3669 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003670 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003671 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003672 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003673 }
Chris Lattner96e43572009-03-02 22:40:39 +00003674
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003675 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003676 Builder.defineMacro("__REGISTER_PREFIX__", "");
3677
Chris Lattner6df41af2009-04-19 17:32:33 +00003678 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3679 // functions in glibc header files that use FP Stack inline asm which the
3680 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003681 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003682
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003683 if (HasAES)
3684 Builder.defineMacro("__AES__");
3685
Craig Topper3f122a72012-05-31 05:18:48 +00003686 if (HasPCLMUL)
3687 Builder.defineMacro("__PCLMUL__");
3688
Craig Topper22967d42011-12-25 05:06:45 +00003689 if (HasLZCNT)
3690 Builder.defineMacro("__LZCNT__");
3691
Benjamin Kramer1e250392012-07-07 09:39:18 +00003692 if (HasRDRND)
3693 Builder.defineMacro("__RDRND__");
3694
Craig Topper8c7f2512014-11-03 06:51:41 +00003695 if (HasFSGSBASE)
3696 Builder.defineMacro("__FSGSBASE__");
3697
Craig Topper22967d42011-12-25 05:06:45 +00003698 if (HasBMI)
3699 Builder.defineMacro("__BMI__");
3700
3701 if (HasBMI2)
3702 Builder.defineMacro("__BMI2__");
3703
Craig Topper1de83482011-12-29 16:10:46 +00003704 if (HasPOPCNT)
3705 Builder.defineMacro("__POPCNT__");
3706
Michael Liao625a8752012-11-10 05:17:46 +00003707 if (HasRTM)
3708 Builder.defineMacro("__RTM__");
3709
Michael Liao74f4eaf2013-03-26 17:52:08 +00003710 if (HasPRFCHW)
3711 Builder.defineMacro("__PRFCHW__");
3712
Michael Liaoffaae352013-03-29 05:17:55 +00003713 if (HasRDSEED)
3714 Builder.defineMacro("__RDSEED__");
3715
Robert Khasanov50e6f582014-09-19 09:53:48 +00003716 if (HasADX)
3717 Builder.defineMacro("__ADX__");
3718
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003719 if (HasTBM)
3720 Builder.defineMacro("__TBM__");
3721
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003722 if (HasMWAITX)
3723 Builder.defineMacro("__MWAITX__");
3724
Rafael Espindolae62e2792013-08-20 13:44:29 +00003725 switch (XOPLevel) {
3726 case XOP:
3727 Builder.defineMacro("__XOP__");
3728 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003729 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003730 case SSE4A:
3731 Builder.defineMacro("__SSE4A__");
3732 case NoXOP:
3733 break;
3734 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003735
Craig Topperbba778b2012-06-03 21:46:30 +00003736 if (HasFMA)
3737 Builder.defineMacro("__FMA__");
3738
Manman Rena45358c2012-10-11 00:59:55 +00003739 if (HasF16C)
3740 Builder.defineMacro("__F16C__");
3741
Craig Topper679b53a2013-08-21 05:29:10 +00003742 if (HasAVX512CD)
3743 Builder.defineMacro("__AVX512CD__");
3744 if (HasAVX512ER)
3745 Builder.defineMacro("__AVX512ER__");
3746 if (HasAVX512PF)
3747 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003748 if (HasAVX512DQ)
3749 Builder.defineMacro("__AVX512DQ__");
3750 if (HasAVX512BW)
3751 Builder.defineMacro("__AVX512BW__");
3752 if (HasAVX512VL)
3753 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003754 if (HasAVX512VBMI)
3755 Builder.defineMacro("__AVX512VBMI__");
3756 if (HasAVX512IFMA)
3757 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003758
Ben Langmuir58078d02013-09-19 13:22:04 +00003759 if (HasSHA)
3760 Builder.defineMacro("__SHA__");
3761
Craig Toppere33f51f2015-10-16 06:22:36 +00003762 if (HasFXSR)
3763 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003764 if (HasXSAVE)
3765 Builder.defineMacro("__XSAVE__");
3766 if (HasXSAVEOPT)
3767 Builder.defineMacro("__XSAVEOPT__");
3768 if (HasXSAVEC)
3769 Builder.defineMacro("__XSAVEC__");
3770 if (HasXSAVES)
3771 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003772 if (HasPKU)
3773 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003774 if (HasCX16)
3775 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3776
Chris Lattner96e43572009-03-02 22:40:39 +00003777 // Each case falls through to the previous one here.
3778 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003779 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003780 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003781 case AVX2:
3782 Builder.defineMacro("__AVX2__");
3783 case AVX:
3784 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003785 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003786 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003787 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003788 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003789 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003790 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003791 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003792 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003793 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003794 Builder.defineMacro("__SSE2__");
3795 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003796 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003797 Builder.defineMacro("__SSE__");
3798 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003799 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003800 break;
3801 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003802
Derek Schuffc7dd7222012-10-11 15:52:22 +00003803 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003804 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003805 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003806 case AVX2:
3807 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003808 case SSE42:
3809 case SSE41:
3810 case SSSE3:
3811 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003812 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003813 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003814 break;
3815 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003816 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003817 break;
3818 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003819 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003820 }
3821 }
3822
Anders Carlssone437c682010-01-27 03:47:49 +00003823 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003824 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003825 case AMD3DNowAthlon:
3826 Builder.defineMacro("__3dNOW_A__");
3827 case AMD3DNow:
3828 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003829 case MMX:
3830 Builder.defineMacro("__MMX__");
3831 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003832 break;
3833 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003834
3835 if (CPU >= CK_i486) {
3836 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3837 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3838 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3839 }
3840 if (CPU >= CK_i586)
3841 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003842}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003843
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003844bool X86TargetInfo::hasFeature(StringRef Feature) const {
3845 return llvm::StringSwitch<bool>(Feature)
3846 .Case("aes", HasAES)
3847 .Case("avx", SSELevel >= AVX)
3848 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003849 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003850 .Case("avx512cd", HasAVX512CD)
3851 .Case("avx512er", HasAVX512ER)
3852 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003853 .Case("avx512dq", HasAVX512DQ)
3854 .Case("avx512bw", HasAVX512BW)
3855 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003856 .Case("avx512vbmi", HasAVX512VBMI)
3857 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003858 .Case("bmi", HasBMI)
3859 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003860 .Case("clflushopt", HasCLFLUSHOPT)
3861 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003862 .Case("cx16", HasCX16)
3863 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003864 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003865 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003866 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003867 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003868 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003869 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3870 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3871 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003872 .Case("movbe", HasMOVBE)
3873 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003874 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003875 .Case("pcommit", HasPCOMMIT)
3876 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003877 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003878 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003879 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003880 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003881 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003882 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003883 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003884 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003885 .Case("sse", SSELevel >= SSE1)
3886 .Case("sse2", SSELevel >= SSE2)
3887 .Case("sse3", SSELevel >= SSE3)
3888 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003889 .Case("sse4.1", SSELevel >= SSE41)
3890 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003891 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003892 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003893 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003894 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003895 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3896 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003897 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003898 .Case("xsave", HasXSAVE)
3899 .Case("xsavec", HasXSAVEC)
3900 .Case("xsaves", HasXSAVES)
3901 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003902 .Default(false);
3903}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003904
Eric Christopherd9832702015-06-29 21:00:05 +00003905// We can't use a generic validation scheme for the features accepted here
3906// versus subtarget features accepted in the target attribute because the
3907// bitfield structure that's initialized in the runtime only supports the
3908// below currently rather than the full range of subtarget features. (See
3909// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3910bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3911 return llvm::StringSwitch<bool>(FeatureStr)
3912 .Case("cmov", true)
3913 .Case("mmx", true)
3914 .Case("popcnt", true)
3915 .Case("sse", true)
3916 .Case("sse2", true)
3917 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003918 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003919 .Case("sse4.1", true)
3920 .Case("sse4.2", true)
3921 .Case("avx", true)
3922 .Case("avx2", true)
3923 .Case("sse4a", true)
3924 .Case("fma4", true)
3925 .Case("xop", true)
3926 .Case("fma", true)
3927 .Case("avx512f", true)
3928 .Case("bmi", true)
3929 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003930 .Case("aes", true)
3931 .Case("pclmul", true)
3932 .Case("avx512vl", true)
3933 .Case("avx512bw", true)
3934 .Case("avx512dq", true)
3935 .Case("avx512cd", true)
3936 .Case("avx512er", true)
3937 .Case("avx512pf", true)
3938 .Case("avx512vbmi", true)
3939 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003940 .Default(false);
3941}
3942
Eli Friedman3fd920a2008-08-20 02:34:37 +00003943bool
Anders Carlsson58436352009-02-28 17:11:49 +00003944X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003945 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003946 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003947 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003948 // Constant constraints.
3949 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3950 // instructions.
3951 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3952 // x86_64 instructions.
3953 case 's':
3954 Info.setRequiresImmediate();
3955 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003956 case 'I':
3957 Info.setRequiresImmediate(0, 31);
3958 return true;
3959 case 'J':
3960 Info.setRequiresImmediate(0, 63);
3961 return true;
3962 case 'K':
3963 Info.setRequiresImmediate(-128, 127);
3964 return true;
3965 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003966 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003967 return true;
3968 case 'M':
3969 Info.setRequiresImmediate(0, 3);
3970 return true;
3971 case 'N':
3972 Info.setRequiresImmediate(0, 255);
3973 return true;
3974 case 'O':
3975 Info.setRequiresImmediate(0, 127);
3976 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003977 // Register constraints.
3978 case 'Y': // 'Y' is the first character for several 2-character constraints.
3979 // Shift the pointer to the second character of the constraint.
3980 Name++;
3981 switch (*Name) {
3982 default:
3983 return false;
3984 case '0': // First SSE register.
3985 case 't': // Any SSE register, when SSE2 is enabled.
3986 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3987 case 'm': // Any MMX register, when inter-unit moves enabled.
3988 Info.setAllowsRegister();
3989 return true;
3990 }
3991 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003992 // Constraint 'f' cannot be used for output operands.
3993 if (Info.ConstraintStr[0] == '=')
3994 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003995 Info.setAllowsRegister();
3996 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003997 case 'a': // eax.
3998 case 'b': // ebx.
3999 case 'c': // ecx.
4000 case 'd': // edx.
4001 case 'S': // esi.
4002 case 'D': // edi.
4003 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004004 case 't': // Top of floating point stack.
4005 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004006 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004007 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004008 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004009 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004010 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4011 case 'l': // "Index" registers: any general register that can be used as an
4012 // index in a base+index memory access.
4013 Info.setAllowsRegister();
4014 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004015 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004016 case 'C': // SSE floating point constant.
4017 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004018 return true;
4019 }
4020}
4021
Akira Hatanaka974131e2014-09-18 18:17:18 +00004022bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4023 unsigned Size) const {
4024 // Strip off constraint modifiers.
4025 while (Constraint[0] == '=' ||
4026 Constraint[0] == '+' ||
4027 Constraint[0] == '&')
4028 Constraint = Constraint.substr(1);
4029
4030 return validateOperandSize(Constraint, Size);
4031}
4032
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004033bool X86TargetInfo::validateInputSize(StringRef Constraint,
4034 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004035 return validateOperandSize(Constraint, Size);
4036}
4037
4038bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4039 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004040 switch (Constraint[0]) {
4041 default: break;
4042 case 'y':
4043 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004044 case 'f':
4045 case 't':
4046 case 'u':
4047 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00004048 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004049 if (SSELevel >= AVX512F)
4050 // 512-bit zmm registers can be used if target supports AVX512F.
4051 return Size <= 512U;
4052 else if (SSELevel >= AVX)
4053 // 256-bit ymm registers can be used if target supports AVX.
4054 return Size <= 256U;
4055 return Size <= 128U;
4056 case 'Y':
4057 // 'Y' is the first character for several 2-character constraints.
4058 switch (Constraint[1]) {
4059 default: break;
4060 case 'm':
4061 // 'Ym' is synonymous with 'y'.
4062 return Size <= 64;
4063 case 'i':
4064 case 't':
4065 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4066 if (SSELevel >= AVX512F)
4067 return Size <= 512U;
4068 else if (SSELevel >= AVX)
4069 return Size <= 256U;
4070 return SSELevel >= SSE2 && Size <= 128U;
4071 }
4072
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004073 }
4074
4075 return true;
4076}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004077
Eli Friedman3fd920a2008-08-20 02:34:37 +00004078std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004079X86TargetInfo::convertConstraint(const char *&Constraint) const {
4080 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004081 case 'a': return std::string("{ax}");
4082 case 'b': return std::string("{bx}");
4083 case 'c': return std::string("{cx}");
4084 case 'd': return std::string("{dx}");
4085 case 'S': return std::string("{si}");
4086 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004087 case 'p': // address
4088 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004089 case 't': // top of floating point stack.
4090 return std::string("{st}");
4091 case 'u': // second from top of floating point stack.
4092 return std::string("{st(1)}"); // second from top of floating point stack.
4093 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004094 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004095 }
4096}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004097
Eli Friedman3fd920a2008-08-20 02:34:37 +00004098// X86-32 generic target
4099class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004100public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004101 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4102 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004103 DoubleAlign = LongLongAlign = 32;
4104 LongDoubleWidth = 96;
4105 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004106 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004107 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004108 SizeType = UnsignedInt;
4109 PtrDiffType = SignedInt;
4110 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004111 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004112
4113 // Use fpret for all types.
4114 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4115 (1 << TargetInfo::Double) |
4116 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004117
4118 // x86-32 has atomics up to 8 bytes
4119 // FIXME: Check that we actually have cmpxchg8b before setting
4120 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4121 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004122 }
Craig Topper3164f332014-03-11 03:39:26 +00004123 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004124 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004125 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004126
Craig Topper3164f332014-03-11 03:39:26 +00004127 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004128 if (RegNo == 0) return 0;
4129 if (RegNo == 1) return 2;
4130 return -1;
4131 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004132 bool validateOperandSize(StringRef Constraint,
4133 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004134 switch (Constraint[0]) {
4135 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004136 case 'R':
4137 case 'q':
4138 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004139 case 'a':
4140 case 'b':
4141 case 'c':
4142 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004143 case 'S':
4144 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004145 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004146 case 'A':
4147 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004148 }
4149
Akira Hatanaka974131e2014-09-18 18:17:18 +00004150 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004151 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004152 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4153 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4154 Builtin::FirstTSBuiltin + 1);
4155 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004156};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004157
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004158class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4159public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004160 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4161 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004162
Craig Topper3164f332014-03-11 03:39:26 +00004163 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004164 unsigned Major, Minor, Micro;
4165 getTriple().getOSVersion(Major, Minor, Micro);
4166 // New NetBSD uses the default rounding mode.
4167 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4168 return X86_32TargetInfo::getFloatEvalMethod();
4169 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004170 return 1;
4171 }
4172};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004173
Eli Friedmane3aa4542009-07-05 18:47:56 +00004174class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4175public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004176 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4177 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004178 SizeType = UnsignedLong;
4179 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004180 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004181 }
4182};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004183
Eli Friedman9fa28852012-08-08 23:57:20 +00004184class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4185public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004186 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4187 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004188 SizeType = UnsignedLong;
4189 IntPtrType = SignedLong;
4190 PtrDiffType = SignedLong;
4191 }
4192};
Eli Friedman9fa28852012-08-08 23:57:20 +00004193
Torok Edwinb2b37c62009-06-30 17:10:35 +00004194class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004195public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004196 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4197 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004198 LongDoubleWidth = 128;
4199 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004200 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004201 MaxVectorAlign = 256;
4202 // The watchOS simulator uses the builtin bool type for Objective-C.
4203 llvm::Triple T = llvm::Triple(Triple);
4204 if (T.isWatchOS())
4205 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004206 SizeType = UnsignedLong;
4207 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004208 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004209 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004210 }
4211
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004212 bool handleTargetFeatures(std::vector<std::string> &Features,
4213 DiagnosticsEngine &Diags) override {
4214 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4215 Diags))
4216 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004217 // We now know the features we have: we can decide how to align vectors.
4218 MaxVectorAlign =
4219 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004220 return true;
4221 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004222};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004223
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004224// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004225class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004226public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004227 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4228 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004229 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004230 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004231 bool IsWinCOFF =
4232 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004233 resetDataLayout(IsWinCOFF
4234 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4235 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004236 }
Craig Topper3164f332014-03-11 03:39:26 +00004237 void getTargetDefines(const LangOptions &Opts,
4238 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004239 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4240 }
4241};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004242
4243// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004244class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004245public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004246 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4247 const TargetOptions &Opts)
4248 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004249 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004250 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4251 }
Craig Topper3164f332014-03-11 03:39:26 +00004252 void getTargetDefines(const LangOptions &Opts,
4253 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004254 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4255 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4256 // The value of the following reflects processor type.
4257 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4258 // We lost the original triple, so we use the default.
4259 Builder.defineMacro("_M_IX86", "600");
4260 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004261};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004262
David Majnemerae1ed0e2015-05-28 04:36:18 +00004263static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004264 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4265 // supports __declspec natively under -fms-extensions, but we define a no-op
4266 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004267 if (Opts.MicrosoftExt)
4268 Builder.defineMacro("__declspec", "__declspec");
4269 else
4270 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4271
4272 if (!Opts.MicrosoftExt) {
4273 // Provide macros for all the calling convention keywords. Provide both
4274 // single and double underscore prefixed variants. These are available on
4275 // x64 as well as x86, even though they have no effect.
4276 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4277 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004278 std::string GCCSpelling = "__attribute__((__";
4279 GCCSpelling += CC;
4280 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004281 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4282 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4283 }
4284 }
4285}
4286
David Majnemerae1ed0e2015-05-28 04:36:18 +00004287static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4288 Builder.defineMacro("__MSVCRT__");
4289 Builder.defineMacro("__MINGW32__");
4290 addCygMingDefines(Opts, Builder);
4291}
4292
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004293// x86-32 MinGW target
4294class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4295public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004296 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4297 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004298 void getTargetDefines(const LangOptions &Opts,
4299 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004300 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004301 DefineStd(Builder, "WIN32", Opts);
4302 DefineStd(Builder, "WINNT", Opts);
4303 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004304 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004305 }
4306};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004307
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004308// x86-32 Cygwin target
4309class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4310public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004311 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4312 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004313 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004314 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004315 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 +00004316 }
Craig Topper3164f332014-03-11 03:39:26 +00004317 void getTargetDefines(const LangOptions &Opts,
4318 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004319 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004320 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004321 Builder.defineMacro("__CYGWIN__");
4322 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004323 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004324 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004325 if (Opts.CPlusPlus)
4326 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004327 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004328};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004329
Chris Lattnerb986aba2010-04-11 19:29:39 +00004330// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004331class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004332public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004333 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004334 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004335 }
Craig Topper3164f332014-03-11 03:39:26 +00004336 void getTargetDefines(const LangOptions &Opts,
4337 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004338 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004339 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004340 }
4341};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004342
Alexey Bataevc99b0492015-11-25 09:24:26 +00004343// X86-32 MCU target
4344class MCUX86_32TargetInfo : public X86_32TargetInfo {
4345public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004346 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4347 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004348 LongDoubleWidth = 64;
4349 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004350 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 +00004351 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004352 }
4353
4354 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4355 // On MCU we support only C calling convention.
4356 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4357 }
4358
4359 void getTargetDefines(const LangOptions &Opts,
4360 MacroBuilder &Builder) const override {
4361 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4362 Builder.defineMacro("__iamcu");
4363 Builder.defineMacro("__iamcu__");
4364 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004365
4366 bool allowsLargerPreferedTypeAlignment() const override {
4367 return false;
4368 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004369};
4370
Douglas Gregor9fabd852011-07-01 22:41:14 +00004371// RTEMS Target
4372template<typename Target>
4373class RTEMSTargetInfo : public OSTargetInfo<Target> {
4374protected:
Craig Topper3164f332014-03-11 03:39:26 +00004375 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4376 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004377 // RTEMS defines; list based off of gcc output
4378
Douglas Gregor9fabd852011-07-01 22:41:14 +00004379 Builder.defineMacro("__rtems__");
4380 Builder.defineMacro("__ELF__");
4381 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004382
Douglas Gregor9fabd852011-07-01 22:41:14 +00004383public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004384 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4385 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004386 switch (Triple.getArch()) {
4387 default:
4388 case llvm::Triple::x86:
4389 // this->MCountName = ".mcount";
4390 break;
4391 case llvm::Triple::mips:
4392 case llvm::Triple::mipsel:
4393 case llvm::Triple::ppc:
4394 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004395 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004396 // this->MCountName = "_mcount";
4397 break;
4398 case llvm::Triple::arm:
4399 // this->MCountName = "__mcount";
4400 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004401 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004402 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004403};
4404
Douglas Gregor9fabd852011-07-01 22:41:14 +00004405// x86-32 RTEMS target
4406class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4407public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004408 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4409 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004410 SizeType = UnsignedLong;
4411 IntPtrType = SignedLong;
4412 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004413 }
Craig Topper3164f332014-03-11 03:39:26 +00004414 void getTargetDefines(const LangOptions &Opts,
4415 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004416 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4417 Builder.defineMacro("__INTEL__");
4418 Builder.defineMacro("__rtems__");
4419 }
4420};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004421
Eli Friedman3fd920a2008-08-20 02:34:37 +00004422// x86-64 generic target
4423class X86_64TargetInfo : public X86TargetInfo {
4424public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004425 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4426 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004427 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004428 bool IsWinCOFF =
4429 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004430 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004431 LongDoubleWidth = 128;
4432 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004433 LargeArrayMinWidth = 128;
4434 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004435 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004436 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4437 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4438 IntPtrType = IsX32 ? SignedInt : SignedLong;
4439 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004440 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004441 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004442
Eric Christopher917e9522014-11-18 22:36:15 +00004443 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004444 resetDataLayout(IsX32
4445 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4446 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4447 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004448
4449 // Use fpret only for long double.
4450 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004451
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004452 // Use fp2ret for _Complex long double.
4453 ComplexLongDoubleUsesFP2Ret = true;
4454
Charles Davisc7d5c942015-09-17 20:55:33 +00004455 // Make __builtin_ms_va_list available.
4456 HasBuiltinMSVaList = true;
4457
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004458 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004459 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004460 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004461 }
Craig Topper3164f332014-03-11 03:39:26 +00004462 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004463 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004464 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004465
Craig Topper3164f332014-03-11 03:39:26 +00004466 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004467 if (RegNo == 0) return 0;
4468 if (RegNo == 1) return 1;
4469 return -1;
4470 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004471
Craig Topper3164f332014-03-11 03:39:26 +00004472 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004473 switch (CC) {
4474 case CC_C:
4475 case CC_Swift:
4476 case CC_X86VectorCall:
4477 case CC_IntelOclBicc:
4478 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004479 case CC_PreserveMost:
4480 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004481 return CCCR_OK;
4482 default:
4483 return CCCR_Warning;
4484 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004485 }
4486
Craig Topper3164f332014-03-11 03:39:26 +00004487 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004488 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004489 }
4490
Pavel Chupinfd223e12014-08-04 12:39:43 +00004491 // for x32 we need it here explicitly
4492 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004493 unsigned getUnwindWordWidth() const override { return 64; }
4494 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004495
4496 bool validateGlobalRegisterVariable(StringRef RegName,
4497 unsigned RegSize,
4498 bool &HasSizeMismatch) const override {
4499 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4500 // handle.
4501 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4502 // Check that the register size is 64-bit.
4503 HasSizeMismatch = RegSize != 64;
4504 return true;
4505 }
4506
4507 // Check if the register is a 32-bit register the backend can handle.
4508 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4509 HasSizeMismatch);
4510 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004511 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4512 return llvm::makeArrayRef(BuiltinInfoX86,
4513 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4514 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004515};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004516
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004517// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004518class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004519public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004520 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4521 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004522 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004523 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004524 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004525 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004526 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004527 SizeType = UnsignedLongLong;
4528 PtrDiffType = SignedLongLong;
4529 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004530 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004531
Craig Topper3164f332014-03-11 03:39:26 +00004532 void getTargetDefines(const LangOptions &Opts,
4533 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004534 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004535 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004536 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004537
Craig Topper3164f332014-03-11 03:39:26 +00004538 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004539 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004540 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004541
Craig Topper3164f332014-03-11 03:39:26 +00004542 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004543 switch (CC) {
4544 case CC_X86StdCall:
4545 case CC_X86ThisCall:
4546 case CC_X86FastCall:
4547 return CCCR_Ignore;
4548 case CC_C:
4549 case CC_X86VectorCall:
4550 case CC_IntelOclBicc:
4551 case CC_X86_64SysV:
4552 return CCCR_OK;
4553 default:
4554 return CCCR_Warning;
4555 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004556 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004557};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004558
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004559// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004560class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004561public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004562 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4563 const TargetOptions &Opts)
4564 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004565 LongDoubleWidth = LongDoubleAlign = 64;
4566 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004567 }
Craig Topper3164f332014-03-11 03:39:26 +00004568 void getTargetDefines(const LangOptions &Opts,
4569 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004570 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4571 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004572 Builder.defineMacro("_M_X64", "100");
4573 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004574 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004575};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004576
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004577// x86-64 MinGW target
4578class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4579public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004580 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4581 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004582 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4583 // with x86 FP ops. Weird.
4584 LongDoubleWidth = LongDoubleAlign = 128;
4585 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4586 }
4587
Craig Topper3164f332014-03-11 03:39:26 +00004588 void getTargetDefines(const LangOptions &Opts,
4589 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004590 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004591 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004592 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004593 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004594
4595 // GCC defines this macro when it is using __gxx_personality_seh0.
4596 if (!Opts.SjLjExceptions)
4597 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004598 }
4599};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004600
Yaron Kerend030d112015-07-22 17:38:19 +00004601// x86-64 Cygwin target
4602class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4603public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004604 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4605 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004606 TLSSupported = false;
4607 WCharType = UnsignedShort;
4608 }
4609 void getTargetDefines(const LangOptions &Opts,
4610 MacroBuilder &Builder) const override {
4611 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4612 Builder.defineMacro("__x86_64__");
4613 Builder.defineMacro("__CYGWIN__");
4614 Builder.defineMacro("__CYGWIN64__");
4615 addCygMingDefines(Opts, Builder);
4616 DefineStd(Builder, "unix", Opts);
4617 if (Opts.CPlusPlus)
4618 Builder.defineMacro("_GNU_SOURCE");
4619
4620 // GCC defines this macro when it is using __gxx_personality_seh0.
4621 if (!Opts.SjLjExceptions)
4622 Builder.defineMacro("__SEH__");
4623 }
4624};
4625
Eli Friedman2857ccb2009-07-01 03:36:11 +00004626class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4627public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004628 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4629 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004630 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004631 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4632 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004633 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004634 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004635 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004636 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004637
4638 bool handleTargetFeatures(std::vector<std::string> &Features,
4639 DiagnosticsEngine &Diags) override {
4640 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4641 Diags))
4642 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004643 // We now know the features we have: we can decide how to align vectors.
4644 MaxVectorAlign =
4645 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004646 return true;
4647 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004648};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004649
Eli Friedman245f2292009-07-05 22:31:18 +00004650class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4651public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004652 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4653 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004654 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004655 Int64Type = SignedLongLong;
4656 }
4657};
Eli Friedman245f2292009-07-05 22:31:18 +00004658
Eli Friedman9fa28852012-08-08 23:57:20 +00004659class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4660public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004661 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4662 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004663 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004664 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004665 }
4666};
Tim Northover9bb857a2013-01-31 12:13:10 +00004667
Eli Friedmanf05b7722008-08-20 07:44:10 +00004668class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004669 // Possible FPU choices.
4670 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004671 VFP2FPU = (1 << 0),
4672 VFP3FPU = (1 << 1),
4673 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004674 NeonFPU = (1 << 3),
4675 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004676 };
4677
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004678 // Possible HWDiv features.
4679 enum HWDivMode {
4680 HWDivThumb = (1 << 0),
4681 HWDivARM = (1 << 1)
4682 };
4683
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004684 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004685 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004686 }
4687
4688 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4689 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004690
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004691 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004692
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004693 StringRef CPUProfile;
4694 StringRef CPUAttr;
4695
Rafael Espindolaeb265472013-08-21 21:59:03 +00004696 enum {
4697 FP_Default,
4698 FP_VFP,
4699 FP_Neon
4700 } FPMath;
4701
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004702 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004703 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004704 unsigned ArchProfile;
4705 unsigned ArchVersion;
4706
Bernard Ogdenda13af32013-10-24 18:32:51 +00004707 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004708
Logan Chien57086ce2012-10-10 06:56:20 +00004709 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004710 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004711
4712 // Initialized via features.
4713 unsigned SoftFloat : 1;
4714 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004715
Bernard Ogden18b57012013-10-29 09:47:51 +00004716 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004717 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004718 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004719 unsigned Unaligned : 1;
4720
4721 enum {
4722 LDREX_B = (1 << 0), /// byte (8-bit)
4723 LDREX_H = (1 << 1), /// half (16-bit)
4724 LDREX_W = (1 << 2), /// word (32-bit)
4725 LDREX_D = (1 << 3), /// double (64-bit)
4726 };
4727
4728 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004729
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004730 // ACLE 6.5.1 Hardware floating point
4731 enum {
4732 HW_FP_HP = (1 << 1), /// half (16-bit)
4733 HW_FP_SP = (1 << 2), /// single (32-bit)
4734 HW_FP_DP = (1 << 3), /// double (64-bit)
4735 };
4736 uint32_t HW_FP;
4737
Chris Lattner5cc15e02010-03-03 19:03:45 +00004738 static const Builtin::Info BuiltinInfo[];
4739
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004740 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004741 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004742
4743 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004744 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004745
Renato Golin0201a9e2016-09-22 19:28:20 +00004746 // size_t is unsigned long on MachO-derived environments, NetBSD,
4747 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004748 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004749 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004750 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004751 SizeType = UnsignedLong;
4752 else
4753 SizeType = UnsignedInt;
4754
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004755 switch (T.getOS()) {
4756 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004757 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004758 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004759 break;
4760 case llvm::Triple::Win32:
4761 WCharType = UnsignedShort;
4762 break;
4763 case llvm::Triple::Linux:
4764 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004765 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4766 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004767 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004768 }
4769
4770 UseBitFieldTypeAlignment = true;
4771
4772 ZeroLengthBitfieldBoundary = 0;
4773
Tim Northover147cd2f2014-10-14 22:12:21 +00004774 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4775 // so set preferred for small types to 32.
4776 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004777 resetDataLayout(BigEndian
4778 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4779 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004780 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004781 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004782 resetDataLayout("e"
4783 "-m:w"
4784 "-p:32:32"
4785 "-i64:64"
4786 "-v128:64:128"
4787 "-a:0:32"
4788 "-n32"
4789 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004790 } else if (T.isOSNaCl()) {
4791 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004792 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004793 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004794 resetDataLayout(BigEndian
4795 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4796 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004797 }
4798
4799 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004800 }
4801
Tim Northover5627d392015-10-30 16:30:45 +00004802 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004803 const llvm::Triple &T = getTriple();
4804
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004805 IsAAPCS = false;
4806
Tim Northover5627d392015-10-30 16:30:45 +00004807 if (IsAAPCS16)
4808 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4809 else
4810 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004811
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004812 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004813 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004814 SizeType = UnsignedInt;
4815 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004816 SizeType = UnsignedLong;
4817
4818 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4819 WCharType = SignedInt;
4820
4821 // Do not respect the alignment of bit-field types when laying out
4822 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4823 UseBitFieldTypeAlignment = false;
4824
4825 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4826 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4827 /// gcc.
4828 ZeroLengthBitfieldBoundary = 32;
4829
Tim Northover5627d392015-10-30 16:30:45 +00004830 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4831 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004832 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004833 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004834 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004835 BigEndian
4836 ? "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 +00004837 : "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 +00004838 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004839 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004840 BigEndian
4841 ? "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 +00004842 : "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 +00004843
4844 // FIXME: Override "preferred align" for double and long long.
4845 }
4846
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004847 void setArchInfo() {
4848 StringRef ArchName = getTriple().getArchName();
4849
Renato Goline84b0002015-10-08 16:43:26 +00004850 ArchISA = llvm::ARM::parseArchISA(ArchName);
4851 CPU = llvm::ARM::getDefaultCPU(ArchName);
4852 unsigned AK = llvm::ARM::parseArch(ArchName);
4853 if (AK != llvm::ARM::AK_INVALID)
4854 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004855 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004856 }
4857
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004858 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004859 StringRef SubArch;
4860
4861 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004862 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004863 SubArch = llvm::ARM::getSubArch(ArchKind);
4864 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4865 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004866
4867 // cache CPU related strings
4868 CPUAttr = getCPUAttr();
4869 CPUProfile = getCPUProfile();
4870 }
4871
4872 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004873 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004874 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004875 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004876 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4877 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004878 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004879 if (ArchProfile == llvm::ARM::PK_M) {
4880 MaxAtomicPromoteWidth = 32;
4881 if (ShouldUseInlineAtomic)
4882 MaxAtomicInlineWidth = 32;
4883 }
4884 else {
4885 MaxAtomicPromoteWidth = 64;
4886 if (ShouldUseInlineAtomic)
4887 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004888 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004889 }
4890
4891 bool isThumb() const {
4892 return (ArchISA == llvm::ARM::IK_THUMB);
4893 }
4894
4895 bool supportsThumb() const {
4896 return CPUAttr.count('T') || ArchVersion >= 6;
4897 }
4898
4899 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004900 return CPUAttr.equals("6T2") ||
4901 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004902 }
4903
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004904 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004905 // For most sub-arches, the build attribute CPU name is enough.
4906 // For Cortex variants, it's slightly different.
4907 switch(ArchKind) {
4908 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004909 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004910 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004911 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004912 case llvm::ARM::AK_ARMV7S:
4913 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004914 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004915 return "7A";
4916 case llvm::ARM::AK_ARMV7R:
4917 return "7R";
4918 case llvm::ARM::AK_ARMV7M:
4919 return "7M";
4920 case llvm::ARM::AK_ARMV7EM:
4921 return "7EM";
4922 case llvm::ARM::AK_ARMV8A:
4923 return "8A";
4924 case llvm::ARM::AK_ARMV8_1A:
4925 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004926 case llvm::ARM::AK_ARMV8_2A:
4927 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004928 case llvm::ARM::AK_ARMV8MBaseline:
4929 return "8M_BASE";
4930 case llvm::ARM::AK_ARMV8MMainline:
4931 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004932 }
4933 }
4934
4935 StringRef getCPUProfile() const {
4936 switch(ArchProfile) {
4937 case llvm::ARM::PK_A:
4938 return "A";
4939 case llvm::ARM::PK_R:
4940 return "R";
4941 case llvm::ARM::PK_M:
4942 return "M";
4943 default:
4944 return "";
4945 }
4946 }
4947
Chris Lattner17df24e2008-04-21 18:56:49 +00004948public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004949 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004950 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4951 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004952
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004953 switch (getTriple().getOS()) {
4954 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004955 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004956 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004957 break;
4958 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004959 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004960 break;
4961 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004962
Renato Goline84b0002015-10-08 16:43:26 +00004963 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004964 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004965
Chris Lattner1a8f3942010-04-23 16:29:58 +00004966 // {} in inline assembly are neon specifiers, not assembly variant
4967 // specifiers.
4968 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004969
Eric Christopher0e261882014-12-05 01:06:59 +00004970 // FIXME: This duplicates code from the driver that sets the -target-abi
4971 // option - this code is used if -target-abi isn't passed and should
4972 // be unified in some way.
4973 if (Triple.isOSBinFormatMachO()) {
4974 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4975 // the frontend matches that.
4976 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4977 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004978 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004979 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004980 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004981 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004982 } else {
4983 setABI("apcs-gnu");
4984 }
4985 } else if (Triple.isOSWindows()) {
4986 // FIXME: this is invalid for WindowsCE
4987 setABI("aapcs");
4988 } else {
4989 // Select the default based on the platform.
4990 switch (Triple.getEnvironment()) {
4991 case llvm::Triple::Android:
4992 case llvm::Triple::GNUEABI:
4993 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004994 case llvm::Triple::MuslEABI:
4995 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004996 setABI("aapcs-linux");
4997 break;
4998 case llvm::Triple::EABIHF:
4999 case llvm::Triple::EABI:
5000 setABI("aapcs");
5001 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005002 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005003 setABI("apcs-gnu");
5004 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005005 default:
5006 if (Triple.getOS() == llvm::Triple::NetBSD)
5007 setABI("apcs-gnu");
5008 else
5009 setABI("aapcs");
5010 break;
5011 }
5012 }
John McCall86353412010-08-21 22:46:04 +00005013
5014 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005015 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005016
Renato Golin15b86152015-07-03 16:41:13 +00005017 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005018 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005019
James Molloya7139222012-03-12 09:14:10 +00005020 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005021 // the alignment of the zero-length bitfield is greater than the member
5022 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005023 // zero length bitfield.
5024 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005025
5026 if (Triple.getOS() == llvm::Triple::Linux ||
5027 Triple.getOS() == llvm::Triple::UnknownOS)
5028 this->MCountName =
5029 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005030 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005031
Alp Toker4925ba72014-06-07 23:30:42 +00005032 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005033
Craig Topper3164f332014-03-11 03:39:26 +00005034 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005035 ABI = Name;
5036
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005037 // The defaults (above) are for AAPCS, check if we need to change them.
5038 //
5039 // FIXME: We need support for -meabi... we could just mangle it into the
5040 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005041 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005042 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005043 return true;
5044 }
5045 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5046 setABIAAPCS();
5047 return true;
5048 }
5049 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005050 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005051
Renato Golinf5c4dec2015-05-27 13:33:00 +00005052 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005053 bool
5054 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5055 StringRef CPU,
5056 const std::vector<std::string> &FeaturesVec) const override {
5057
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005058 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005059 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005060
5061 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005062 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005063 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5064
5065 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005066 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005067 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5068
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005069 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005070 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005071 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005072
Eric Christopher007b0a02015-08-28 22:32:01 +00005073 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005074 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005075
Craig Topper3164f332014-03-11 03:39:26 +00005076 bool handleTargetFeatures(std::vector<std::string> &Features,
5077 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005078 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005079 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005080 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005081 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005082 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005083 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005084 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005085
Ranjeet Singhac08e532015-06-24 23:39:25 +00005086 // This does not diagnose illegal cases like having both
5087 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5088 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005089 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005090 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005091 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005092 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005093 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005094 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005095 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005096 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005097 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005098 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005099 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005100 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005101 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005102 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005103 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005104 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005105 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005106 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005107 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005108 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005109 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005110 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005111 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005112 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005113 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005114 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005115 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005116 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005117 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005118 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005119 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005120 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005121 } else if (Feature == "+strict-align") {
5122 Unaligned = 0;
5123 } else if (Feature == "+fp16") {
5124 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005125 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005126 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005127 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005128
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005129 switch (ArchVersion) {
5130 case 6:
5131 if (ArchProfile == llvm::ARM::PK_M)
5132 LDREX = 0;
5133 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5134 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5135 else
5136 LDREX = LDREX_W;
5137 break;
5138 case 7:
5139 if (ArchProfile == llvm::ARM::PK_M)
5140 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5141 else
5142 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5143 break;
5144 case 8:
5145 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5146 }
5147
Rafael Espindolaeb265472013-08-21 21:59:03 +00005148 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5149 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5150 return false;
5151 }
5152
5153 if (FPMath == FP_Neon)
5154 Features.push_back("+neonfp");
5155 else if (FPMath == FP_VFP)
5156 Features.push_back("-neonfp");
5157
Daniel Dunbar893d4752009-12-19 04:15:38 +00005158 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005159 auto Feature =
5160 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5161 if (Feature != Features.end())
5162 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005163
Rafael Espindolaeb265472013-08-21 21:59:03 +00005164 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005165 }
5166
Craig Topper3164f332014-03-11 03:39:26 +00005167 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005168 return llvm::StringSwitch<bool>(Feature)
5169 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005170 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005171 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005172 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005173 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005174 .Case("hwdiv", HWDiv & HWDivThumb)
5175 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005176 .Default(false);
5177 }
Renato Golin15b86152015-07-03 16:41:13 +00005178
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005179 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005180 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005181 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005182
Renato Golin15b86152015-07-03 16:41:13 +00005183 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005184 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005185 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005186 CPU = Name;
5187 return true;
5188 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005189
Craig Topper3164f332014-03-11 03:39:26 +00005190 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005191
Craig Topper3164f332014-03-11 03:39:26 +00005192 void getTargetDefines(const LangOptions &Opts,
5193 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005194 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005195 Builder.defineMacro("__arm");
5196 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005197 // For bare-metal none-eabi.
5198 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5199 getTriple().getEnvironment() == llvm::Triple::EABI)
5200 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005201
Chris Lattnerecd49032009-03-02 22:27:17 +00005202 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005203 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005204
5205 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5206 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005207 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005208 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5209
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005210 if (!CPUAttr.empty())
5211 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005212
5213 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005214 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005215 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005216
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005217 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005218 // ACLE 6.5.7 Crypto Extension
5219 if (Crypto)
5220 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5221 // ACLE 6.5.8 CRC32 Extension
5222 if (CRC)
5223 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5224 // ACLE 6.5.10 Numeric Maximum and Minimum
5225 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5226 // ACLE 6.5.9 Directed Rounding
5227 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005228 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005229
5230 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5231 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005232 // NOTE that the default profile is assumed to be 'A'
5233 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005234 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5235
Bradley Smithf4affc12016-03-03 13:52:22 +00005236 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5237 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5238 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5239 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005240 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005241 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005242 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005243 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5244
5245 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5246 // instruction set such as ARM or Thumb.
5247 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5248
5249 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5250
5251 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005252 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005253 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005254
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005255 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005256 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005257 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005258
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005259 // ACLE 6.4.4 LDREX/STREX
5260 if (LDREX)
5261 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5262
5263 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005264 if (ArchVersion == 5 ||
5265 (ArchVersion == 6 && CPUProfile != "M") ||
5266 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005267 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5268
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005269 // ACLE 6.5.1 Hardware Floating Point
5270 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005271 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005272
Yi Konga44c4d72014-06-27 21:25:42 +00005273 // ACLE predefines.
5274 Builder.defineMacro("__ARM_ACLE", "200");
5275
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005276 // FP16 support (we currently only support IEEE format).
5277 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5278 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5279
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005280 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005281 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005282 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5283
Mike Stump9d54bd72009-04-08 02:07:04 +00005284 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005285
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005286 // FIXME: It's more complicated than this and we don't really support
5287 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005288 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005289 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005290 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005291
David Tweed8f676532012-10-25 13:33:01 +00005292 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005293 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005294 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005295 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005296 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005297 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005298 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005299
Tim Northover28fc0e12016-04-28 13:59:55 +00005300 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5301 ABI == "aapcs16")
5302 Builder.defineMacro("__ARM_PCS_VFP", "1");
5303
Daniel Dunbar893d4752009-12-19 04:15:38 +00005304 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005305 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005306
Zijiao Ma56a83722016-08-17 02:13:33 +00005307 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005308 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005309
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005310 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005311 Builder.defineMacro("__THUMBEL__");
5312 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005313 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005314 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005315 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005316
5317 // ACLE 6.4.9 32-bit SIMD instructions
5318 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5319 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5320
5321 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005322 if (((HWDiv & HWDivThumb) && isThumb()) ||
5323 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005324 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005325 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005326 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005327
5328 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005329 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005330
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005331 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005332 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005333 if (FPU & VFP2FPU)
5334 Builder.defineMacro("__ARM_VFPV2__");
5335 if (FPU & VFP3FPU)
5336 Builder.defineMacro("__ARM_VFPV3__");
5337 if (FPU & VFP4FPU)
5338 Builder.defineMacro("__ARM_VFPV4__");
5339 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005340
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005341 // This only gets set when Neon instructions are actually available, unlike
5342 // the VFP define, hence the soft float and arch check. This is subtly
5343 // different from gcc, we follow the intent which was that it should be set
5344 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005345 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005346 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005347 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005348 // current AArch32 NEON implementations do not support double-precision
5349 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005350 Builder.defineMacro("__ARM_NEON_FP",
5351 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005352 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005353
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005354 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5355 Opts.ShortWChar ? "2" : "4");
5356
5357 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5358 Opts.ShortEnums ? "1" : "4");
5359
Bradley Smithf4affc12016-03-03 13:52:22 +00005360 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5362 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5363 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5364 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5365 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005366
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005367 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005368 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005369 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005370 }
5371
5372 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005373 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005374 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5375 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005376 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005377 }
5378
5379 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005380 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005381 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005382
5383 if (Opts.UnsafeFPMath)
5384 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005385
5386 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5387 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005388 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005389
Craig Topper6c03a542015-10-19 04:51:35 +00005390 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5391 return llvm::makeArrayRef(BuiltinInfo,
5392 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005393 }
Craig Topper3164f332014-03-11 03:39:26 +00005394 bool isCLZForZeroUndef() const override { return false; }
5395 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005396 return IsAAPCS
5397 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005398 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5399 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005400 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005401 ArrayRef<const char *> getGCCRegNames() const override;
5402 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005403 bool validateAsmConstraint(const char *&Name,
5404 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005405 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005406 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005407 case 'l': // r0-r7
5408 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005409 case 't': // VFP Floating point register single precision
5410 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005411 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005412 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005413 case 'I':
5414 case 'J':
5415 case 'K':
5416 case 'L':
5417 case 'M':
5418 // FIXME
5419 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005420 case 'Q': // A memory address that is a single base register.
5421 Info.setAllowsMemory();
5422 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005423 case 'U': // a memory reference...
5424 switch (Name[1]) {
5425 case 'q': // ...ARMV4 ldrsb
5426 case 'v': // ...VFP load/store (reg+constant offset)
5427 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005428 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005429 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005430 case 'n': // valid address for Neon doubleword vector load/store
5431 case 'm': // valid address for Neon element and structure load/store
5432 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005433 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005434 Info.setAllowsMemory();
5435 Name++;
5436 return true;
5437 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005438 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005439 return false;
5440 }
Craig Topper3164f332014-03-11 03:39:26 +00005441 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005442 std::string R;
5443 switch (*Constraint) {
5444 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005445 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005446 Constraint++;
5447 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005448 case 'p': // 'p' should be translated to 'r' by default.
5449 R = std::string("r");
5450 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005451 default:
5452 return std::string(1, *Constraint);
5453 }
5454 return R;
5455 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005456 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005457 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005458 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005459 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005460 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005461
Bill Wendling9d1ee112012-10-25 23:28:48 +00005462 // Strip off constraint modifiers.
5463 while (Constraint[0] == '=' ||
5464 Constraint[0] == '+' ||
5465 Constraint[0] == '&')
5466 Constraint = Constraint.substr(1);
5467
5468 switch (Constraint[0]) {
5469 default: break;
5470 case 'r': {
5471 switch (Modifier) {
5472 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005473 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005474 case 'q':
5475 // A register of size 32 cannot fit a vector type.
5476 return false;
5477 }
5478 }
5479 }
5480
5481 return true;
5482 }
Craig Topper3164f332014-03-11 03:39:26 +00005483 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005484 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005485 return "";
5486 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005487
Craig Topper3164f332014-03-11 03:39:26 +00005488 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005489 switch (CC) {
5490 case CC_AAPCS:
5491 case CC_AAPCS_VFP:
5492 case CC_Swift:
5493 return CCCR_OK;
5494 default:
5495 return CCCR_Warning;
5496 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005497 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005498
Craig Topper3164f332014-03-11 03:39:26 +00005499 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005500 if (RegNo == 0) return 0;
5501 if (RegNo == 1) return 1;
5502 return -1;
5503 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005504
5505 bool hasSjLjLowering() const override {
5506 return true;
5507 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005508};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005509
Rafael Espindolaeb265472013-08-21 21:59:03 +00005510bool ARMTargetInfo::setFPMath(StringRef Name) {
5511 if (Name == "neon") {
5512 FPMath = FP_Neon;
5513 return true;
5514 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5515 Name == "vfp4") {
5516 FPMath = FP_VFP;
5517 return true;
5518 }
5519 return false;
5520}
5521
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005522const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005523 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005524 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005525 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5526
5527 // Float registers
5528 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5529 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5530 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005531 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005532
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005533 // Double registers
5534 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5535 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005536 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5537 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005538
5539 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005540 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5541 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005542};
5543
Craig Topperf054e3a2015-10-19 03:52:27 +00005544ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5545 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005546}
5547
5548const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005549 { { "a1" }, "r0" },
5550 { { "a2" }, "r1" },
5551 { { "a3" }, "r2" },
5552 { { "a4" }, "r3" },
5553 { { "v1" }, "r4" },
5554 { { "v2" }, "r5" },
5555 { { "v3" }, "r6" },
5556 { { "v4" }, "r7" },
5557 { { "v5" }, "r8" },
5558 { { "v6", "rfp" }, "r9" },
5559 { { "sl" }, "r10" },
5560 { { "fp" }, "r11" },
5561 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005562 { { "r13" }, "sp" },
5563 { { "r14" }, "lr" },
5564 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005565 // The S, D and Q registers overlap, but aren't really aliases; we
5566 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005567};
5568
Craig Topperf054e3a2015-10-19 03:52:27 +00005569ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5570 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005571}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005572
5573const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005574#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005575 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005576#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5577 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005578#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005579
Craig Topper07d3b622015-08-07 05:14:44 +00005580#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005581 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005582#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005583 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005584#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5585 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005586#include "clang/Basic/BuiltinsARM.def"
5587};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005588
5589class ARMleTargetInfo : public ARMTargetInfo {
5590public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005591 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005592 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005593 void getTargetDefines(const LangOptions &Opts,
5594 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005595 Builder.defineMacro("__ARMEL__");
5596 ARMTargetInfo::getTargetDefines(Opts, Builder);
5597 }
5598};
5599
5600class ARMbeTargetInfo : public ARMTargetInfo {
5601public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005602 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005603 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005604 void getTargetDefines(const LangOptions &Opts,
5605 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005606 Builder.defineMacro("__ARMEB__");
5607 Builder.defineMacro("__ARM_BIG_ENDIAN");
5608 ARMTargetInfo::getTargetDefines(Opts, Builder);
5609 }
5610};
Chris Lattner17df24e2008-04-21 18:56:49 +00005611
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005612class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5613 const llvm::Triple Triple;
5614public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005615 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5616 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005617 WCharType = UnsignedShort;
5618 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005619 }
5620 void getVisualStudioDefines(const LangOptions &Opts,
5621 MacroBuilder &Builder) const {
5622 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5623
5624 // FIXME: this is invalid for WindowsCE
5625 Builder.defineMacro("_M_ARM_NT", "1");
5626 Builder.defineMacro("_M_ARMT", "_M_ARM");
5627 Builder.defineMacro("_M_THUMB", "_M_ARM");
5628
5629 assert((Triple.getArch() == llvm::Triple::arm ||
5630 Triple.getArch() == llvm::Triple::thumb) &&
5631 "invalid architecture for Windows ARM target info");
5632 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5633 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5634
5635 // TODO map the complete set of values
5636 // 31: VFPv3 40: VFPv4
5637 Builder.defineMacro("_M_ARM_FP", "31");
5638 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005639 BuiltinVaListKind getBuiltinVaListKind() const override {
5640 return TargetInfo::CharPtrBuiltinVaList;
5641 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005642 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5643 switch (CC) {
5644 case CC_X86StdCall:
5645 case CC_X86ThisCall:
5646 case CC_X86FastCall:
5647 case CC_X86VectorCall:
5648 return CCCR_Ignore;
5649 case CC_C:
5650 return CCCR_OK;
5651 default:
5652 return CCCR_Warning;
5653 }
5654 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005655};
5656
5657// Windows ARM + Itanium C++ ABI Target
5658class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5659public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005660 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5661 const TargetOptions &Opts)
5662 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005663 TheCXXABI.set(TargetCXXABI::GenericARM);
5664 }
5665
5666 void getTargetDefines(const LangOptions &Opts,
5667 MacroBuilder &Builder) const override {
5668 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5669
5670 if (Opts.MSVCCompat)
5671 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5672 }
5673};
5674
5675// Windows ARM, MS (C++) ABI
5676class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5677public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005678 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5679 const TargetOptions &Opts)
5680 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005681 TheCXXABI.set(TargetCXXABI::Microsoft);
5682 }
5683
5684 void getTargetDefines(const LangOptions &Opts,
5685 MacroBuilder &Builder) const override {
5686 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5687 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5688 }
5689};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005690
Yaron Keren321249c2015-07-15 13:32:23 +00005691// ARM MinGW target
5692class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5693public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005694 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5695 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005696 TheCXXABI.set(TargetCXXABI::GenericARM);
5697 }
5698
5699 void getTargetDefines(const LangOptions &Opts,
5700 MacroBuilder &Builder) const override {
5701 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5702 DefineStd(Builder, "WIN32", Opts);
5703 DefineStd(Builder, "WINNT", Opts);
5704 Builder.defineMacro("_ARM_");
5705 addMinGWDefines(Opts, Builder);
5706 }
5707};
5708
5709// ARM Cygwin target
5710class CygwinARMTargetInfo : public ARMleTargetInfo {
5711public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005712 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5713 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005714 TLSSupported = false;
5715 WCharType = UnsignedShort;
5716 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005717 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005718 }
5719 void getTargetDefines(const LangOptions &Opts,
5720 MacroBuilder &Builder) const override {
5721 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5722 Builder.defineMacro("_ARM_");
5723 Builder.defineMacro("__CYGWIN__");
5724 Builder.defineMacro("__CYGWIN32__");
5725 DefineStd(Builder, "unix", Opts);
5726 if (Opts.CPlusPlus)
5727 Builder.defineMacro("_GNU_SOURCE");
5728 }
5729};
5730
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005731class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005732protected:
Craig Topper3164f332014-03-11 03:39:26 +00005733 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5734 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005735 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005736 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005737
Torok Edwinb2b37c62009-06-30 17:10:35 +00005738public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005739 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5740 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005741 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005742 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005743 // FIXME: This should be based off of the target features in
5744 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005745 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005746
Tim Northoverd88ecb32016-01-27 19:32:40 +00005747 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005748 // Darwin on iOS uses a variant of the ARM C++ ABI.
5749 TheCXXABI.set(TargetCXXABI::WatchOS);
5750
5751 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5752 // size_t is long, it's a bit weird for it to be int.
5753 PtrDiffType = SignedLong;
5754
5755 // BOOL should be a real boolean on the new ABI
5756 UseSignedCharForObjCBool = false;
5757 } else
5758 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005759 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005760};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005761
Tim Northover573cbee2014-05-24 12:52:07 +00005762class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005763 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005764 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5765 static const char *const GCCRegNames[];
5766
James Molloy75f5f9e2014-04-16 15:33:48 +00005767 enum FPUModeEnum {
5768 FPUMode,
5769 NeonMode
5770 };
5771
5772 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005773 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005774 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005775 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005776 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005777
Tim Northovera2ee4332014-03-29 15:09:45 +00005778 static const Builtin::Info BuiltinInfo[];
5779
5780 std::string ABI;
5781
5782public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005783 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005784 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005785 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5786 WCharType = SignedInt;
5787
5788 // NetBSD apparently prefers consistency across ARM targets to consistency
5789 // across 64-bit targets.
5790 Int64Type = SignedLongLong;
5791 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005792 } else {
5793 WCharType = UnsignedInt;
5794 Int64Type = SignedLong;
5795 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005796 }
5797
Tim Northovera2ee4332014-03-29 15:09:45 +00005798 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005799 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005800 MaxAtomicInlineWidth = 128;
5801 MaxAtomicPromoteWidth = 128;
5802
Tim Northovera6a19f12015-02-06 01:25:07 +00005803 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005804 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5805
Tim Northovera2ee4332014-03-29 15:09:45 +00005806 // {} in inline assembly are neon specifiers, not assembly variant
5807 // specifiers.
5808 NoAsmVariants = true;
5809
Tim Northover7ad87af2015-01-16 18:44:04 +00005810 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5811 // contributes to the alignment of the containing aggregate in the same way
5812 // a plain (non bit-field) member of that type would, without exception for
5813 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005814 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005815 UseZeroLengthBitfieldAlignment = true;
5816
Tim Northover573cbee2014-05-24 12:52:07 +00005817 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005818 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005819
5820 if (Triple.getOS() == llvm::Triple::Linux ||
5821 Triple.getOS() == llvm::Triple::UnknownOS)
5822 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005823 }
5824
Alp Toker4925ba72014-06-07 23:30:42 +00005825 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005826 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005827 if (Name != "aapcs" && Name != "darwinpcs")
5828 return false;
5829
5830 ABI = Name;
5831 return true;
5832 }
5833
David Blaikie1cbb9712014-11-14 19:09:44 +00005834 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005835 return Name == "generic" ||
5836 llvm::AArch64::parseCPUArch(Name) !=
5837 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005838 }
5839
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005840 void getTargetDefines(const LangOptions &Opts,
5841 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005842 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005843 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005844
5845 // Target properties.
5846 Builder.defineMacro("_LP64");
5847 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005848
5849 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5850 Builder.defineMacro("__ARM_ACLE", "200");
5851 Builder.defineMacro("__ARM_ARCH", "8");
5852 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5853
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005854 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005855 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005856 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005857
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005858 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5859 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5860 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5861 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005862 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005863 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5864 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005865
5866 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5867
5868 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005869 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005870
5871 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5872 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005873 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5874 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005875
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005876 if (Opts.UnsafeFPMath)
5877 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005878
5879 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5880
5881 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5882 Opts.ShortEnums ? "1" : "4");
5883
James Molloy75f5f9e2014-04-16 15:33:48 +00005884 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005885 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005886 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005887 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005888 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005889
Bradley Smith418c5932014-05-02 15:17:51 +00005890 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005891 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005892
James Molloy75f5f9e2014-04-16 15:33:48 +00005893 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005894 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5895
5896 if (Unaligned)
5897 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005898
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005899 if (V8_1A)
5900 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5901
Reid Klecknerd167d422015-05-06 15:31:46 +00005902 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5903 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5904 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5905 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5906 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005907 }
5908
Craig Topper6c03a542015-10-19 04:51:35 +00005909 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5910 return llvm::makeArrayRef(BuiltinInfo,
5911 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005912 }
5913
David Blaikie1cbb9712014-11-14 19:09:44 +00005914 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005915 return Feature == "aarch64" ||
5916 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005917 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005918 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005919 }
5920
James Molloy5e73df52014-04-16 15:06:20 +00005921 bool handleTargetFeatures(std::vector<std::string> &Features,
5922 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005923 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005924 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005925 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005926 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005927 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005928
Eric Christopher610fe112015-08-26 08:21:55 +00005929 for (const auto &Feature : Features) {
5930 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005931 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005932 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005933 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005934 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005935 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005936 if (Feature == "+strict-align")
5937 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005938 if (Feature == "+v8.1a")
5939 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005940 }
5941
James Y Knightb214cbc2016-03-04 19:00:41 +00005942 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005943
5944 return true;
5945 }
5946
John McCall477f2bb2016-03-03 06:39:32 +00005947 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5948 switch (CC) {
5949 case CC_C:
5950 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005951 case CC_PreserveMost:
5952 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005953 return CCCR_OK;
5954 default:
5955 return CCCR_Warning;
5956 }
5957 }
5958
David Blaikie1cbb9712014-11-14 19:09:44 +00005959 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005960
David Blaikie1cbb9712014-11-14 19:09:44 +00005961 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005962 return TargetInfo::AArch64ABIBuiltinVaList;
5963 }
5964
Craig Topperf054e3a2015-10-19 03:52:27 +00005965 ArrayRef<const char *> getGCCRegNames() const override;
5966 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005967
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005968 bool validateAsmConstraint(const char *&Name,
5969 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005970 switch (*Name) {
5971 default:
5972 return false;
5973 case 'w': // Floating point and SIMD registers (V0-V31)
5974 Info.setAllowsRegister();
5975 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005976 case 'I': // Constant that can be used with an ADD instruction
5977 case 'J': // Constant that can be used with a SUB instruction
5978 case 'K': // Constant that can be used with a 32-bit logical instruction
5979 case 'L': // Constant that can be used with a 64-bit logical instruction
5980 case 'M': // Constant that can be used as a 32-bit MOV immediate
5981 case 'N': // Constant that can be used as a 64-bit MOV immediate
5982 case 'Y': // Floating point constant zero
5983 case 'Z': // Integer constant zero
5984 return true;
5985 case 'Q': // A memory reference with base register and no offset
5986 Info.setAllowsMemory();
5987 return true;
5988 case 'S': // A symbolic address
5989 Info.setAllowsRegister();
5990 return true;
5991 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005992 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5993 // Utf: A memory address suitable for ldp/stp in TF mode.
5994 // Usa: An absolute symbolic address.
5995 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5996 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005997 case 'z': // Zero register, wzr or xzr
5998 Info.setAllowsRegister();
5999 return true;
6000 case 'x': // Floating point and SIMD registers (V0-V15)
6001 Info.setAllowsRegister();
6002 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006003 }
6004 return false;
6005 }
6006
Akira Hatanaka987f1862014-08-22 06:05:21 +00006007 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006008 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006009 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006010 // Strip off constraint modifiers.
6011 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6012 Constraint = Constraint.substr(1);
6013
6014 switch (Constraint[0]) {
6015 default:
6016 return true;
6017 case 'z':
6018 case 'r': {
6019 switch (Modifier) {
6020 case 'x':
6021 case 'w':
6022 // For now assume that the person knows what they're
6023 // doing with the modifier.
6024 return true;
6025 default:
6026 // By default an 'r' constraint will be in the 'x'
6027 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006028 if (Size == 64)
6029 return true;
6030
6031 SuggestedModifier = "w";
6032 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006033 }
6034 }
6035 }
6036 }
6037
David Blaikie1cbb9712014-11-14 19:09:44 +00006038 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006039
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006040 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006041 if (RegNo == 0)
6042 return 0;
6043 if (RegNo == 1)
6044 return 1;
6045 return -1;
6046 }
6047};
6048
Tim Northover573cbee2014-05-24 12:52:07 +00006049const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006050 // 32-bit Integer registers
6051 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6052 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6053 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6054
6055 // 64-bit Integer registers
6056 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6057 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6058 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6059
6060 // 32-bit floating point regsisters
6061 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6062 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6063 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6064
6065 // 64-bit floating point regsisters
6066 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6067 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6068 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6069
6070 // Vector registers
6071 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6072 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6073 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6074};
6075
Craig Topperf054e3a2015-10-19 03:52:27 +00006076ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6077 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006078}
6079
Tim Northover573cbee2014-05-24 12:52:07 +00006080const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006081 { { "w31" }, "wsp" },
6082 { { "x29" }, "fp" },
6083 { { "x30" }, "lr" },
6084 { { "x31" }, "sp" },
6085 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6086 // don't want to substitute one of these for a different-sized one.
6087};
6088
Craig Topperf054e3a2015-10-19 03:52:27 +00006089ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6090 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006091}
6092
Tim Northover573cbee2014-05-24 12:52:07 +00006093const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006094#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006095 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006096#include "clang/Basic/BuiltinsNEON.def"
6097
6098#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006099 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006100#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006101};
James Molloy5e73df52014-04-16 15:06:20 +00006102
Tim Northover573cbee2014-05-24 12:52:07 +00006103class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006104 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006105 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006106 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006107 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006108 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006109 }
6110
6111public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006112 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6113 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006114 }
James Molloy5e73df52014-04-16 15:06:20 +00006115 void getTargetDefines(const LangOptions &Opts,
6116 MacroBuilder &Builder) const override {
6117 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006118 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006119 }
6120};
6121
Tim Northover573cbee2014-05-24 12:52:07 +00006122class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006123 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006124 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006125 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006126 }
6127
6128public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006129 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6130 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006131 void getTargetDefines(const LangOptions &Opts,
6132 MacroBuilder &Builder) const override {
6133 Builder.defineMacro("__AARCH64EB__");
6134 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6135 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006136 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006137 }
6138};
Tim Northovera2ee4332014-03-29 15:09:45 +00006139
Tim Northover573cbee2014-05-24 12:52:07 +00006140class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006141protected:
6142 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6143 MacroBuilder &Builder) const override {
6144 Builder.defineMacro("__AARCH64_SIMD__");
6145 Builder.defineMacro("__ARM64_ARCH_8__");
6146 Builder.defineMacro("__ARM_NEON__");
6147 Builder.defineMacro("__LITTLE_ENDIAN__");
6148 Builder.defineMacro("__REGISTER_PREFIX__", "");
6149 Builder.defineMacro("__arm64", "1");
6150 Builder.defineMacro("__arm64__", "1");
6151
6152 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6153 }
6154
Tim Northovera2ee4332014-03-29 15:09:45 +00006155public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006156 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6157 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006158 Int64Type = SignedLongLong;
6159 WCharType = SignedInt;
6160 UseSignedCharForObjCBool = false;
6161
Tim Northovera6a19f12015-02-06 01:25:07 +00006162 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006163 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6164
6165 TheCXXABI.set(TargetCXXABI::iOS64);
6166 }
6167
David Blaikie1cbb9712014-11-14 19:09:44 +00006168 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006169 return TargetInfo::CharPtrBuiltinVaList;
6170 }
6171};
Tim Northovera2ee4332014-03-29 15:09:45 +00006172
Tony Linthicum76329bf2011-12-12 21:14:55 +00006173// Hexagon abstract base class
6174class HexagonTargetInfo : public TargetInfo {
6175 static const Builtin::Info BuiltinInfo[];
6176 static const char * const GCCRegNames[];
6177 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6178 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006179 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006180 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006181
Tony Linthicum76329bf2011-12-12 21:14:55 +00006182public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006183 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6184 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006185 // Specify the vector alignment explicitly. For v512x1, the calculated
6186 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6187 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006188 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006189 "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 +00006190 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006191 SizeType = UnsignedInt;
6192 PtrDiffType = SignedInt;
6193 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006194
6195 // {} in inline assembly are packet specifiers, not assembly variant
6196 // specifiers.
6197 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006198
6199 LargeArrayMinWidth = 64;
6200 LargeArrayAlign = 64;
6201 UseBitFieldTypeAlignment = true;
6202 ZeroLengthBitfieldBoundary = 32;
6203 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006204 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006205 }
6206
Craig Topper6c03a542015-10-19 04:51:35 +00006207 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6208 return llvm::makeArrayRef(BuiltinInfo,
6209 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006210 }
6211
Craig Topper3164f332014-03-11 03:39:26 +00006212 bool validateAsmConstraint(const char *&Name,
6213 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006214 switch (*Name) {
6215 case 'v':
6216 case 'q':
6217 if (HasHVX) {
6218 Info.setAllowsRegister();
6219 return true;
6220 }
6221 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006222 case 's':
6223 // Relocatable constant.
6224 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006225 }
6226 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006227 }
6228
Craig Topper3164f332014-03-11 03:39:26 +00006229 void getTargetDefines(const LangOptions &Opts,
6230 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006231
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006232 bool isCLZForZeroUndef() const override { return false; }
6233
Craig Topper3164f332014-03-11 03:39:26 +00006234 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006235 return llvm::StringSwitch<bool>(Feature)
6236 .Case("hexagon", true)
6237 .Case("hvx", HasHVX)
6238 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006239 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006240 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006241 }
Craig Topper3164f332014-03-11 03:39:26 +00006242
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006243 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6244 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6245 const override;
6246
6247 bool handleTargetFeatures(std::vector<std::string> &Features,
6248 DiagnosticsEngine &Diags) override;
6249
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006250 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6251 bool Enabled) const override;
6252
Craig Topper3164f332014-03-11 03:39:26 +00006253 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006254 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006255 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006256 ArrayRef<const char *> getGCCRegNames() const override;
6257 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006258 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006259 return "";
6260 }
Sebastian Pop86500282012-01-13 20:37:10 +00006261
6262 static const char *getHexagonCPUSuffix(StringRef Name) {
6263 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006264 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006265 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006266 .Case("hexagonv55", "55")
6267 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006268 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006269 }
6270
Craig Topper3164f332014-03-11 03:39:26 +00006271 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006272 if (!getHexagonCPUSuffix(Name))
6273 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006274 CPU = Name;
6275 return true;
6276 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006277
6278 int getEHDataRegisterNumber(unsigned RegNo) const override {
6279 return RegNo < 2 ? RegNo : -1;
6280 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006281};
6282
6283void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006284 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006285 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006286 Builder.defineMacro("__hexagon__", "1");
6287
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006288 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006289 Builder.defineMacro("__HEXAGON_V4__");
6290 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006291 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006292 Builder.defineMacro("__QDSP6_V4__");
6293 Builder.defineMacro("__QDSP6_ARCH__", "4");
6294 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006295 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006296 Builder.defineMacro("__HEXAGON_V5__");
6297 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6298 if(Opts.HexagonQdsp6Compat) {
6299 Builder.defineMacro("__QDSP6_V5__");
6300 Builder.defineMacro("__QDSP6_ARCH__", "5");
6301 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006302 } else if (CPU == "hexagonv55") {
6303 Builder.defineMacro("__HEXAGON_V55__");
6304 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6305 Builder.defineMacro("__QDSP6_V55__");
6306 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006307 } else if (CPU == "hexagonv60") {
6308 Builder.defineMacro("__HEXAGON_V60__");
6309 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6310 Builder.defineMacro("__QDSP6_V60__");
6311 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006312 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006313
6314 if (hasFeature("hvx")) {
6315 Builder.defineMacro("__HVX__");
6316 if (hasFeature("hvx-double"))
6317 Builder.defineMacro("__HVXDBL__");
6318 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006319}
6320
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006321bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6322 DiagnosticsEngine &Diags, StringRef CPU,
6323 const std::vector<std::string> &FeaturesVec) const {
6324 // Default for v60: -hvx, -hvx-double.
6325 Features["hvx"] = false;
6326 Features["hvx-double"] = false;
6327 Features["long-calls"] = false;
6328
6329 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6330}
6331
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006332bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6333 DiagnosticsEngine &Diags) {
6334 for (auto &F : Features) {
6335 if (F == "+hvx")
6336 HasHVX = true;
6337 else if (F == "-hvx")
6338 HasHVX = HasHVXDouble = false;
6339 else if (F == "+hvx-double")
6340 HasHVX = HasHVXDouble = true;
6341 else if (F == "-hvx-double")
6342 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006343
6344 if (F == "+long-calls")
6345 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006346 else if (F == "-long-calls")
6347 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006348 }
6349 return true;
6350}
6351
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006352void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6353 StringRef Name, bool Enabled) const {
6354 if (Enabled) {
6355 if (Name == "hvx-double")
6356 Features["hvx"] = true;
6357 } else {
6358 if (Name == "hvx")
6359 Features["hvx-double"] = false;
6360 }
6361 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006362}
6363
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006364const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006365 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6366 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6367 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6368 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6369 "p0", "p1", "p2", "p3",
6370 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6371};
6372
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006373ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006374 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006375}
6376
Tony Linthicum76329bf2011-12-12 21:14:55 +00006377const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6378 { { "sp" }, "r29" },
6379 { { "fp" }, "r30" },
6380 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006381};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006382
Craig Topperf054e3a2015-10-19 03:52:27 +00006383ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6384 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006385}
6386
6387
6388const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006389#define BUILTIN(ID, TYPE, ATTRS) \
6390 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6391#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6392 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006393#include "clang/Basic/BuiltinsHexagon.def"
6394};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006395
Jacques Pienaard964cc22016-03-28 21:02:54 +00006396class LanaiTargetInfo : public TargetInfo {
6397 // Class for Lanai (32-bit).
6398 // The CPU profiles supported by the Lanai backend
6399 enum CPUKind {
6400 CK_NONE,
6401 CK_V11,
6402 } CPU;
6403
6404 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6405 static const char *const GCCRegNames[];
6406
6407public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006408 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6409 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006410 // Description string has to be kept in sync with backend.
6411 resetDataLayout("E" // Big endian
6412 "-m:e" // ELF name manging
6413 "-p:32:32" // 32 bit pointers, 32 bit aligned
6414 "-i64:64" // 64 bit integers, 64 bit aligned
6415 "-a:0:32" // 32 bit alignment of objects of aggregate type
6416 "-n32" // 32 bit native integer width
6417 "-S64" // 64 bit natural stack alignment
6418 );
6419
6420 // Setting RegParmMax equal to what mregparm was set to in the old
6421 // toolchain
6422 RegParmMax = 4;
6423
6424 // Set the default CPU to V11
6425 CPU = CK_V11;
6426
6427 // Temporary approach to make everything at least word-aligned and allow for
6428 // safely casting between pointers with different alignment requirements.
6429 // TODO: Remove this when there are no more cast align warnings on the
6430 // firmware.
6431 MinGlobalAlign = 32;
6432 }
6433
6434 void getTargetDefines(const LangOptions &Opts,
6435 MacroBuilder &Builder) const override {
6436 // Define __lanai__ when building for target lanai.
6437 Builder.defineMacro("__lanai__");
6438
6439 // Set define for the CPU specified.
6440 switch (CPU) {
6441 case CK_V11:
6442 Builder.defineMacro("__LANAI_V11__");
6443 break;
6444 case CK_NONE:
6445 llvm_unreachable("Unhandled target CPU");
6446 }
6447 }
6448
6449 bool setCPU(const std::string &Name) override {
6450 CPU = llvm::StringSwitch<CPUKind>(Name)
6451 .Case("v11", CK_V11)
6452 .Default(CK_NONE);
6453
6454 return CPU != CK_NONE;
6455 }
6456
6457 bool hasFeature(StringRef Feature) const override {
6458 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6459 }
6460
6461 ArrayRef<const char *> getGCCRegNames() const override;
6462
6463 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6464
6465 BuiltinVaListKind getBuiltinVaListKind() const override {
6466 return TargetInfo::VoidPtrBuiltinVaList;
6467 }
6468
6469 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6470
6471 bool validateAsmConstraint(const char *&Name,
6472 TargetInfo::ConstraintInfo &info) const override {
6473 return false;
6474 }
6475
6476 const char *getClobbers() const override { return ""; }
6477};
6478
6479const char *const LanaiTargetInfo::GCCRegNames[] = {
6480 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6481 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6482 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6483
6484ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6485 return llvm::makeArrayRef(GCCRegNames);
6486}
6487
6488const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6489 {{"pc"}, "r2"},
6490 {{"sp"}, "r4"},
6491 {{"fp"}, "r5"},
6492 {{"rv"}, "r8"},
6493 {{"rr1"}, "r10"},
6494 {{"rr2"}, "r11"},
6495 {{"rca"}, "r15"},
6496};
6497
6498ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6499 return llvm::makeArrayRef(GCCRegAliases);
6500}
6501
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006502// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6503class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006504 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6505 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006506 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006507public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006508 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006509 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006510
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006511 int getEHDataRegisterNumber(unsigned RegNo) const override {
6512 if (RegNo == 0) return 24;
6513 if (RegNo == 1) return 25;
6514 return -1;
6515 }
6516
Craig Topper3164f332014-03-11 03:39:26 +00006517 bool handleTargetFeatures(std::vector<std::string> &Features,
6518 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006519 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006520 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6521 if (Feature != Features.end()) {
6522 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006523 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006524 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006525 }
Craig Topper3164f332014-03-11 03:39:26 +00006526 void getTargetDefines(const LangOptions &Opts,
6527 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006528 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006529 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006530
6531 if (SoftFloat)
6532 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006533 }
Craig Topper3164f332014-03-11 03:39:26 +00006534
6535 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006536 return llvm::StringSwitch<bool>(Feature)
6537 .Case("softfloat", SoftFloat)
6538 .Case("sparc", true)
6539 .Default(false);
6540 }
Craig Topper3164f332014-03-11 03:39:26 +00006541
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006542 bool hasSjLjLowering() const override {
6543 return true;
6544 }
6545
Craig Topper6c03a542015-10-19 04:51:35 +00006546 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006547 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006548 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006549 }
Craig Topper3164f332014-03-11 03:39:26 +00006550 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006551 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006552 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006553 ArrayRef<const char *> getGCCRegNames() const override;
6554 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006555 bool validateAsmConstraint(const char *&Name,
6556 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006557 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006558 switch (*Name) {
6559 case 'I': // Signed 13-bit constant
6560 case 'J': // Zero
6561 case 'K': // 32-bit constant with the low 12 bits clear
6562 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6563 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6564 case 'N': // Same as 'K' but zext (required for SIMode)
6565 case 'O': // The constant 4096
6566 return true;
6567 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006568 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006569 }
Craig Topper3164f332014-03-11 03:39:26 +00006570 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006571 // FIXME: Implement!
6572 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006573 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006574
6575 // No Sparc V7 for now, the backend doesn't support it anyway.
6576 enum CPUKind {
6577 CK_GENERIC,
6578 CK_V8,
6579 CK_SUPERSPARC,
6580 CK_SPARCLITE,
6581 CK_F934,
6582 CK_HYPERSPARC,
6583 CK_SPARCLITE86X,
6584 CK_SPARCLET,
6585 CK_TSC701,
6586 CK_V9,
6587 CK_ULTRASPARC,
6588 CK_ULTRASPARC3,
6589 CK_NIAGARA,
6590 CK_NIAGARA2,
6591 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006592 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006593 CK_MYRIAD2100,
6594 CK_MYRIAD2150,
6595 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006596 CK_LEON2,
6597 CK_LEON2_AT697E,
6598 CK_LEON2_AT697F,
6599 CK_LEON3,
6600 CK_LEON3_UT699,
6601 CK_LEON3_GR712RC,
6602 CK_LEON4,
6603 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006604 } CPU = CK_GENERIC;
6605
6606 enum CPUGeneration {
6607 CG_V8,
6608 CG_V9,
6609 };
6610
6611 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6612 switch (Kind) {
6613 case CK_GENERIC:
6614 case CK_V8:
6615 case CK_SUPERSPARC:
6616 case CK_SPARCLITE:
6617 case CK_F934:
6618 case CK_HYPERSPARC:
6619 case CK_SPARCLITE86X:
6620 case CK_SPARCLET:
6621 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006622 case CK_MYRIAD2100:
6623 case CK_MYRIAD2150:
6624 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006625 case CK_LEON2:
6626 case CK_LEON2_AT697E:
6627 case CK_LEON2_AT697F:
6628 case CK_LEON3:
6629 case CK_LEON3_UT699:
6630 case CK_LEON3_GR712RC:
6631 case CK_LEON4:
6632 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006633 return CG_V8;
6634 case CK_V9:
6635 case CK_ULTRASPARC:
6636 case CK_ULTRASPARC3:
6637 case CK_NIAGARA:
6638 case CK_NIAGARA2:
6639 case CK_NIAGARA3:
6640 case CK_NIAGARA4:
6641 return CG_V9;
6642 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006643 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006644 }
6645
6646 CPUKind getCPUKind(StringRef Name) const {
6647 return llvm::StringSwitch<CPUKind>(Name)
6648 .Case("v8", CK_V8)
6649 .Case("supersparc", CK_SUPERSPARC)
6650 .Case("sparclite", CK_SPARCLITE)
6651 .Case("f934", CK_F934)
6652 .Case("hypersparc", CK_HYPERSPARC)
6653 .Case("sparclite86x", CK_SPARCLITE86X)
6654 .Case("sparclet", CK_SPARCLET)
6655 .Case("tsc701", CK_TSC701)
6656 .Case("v9", CK_V9)
6657 .Case("ultrasparc", CK_ULTRASPARC)
6658 .Case("ultrasparc3", CK_ULTRASPARC3)
6659 .Case("niagara", CK_NIAGARA)
6660 .Case("niagara2", CK_NIAGARA2)
6661 .Case("niagara3", CK_NIAGARA3)
6662 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006663 .Case("ma2100", CK_MYRIAD2100)
6664 .Case("ma2150", CK_MYRIAD2150)
6665 .Case("ma2450", CK_MYRIAD2450)
6666 // FIXME: the myriad2[.n] spellings are obsolete,
6667 // but a grace period is needed to allow updating dependent builds.
6668 .Case("myriad2", CK_MYRIAD2100)
6669 .Case("myriad2.1", CK_MYRIAD2100)
6670 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006671 .Case("leon2", CK_LEON2)
6672 .Case("at697e", CK_LEON2_AT697E)
6673 .Case("at697f", CK_LEON2_AT697F)
6674 .Case("leon3", CK_LEON3)
6675 .Case("ut699", CK_LEON3_UT699)
6676 .Case("gr712rc", CK_LEON3_GR712RC)
6677 .Case("leon4", CK_LEON4)
6678 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006679 .Default(CK_GENERIC);
6680 }
6681
6682 bool setCPU(const std::string &Name) override {
6683 CPU = getCPUKind(Name);
6684 return CPU != CK_GENERIC;
6685 }
Gabor Greif49991682008-02-21 16:29:08 +00006686};
6687
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006688const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006689 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6690 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6691 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6692 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6693};
6694
Craig Topperf054e3a2015-10-19 03:52:27 +00006695ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6696 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006697}
6698
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006699const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006700 { { "g0" }, "r0" },
6701 { { "g1" }, "r1" },
6702 { { "g2" }, "r2" },
6703 { { "g3" }, "r3" },
6704 { { "g4" }, "r4" },
6705 { { "g5" }, "r5" },
6706 { { "g6" }, "r6" },
6707 { { "g7" }, "r7" },
6708 { { "o0" }, "r8" },
6709 { { "o1" }, "r9" },
6710 { { "o2" }, "r10" },
6711 { { "o3" }, "r11" },
6712 { { "o4" }, "r12" },
6713 { { "o5" }, "r13" },
6714 { { "o6", "sp" }, "r14" },
6715 { { "o7" }, "r15" },
6716 { { "l0" }, "r16" },
6717 { { "l1" }, "r17" },
6718 { { "l2" }, "r18" },
6719 { { "l3" }, "r19" },
6720 { { "l4" }, "r20" },
6721 { { "l5" }, "r21" },
6722 { { "l6" }, "r22" },
6723 { { "l7" }, "r23" },
6724 { { "i0" }, "r24" },
6725 { { "i1" }, "r25" },
6726 { { "i2" }, "r26" },
6727 { { "i3" }, "r27" },
6728 { { "i4" }, "r28" },
6729 { { "i5" }, "r29" },
6730 { { "i6", "fp" }, "r30" },
6731 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006732};
6733
Craig Topperf054e3a2015-10-19 03:52:27 +00006734ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6735 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006736}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006737
6738// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6739class SparcV8TargetInfo : public SparcTargetInfo {
6740public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006741 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6742 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006743 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006744 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6745 switch (getTriple().getOS()) {
6746 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006747 SizeType = UnsignedInt;
6748 IntPtrType = SignedInt;
6749 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006750 break;
6751 case llvm::Triple::NetBSD:
6752 case llvm::Triple::OpenBSD:
6753 SizeType = UnsignedLong;
6754 IntPtrType = SignedLong;
6755 PtrDiffType = SignedLong;
6756 break;
Brad Smith56495d52015-08-13 22:00:53 +00006757 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006758 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006759 }
6760
Craig Topper3164f332014-03-11 03:39:26 +00006761 void getTargetDefines(const LangOptions &Opts,
6762 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006763 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006764 switch (getCPUGeneration(CPU)) {
6765 case CG_V8:
6766 Builder.defineMacro("__sparcv8");
6767 if (getTriple().getOS() != llvm::Triple::Solaris)
6768 Builder.defineMacro("__sparcv8__");
6769 break;
6770 case CG_V9:
6771 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006772 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006773 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006774 Builder.defineMacro("__sparc_v9__");
6775 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006776 break;
6777 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006778 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006779 std::string MyriadArchValue, Myriad2Value;
6780 Builder.defineMacro("__sparc_v8__");
6781 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006782 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006783 case CK_MYRIAD2150:
6784 MyriadArchValue = "__ma2150";
6785 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006786 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006787 case CK_MYRIAD2450:
6788 MyriadArchValue = "__ma2450";
6789 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006790 break;
6791 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006792 MyriadArchValue = "__ma2100";
6793 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006794 break;
6795 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006796 Builder.defineMacro(MyriadArchValue, "1");
6797 Builder.defineMacro(MyriadArchValue+"__", "1");
6798 Builder.defineMacro("__myriad2__", Myriad2Value);
6799 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006800 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006801 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006802
6803 bool hasSjLjLowering() const override {
6804 return true;
6805 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006806};
6807
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006808// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6809class SparcV8elTargetInfo : public SparcV8TargetInfo {
6810 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006811 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6812 : SparcV8TargetInfo(Triple, Opts) {
6813 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006814 }
6815};
6816
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006817// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6818class SparcV9TargetInfo : public SparcTargetInfo {
6819public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006820 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6821 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006822 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006823 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006824 // This is an LP64 platform.
6825 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006826
6827 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006828 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006829 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006830 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006831 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006832 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006833
6834 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6835 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6836 LongDoubleWidth = 128;
6837 LongDoubleAlign = 128;
6838 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006839 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006840 }
6841
Craig Topper3164f332014-03-11 03:39:26 +00006842 void getTargetDefines(const LangOptions &Opts,
6843 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006844 SparcTargetInfo::getTargetDefines(Opts, Builder);
6845 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006846 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006847 // Solaris doesn't need these variants, but the BSDs do.
6848 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006849 Builder.defineMacro("__sparc64__");
6850 Builder.defineMacro("__sparc_v9__");
6851 Builder.defineMacro("__sparcv9__");
6852 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006853 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006854
Craig Topper3164f332014-03-11 03:39:26 +00006855 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006856 if (!SparcTargetInfo::setCPU(Name))
6857 return false;
6858 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006859 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006860};
6861
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006862class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006863 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006864 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006865 std::string CPU;
6866 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006867 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006868
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006869public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006870 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006871 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6872 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006873 IntMaxType = SignedLong;
6874 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006875 TLSSupported = true;
6876 IntWidth = IntAlign = 32;
6877 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6878 PointerWidth = PointerAlign = 64;
6879 LongDoubleWidth = 128;
6880 LongDoubleAlign = 64;
6881 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006882 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006883 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006884 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 +00006885 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6886 }
6887 void getTargetDefines(const LangOptions &Opts,
6888 MacroBuilder &Builder) const override {
6889 Builder.defineMacro("__s390__");
6890 Builder.defineMacro("__s390x__");
6891 Builder.defineMacro("__zarch__");
6892 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006893
6894 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6895 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6896 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6897 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6898
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006899 if (HasTransactionalExecution)
6900 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006901 if (Opts.ZVector)
6902 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006903 }
Craig Topper6c03a542015-10-19 04:51:35 +00006904 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6905 return llvm::makeArrayRef(BuiltinInfo,
6906 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006907 }
6908
Craig Topperf054e3a2015-10-19 03:52:27 +00006909 ArrayRef<const char *> getGCCRegNames() const override;
6910 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006911 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006912 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006913 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006914 bool validateAsmConstraint(const char *&Name,
6915 TargetInfo::ConstraintInfo &info) const override;
6916 const char *getClobbers() const override {
6917 // FIXME: Is this really right?
6918 return "";
6919 }
6920 BuiltinVaListKind getBuiltinVaListKind() const override {
6921 return TargetInfo::SystemZBuiltinVaList;
6922 }
6923 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006924 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006925 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6926 .Case("z10", true)
6927 .Case("z196", true)
6928 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006929 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006930 .Default(false);
6931
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006932 return CPUKnown;
6933 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006934 bool
6935 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6936 StringRef CPU,
6937 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006938 if (CPU == "zEC12")
6939 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006940 if (CPU == "z13") {
6941 Features["transactional-execution"] = true;
6942 Features["vector"] = true;
6943 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006944 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006945 }
6946
6947 bool handleTargetFeatures(std::vector<std::string> &Features,
6948 DiagnosticsEngine &Diags) override {
6949 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006950 for (const auto &Feature : Features) {
6951 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006952 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006953 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006954 HasVector = true;
6955 }
6956 // If we use the vector ABI, vector types are 64-bit aligned.
6957 if (HasVector) {
6958 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006959 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6960 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006961 }
6962 return true;
6963 }
6964
6965 bool hasFeature(StringRef Feature) const override {
6966 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006967 .Case("systemz", true)
6968 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006969 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006970 .Default(false);
6971 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006972
Bryan Chane3f1ed52016-04-28 13:56:43 +00006973 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6974 switch (CC) {
6975 case CC_C:
6976 case CC_Swift:
6977 return CCCR_OK;
6978 default:
6979 return CCCR_Warning;
6980 }
6981 }
6982
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006983 StringRef getABI() const override {
6984 if (HasVector)
6985 return "vector";
6986 return "";
6987 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006988
6989 bool useFloat128ManglingForLongDouble() const override {
6990 return true;
6991 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006992};
6993
6994const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6995#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006996 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006997#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6998 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006999#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007000};
7001
7002const char *const SystemZTargetInfo::GCCRegNames[] = {
7003 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7004 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7005 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7006 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7007};
7008
Craig Topperf054e3a2015-10-19 03:52:27 +00007009ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7010 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007011}
7012
7013bool SystemZTargetInfo::
7014validateAsmConstraint(const char *&Name,
7015 TargetInfo::ConstraintInfo &Info) const {
7016 switch (*Name) {
7017 default:
7018 return false;
7019
7020 case 'a': // Address register
7021 case 'd': // Data register (equivalent to 'r')
7022 case 'f': // Floating-point register
7023 Info.setAllowsRegister();
7024 return true;
7025
7026 case 'I': // Unsigned 8-bit constant
7027 case 'J': // Unsigned 12-bit constant
7028 case 'K': // Signed 16-bit constant
7029 case 'L': // Signed 20-bit displacement (on all targets we support)
7030 case 'M': // 0x7fffffff
7031 return true;
7032
7033 case 'Q': // Memory with base and unsigned 12-bit displacement
7034 case 'R': // Likewise, plus an index
7035 case 'S': // Memory with base and signed 20-bit displacement
7036 case 'T': // Likewise, plus an index
7037 Info.setAllowsMemory();
7038 return true;
7039 }
7040}
Ulrich Weigand47445072013-05-06 16:26:41 +00007041
Eric Christopherc48497a2015-09-18 21:26:24 +00007042class MSP430TargetInfo : public TargetInfo {
7043 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007044
Eric Christopherc48497a2015-09-18 21:26:24 +00007045public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007046 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7047 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007048 TLSSupported = false;
7049 IntWidth = 16;
7050 IntAlign = 16;
7051 LongWidth = 32;
7052 LongLongWidth = 64;
7053 LongAlign = LongLongAlign = 16;
7054 PointerWidth = 16;
7055 PointerAlign = 16;
7056 SuitableAlign = 16;
7057 SizeType = UnsignedInt;
7058 IntMaxType = SignedLongLong;
7059 IntPtrType = SignedInt;
7060 PtrDiffType = SignedInt;
7061 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007062 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007063 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007064 void getTargetDefines(const LangOptions &Opts,
7065 MacroBuilder &Builder) const override {
7066 Builder.defineMacro("MSP430");
7067 Builder.defineMacro("__MSP430__");
7068 // FIXME: defines for different 'flavours' of MCU
7069 }
Craig Topper6c03a542015-10-19 04:51:35 +00007070 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007071 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007072 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007073 }
7074 bool hasFeature(StringRef Feature) const override {
7075 return Feature == "msp430";
7076 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007077 ArrayRef<const char *> getGCCRegNames() const override;
7078 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007079 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007080 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007081 }
7082 bool validateAsmConstraint(const char *&Name,
7083 TargetInfo::ConstraintInfo &info) const override {
7084 // FIXME: implement
7085 switch (*Name) {
7086 case 'K': // the constant 1
7087 case 'L': // constant -1^20 .. 1^19
7088 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007089 return true;
7090 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007091 // No target constraints for now.
7092 return false;
7093 }
7094 const char *getClobbers() const override {
7095 // FIXME: Is this really right?
7096 return "";
7097 }
7098 BuiltinVaListKind getBuiltinVaListKind() const override {
7099 // FIXME: implement
7100 return TargetInfo::CharPtrBuiltinVaList;
7101 }
7102};
7103
7104const char *const MSP430TargetInfo::GCCRegNames[] = {
7105 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7106 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7107
Craig Topperf054e3a2015-10-19 03:52:27 +00007108ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7109 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007110}
7111
7112// LLVM and Clang cannot be used directly to output native binaries for
7113// target, but is used to compile C code to llvm bitcode with correct
7114// type and alignment information.
7115//
7116// TCE uses the llvm bitcode as input and uses it for generating customized
7117// target processor and program binary. TCE co-design environment is
7118// publicly available in http://tce.cs.tut.fi
7119
7120static const unsigned TCEOpenCLAddrSpaceMap[] = {
7121 3, // opencl_global
7122 4, // opencl_local
7123 5, // opencl_constant
7124 // FIXME: generic has to be added to the target
7125 0, // opencl_generic
7126 0, // cuda_device
7127 0, // cuda_constant
7128 0 // cuda_shared
7129};
7130
7131class TCETargetInfo : public TargetInfo {
7132public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007133 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7134 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007135 TLSSupported = false;
7136 IntWidth = 32;
7137 LongWidth = LongLongWidth = 32;
7138 PointerWidth = 32;
7139 IntAlign = 32;
7140 LongAlign = LongLongAlign = 32;
7141 PointerAlign = 32;
7142 SuitableAlign = 32;
7143 SizeType = UnsignedInt;
7144 IntMaxType = SignedLong;
7145 IntPtrType = SignedInt;
7146 PtrDiffType = SignedInt;
7147 FloatWidth = 32;
7148 FloatAlign = 32;
7149 DoubleWidth = 32;
7150 DoubleAlign = 32;
7151 LongDoubleWidth = 32;
7152 LongDoubleAlign = 32;
7153 FloatFormat = &llvm::APFloat::IEEEsingle;
7154 DoubleFormat = &llvm::APFloat::IEEEsingle;
7155 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007156 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7157 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007158 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7159 UseAddrSpaceMapMangling = true;
7160 }
7161
7162 void getTargetDefines(const LangOptions &Opts,
7163 MacroBuilder &Builder) const override {
7164 DefineStd(Builder, "tce", Opts);
7165 Builder.defineMacro("__TCE__");
7166 Builder.defineMacro("__TCE_V1__");
7167 }
7168 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7169
Craig Topper6c03a542015-10-19 04:51:35 +00007170 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007171 const char *getClobbers() const override { return ""; }
7172 BuiltinVaListKind getBuiltinVaListKind() const override {
7173 return TargetInfo::VoidPtrBuiltinVaList;
7174 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007175 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007176 bool validateAsmConstraint(const char *&Name,
7177 TargetInfo::ConstraintInfo &info) const override {
7178 return true;
7179 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007180 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7181 return None;
7182 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007183};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007184
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007185class BPFTargetInfo : public TargetInfo {
7186public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007187 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7188 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007189 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7190 SizeType = UnsignedLong;
7191 PtrDiffType = SignedLong;
7192 IntPtrType = SignedLong;
7193 IntMaxType = SignedLong;
7194 Int64Type = SignedLong;
7195 RegParmMax = 5;
7196 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007197 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007198 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007199 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007200 }
7201 MaxAtomicPromoteWidth = 64;
7202 MaxAtomicInlineWidth = 64;
7203 TLSSupported = false;
7204 }
7205 void getTargetDefines(const LangOptions &Opts,
7206 MacroBuilder &Builder) const override {
7207 DefineStd(Builder, "bpf", Opts);
7208 Builder.defineMacro("__BPF__");
7209 }
7210 bool hasFeature(StringRef Feature) const override {
7211 return Feature == "bpf";
7212 }
7213
Craig Topper6c03a542015-10-19 04:51:35 +00007214 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007215 const char *getClobbers() const override {
7216 return "";
7217 }
7218 BuiltinVaListKind getBuiltinVaListKind() const override {
7219 return TargetInfo::VoidPtrBuiltinVaList;
7220 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007221 ArrayRef<const char *> getGCCRegNames() const override {
7222 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007223 }
7224 bool validateAsmConstraint(const char *&Name,
7225 TargetInfo::ConstraintInfo &info) const override {
7226 return true;
7227 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007228 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7229 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007230 }
7231};
7232
Daniel Sanders4672af62016-05-27 11:51:02 +00007233class MipsTargetInfo : public TargetInfo {
7234 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007235 StringRef Layout;
7236
7237 if (ABI == "o32")
7238 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7239 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007240 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007241 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007242 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007243 else
7244 llvm_unreachable("Invalid ABI");
7245
7246 if (BigEndian)
7247 resetDataLayout(("E-" + Layout).str());
7248 else
7249 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007250 }
7251
Akira Hatanaka9064e362013-10-29 18:30:33 +00007252
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007253 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007254 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007255 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007256 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007257 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007258 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007259 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007260 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007261 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007262 enum DspRevEnum {
7263 NoDSP, DSP1, DSP2
7264 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007265 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007266
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007267protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007268 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007269 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007270
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007271public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007272 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007273 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7274 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7275 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007276 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007277
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007278 setABI((getTriple().getArch() == llvm::Triple::mips ||
7279 getTriple().getArch() == llvm::Triple::mipsel)
7280 ? "o32"
7281 : "n64");
7282
7283 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007284 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007285
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007286 bool isNaN2008Default() const {
7287 return CPU == "mips32r6" || CPU == "mips64r6";
7288 }
7289
7290 bool isFP64Default() const {
7291 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7292 }
7293
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007294 bool isNan2008() const override {
7295 return IsNan2008;
7296 }
7297
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007298 bool processorSupportsGPR64() const {
7299 return llvm::StringSwitch<bool>(CPU)
7300 .Case("mips3", true)
7301 .Case("mips4", true)
7302 .Case("mips5", true)
7303 .Case("mips64", true)
7304 .Case("mips64r2", true)
7305 .Case("mips64r3", true)
7306 .Case("mips64r5", true)
7307 .Case("mips64r6", true)
7308 .Case("octeon", true)
7309 .Default(false);
7310 return false;
7311 }
7312
Alp Toker4925ba72014-06-07 23:30:42 +00007313 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007314 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007315 if (Name == "o32") {
7316 setO32ABITypes();
7317 ABI = Name;
7318 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007319 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007320
7321 if (Name == "n32") {
7322 setN32ABITypes();
7323 ABI = Name;
7324 return true;
7325 }
7326 if (Name == "n64") {
7327 setN64ABITypes();
7328 ABI = Name;
7329 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007330 }
7331 return false;
7332 }
7333
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007334 void setO32ABITypes() {
7335 Int64Type = SignedLongLong;
7336 IntMaxType = Int64Type;
7337 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7338 LongDoubleWidth = LongDoubleAlign = 64;
7339 LongWidth = LongAlign = 32;
7340 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7341 PointerWidth = PointerAlign = 32;
7342 PtrDiffType = SignedInt;
7343 SizeType = UnsignedInt;
7344 SuitableAlign = 64;
7345 }
7346
7347 void setN32N64ABITypes() {
7348 LongDoubleWidth = LongDoubleAlign = 128;
7349 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7350 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7351 LongDoubleWidth = LongDoubleAlign = 64;
7352 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7353 }
7354 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7355 SuitableAlign = 128;
7356 }
7357
Daniel Sanders4672af62016-05-27 11:51:02 +00007358 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007359 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007360 Int64Type = SignedLong;
7361 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007362 LongWidth = LongAlign = 64;
7363 PointerWidth = PointerAlign = 64;
7364 PtrDiffType = SignedLong;
7365 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007366 }
7367
7368 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007369 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007370 Int64Type = SignedLongLong;
7371 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007372 LongWidth = LongAlign = 32;
7373 PointerWidth = PointerAlign = 32;
7374 PtrDiffType = SignedInt;
7375 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007376 }
7377
Craig Topper3164f332014-03-11 03:39:26 +00007378 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007379 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007380 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007381 .Case("mips1", true)
7382 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007383 .Case("mips3", true)
7384 .Case("mips4", true)
7385 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007386 .Case("mips32", true)
7387 .Case("mips32r2", true)
7388 .Case("mips32r3", true)
7389 .Case("mips32r5", true)
7390 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007391 .Case("mips64", true)
7392 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007393 .Case("mips64r3", true)
7394 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007395 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007396 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007397 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007398 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007399 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007400 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007401 bool
7402 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7403 StringRef CPU,
7404 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007405 if (CPU.empty())
7406 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007407 if (CPU == "octeon")
7408 Features["mips64r2"] = Features["cnmips"] = true;
7409 else
7410 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007411 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007412 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007413
Craig Topper3164f332014-03-11 03:39:26 +00007414 void getTargetDefines(const LangOptions &Opts,
7415 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007416 if (BigEndian) {
7417 DefineStd(Builder, "MIPSEB", Opts);
7418 Builder.defineMacro("_MIPSEB");
7419 } else {
7420 DefineStd(Builder, "MIPSEL", Opts);
7421 Builder.defineMacro("_MIPSEL");
7422 }
7423
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007424 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007425 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007426 if (Opts.GNUMode)
7427 Builder.defineMacro("mips");
7428
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007429 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007430 Builder.defineMacro("__mips", "32");
7431 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7432 } else {
7433 Builder.defineMacro("__mips", "64");
7434 Builder.defineMacro("__mips64");
7435 Builder.defineMacro("__mips64__");
7436 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7437 }
7438
7439 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7440 .Cases("mips32", "mips64", "1")
7441 .Cases("mips32r2", "mips64r2", "2")
7442 .Cases("mips32r3", "mips64r3", "3")
7443 .Cases("mips32r5", "mips64r5", "5")
7444 .Cases("mips32r6", "mips64r6", "6")
7445 .Default("");
7446 if (!ISARev.empty())
7447 Builder.defineMacro("__mips_isa_rev", ISARev);
7448
7449 if (ABI == "o32") {
7450 Builder.defineMacro("__mips_o32");
7451 Builder.defineMacro("_ABIO32", "1");
7452 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007453 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007454 Builder.defineMacro("__mips_n32");
7455 Builder.defineMacro("_ABIN32", "2");
7456 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7457 } else if (ABI == "n64") {
7458 Builder.defineMacro("__mips_n64");
7459 Builder.defineMacro("_ABI64", "3");
7460 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7461 } else
7462 llvm_unreachable("Invalid ABI.");
7463
Simon Atanasyan683535b2012-08-29 19:14:58 +00007464 Builder.defineMacro("__REGISTER_PREFIX__", "");
7465
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007466 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007467 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007468 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007469 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007470 case SoftFloat:
7471 Builder.defineMacro("__mips_soft_float", Twine(1));
7472 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007473 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007474
Simon Atanasyan16071912013-04-14 14:07:30 +00007475 if (IsSingleFloat)
7476 Builder.defineMacro("__mips_single_float", Twine(1));
7477
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007478 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7479 Builder.defineMacro("_MIPS_FPSET",
7480 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7481
Simon Atanasyan72244b62012-07-05 16:06:06 +00007482 if (IsMips16)
7483 Builder.defineMacro("__mips16", Twine(1));
7484
Simon Atanasyan60777612013-04-14 14:07:51 +00007485 if (IsMicromips)
7486 Builder.defineMacro("__mips_micromips", Twine(1));
7487
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007488 if (IsNan2008)
7489 Builder.defineMacro("__mips_nan2008", Twine(1));
7490
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007491 switch (DspRev) {
7492 default:
7493 break;
7494 case DSP1:
7495 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7496 Builder.defineMacro("__mips_dsp", Twine(1));
7497 break;
7498 case DSP2:
7499 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7500 Builder.defineMacro("__mips_dspr2", Twine(1));
7501 Builder.defineMacro("__mips_dsp", Twine(1));
7502 break;
7503 }
7504
Jack Carter44ff1e52013-08-12 17:20:29 +00007505 if (HasMSA)
7506 Builder.defineMacro("__mips_msa", Twine(1));
7507
Simon Atanasyan26f19672012-04-05 19:28:31 +00007508 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7509 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7510 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007511
7512 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7513 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007514
7515 // These shouldn't be defined for MIPS-I but there's no need to check
7516 // for that since MIPS-I isn't supported.
7517 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7518 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7519 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007520
7521 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7522 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7523 // the instructions exist but using them violates the ABI since they
7524 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7525 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007526 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007527 }
7528
Craig Topper6c03a542015-10-19 04:51:35 +00007529 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7530 return llvm::makeArrayRef(BuiltinInfo,
7531 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007532 }
Craig Topper3164f332014-03-11 03:39:26 +00007533 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007534 return llvm::StringSwitch<bool>(Feature)
7535 .Case("mips", true)
7536 .Case("fp64", HasFP64)
7537 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007538 }
Craig Topper3164f332014-03-11 03:39:26 +00007539 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007540 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007541 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007542 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007543 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007544 // CPU register names
7545 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007546 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7547 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7548 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007549 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7550 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007551 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7552 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7553 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7554 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007555 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007556 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007557 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7558 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007559 // MSA register names
7560 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7561 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7562 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7563 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7564 // MSA control register names
7565 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7566 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007567 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007568 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007569 }
Craig Topper3164f332014-03-11 03:39:26 +00007570 bool validateAsmConstraint(const char *&Name,
7571 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007572 switch (*Name) {
7573 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007574 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007575 case 'r': // CPU registers.
7576 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007577 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007578 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007579 case 'c': // $25 for indirect jumps
7580 case 'l': // lo register
7581 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007582 Info.setAllowsRegister();
7583 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007584 case 'I': // Signed 16-bit constant
7585 case 'J': // Integer 0
7586 case 'K': // Unsigned 16-bit constant
7587 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7588 case 'M': // Constants not loadable via lui, addiu, or ori
7589 case 'N': // Constant -1 to -65535
7590 case 'O': // A signed 15-bit constant
7591 case 'P': // A constant between 1 go 65535
7592 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007593 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007594 Info.setAllowsMemory();
7595 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007596 case 'Z':
7597 if (Name[1] == 'C') { // An address usable by ll, and sc.
7598 Info.setAllowsMemory();
7599 Name++; // Skip over 'Z'.
7600 return true;
7601 }
7602 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007603 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007604 }
7605
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007606 std::string convertConstraint(const char *&Constraint) const override {
7607 std::string R;
7608 switch (*Constraint) {
7609 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7610 if (Constraint[1] == 'C') {
7611 R = std::string("^") + std::string(Constraint, 2);
7612 Constraint++;
7613 return R;
7614 }
7615 break;
7616 }
7617 return TargetInfo::convertConstraint(Constraint);
7618 }
7619
Craig Topper3164f332014-03-11 03:39:26 +00007620 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007621 // In GCC, $1 is not widely used in generated code (it's used only in a few
7622 // specific situations), so there is no real need for users to add it to
7623 // the clobbers list if they want to use it in their inline assembly code.
7624 //
7625 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7626 // code generation, so using it in inline assembly without adding it to the
7627 // clobbers list can cause conflicts between the inline assembly code and
7628 // the surrounding generated code.
7629 //
7630 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7631 // operands, which will conflict with the ".set at" assembler option (which
7632 // we use only for inline assembly, in order to maintain compatibility with
7633 // GCC) and will also conflict with the user's usage of $1.
7634 //
7635 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7636 // register for generated code is to automatically clobber $1 for all inline
7637 // assembly code.
7638 //
7639 // FIXME: We should automatically clobber $1 only for inline assembly code
7640 // which actually uses it. This would allow LLVM to use $1 for inline
7641 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007642 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007643 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007644
Craig Topper3164f332014-03-11 03:39:26 +00007645 bool handleTargetFeatures(std::vector<std::string> &Features,
7646 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007647 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007648 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007649 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007650 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007651 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007652 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007653 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007654
Eric Christopher610fe112015-08-26 08:21:55 +00007655 for (const auto &Feature : Features) {
7656 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007657 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007658 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007659 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007660 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007661 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007662 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007663 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007664 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007665 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007666 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007667 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007668 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007669 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007670 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007671 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007672 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007673 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007674 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007675 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007676 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007677 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007678 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007679
James Y Knightb214cbc2016-03-04 19:00:41 +00007680 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007681
Rafael Espindolaeb265472013-08-21 21:59:03 +00007682 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007683 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007684
Craig Topper3164f332014-03-11 03:39:26 +00007685 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007686 if (RegNo == 0) return 4;
7687 if (RegNo == 1) return 5;
7688 return -1;
7689 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007690
7691 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007692
7693 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7694 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7695 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7696 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7697 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7698 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7699 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7700 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7701 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7702 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7703 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7704 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7705 {{"ra"}, "$31"}};
7706 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7707 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7708 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7709 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7710 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7711 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7712 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7713 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7714 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7715 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7716 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7717 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007718 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007719 return llvm::makeArrayRef(O32RegAliases);
7720 return llvm::makeArrayRef(NewABIRegAliases);
7721 }
7722
7723 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007724 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007725 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007726
7727 bool validateTarget(DiagnosticsEngine &Diags) const override {
7728 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7729 // this yet. It's better to fail here than on the backend assertion.
7730 if (processorSupportsGPR64() && ABI == "o32") {
7731 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7732 return false;
7733 }
7734
7735 // 64-bit ABI's require 64-bit CPU's.
7736 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7737 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7738 return false;
7739 }
7740
7741 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7742 // can't handle this yet. It's better to fail here than on the
7743 // backend assertion.
7744 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7745 getTriple().getArch() == llvm::Triple::mips64el) &&
7746 ABI == "o32") {
7747 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7748 << ABI << getTriple().str();
7749 return false;
7750 }
7751
7752 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7753 // can't handle this yet. It's better to fail here than on the
7754 // backend assertion.
7755 if ((getTriple().getArch() == llvm::Triple::mips ||
7756 getTriple().getArch() == llvm::Triple::mipsel) &&
7757 (ABI == "n32" || ABI == "n64")) {
7758 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7759 << ABI << getTriple().str();
7760 return false;
7761 }
7762
7763 return true;
7764 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007765};
7766
Daniel Sanders4672af62016-05-27 11:51:02 +00007767const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007768#define BUILTIN(ID, TYPE, ATTRS) \
7769 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7770#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7771 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007772#include "clang/Basic/BuiltinsMips.def"
7773};
7774
Ivan Krasindd7403e2011-08-24 20:22:22 +00007775class PNaClTargetInfo : public TargetInfo {
7776public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007777 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7778 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007779 this->LongAlign = 32;
7780 this->LongWidth = 32;
7781 this->PointerAlign = 32;
7782 this->PointerWidth = 32;
7783 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007784 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007785 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007786 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007787 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007788 this->SizeType = TargetInfo::UnsignedInt;
7789 this->PtrDiffType = TargetInfo::SignedInt;
7790 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007791 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007792 }
7793
Craig Toppere6f17d02014-03-11 04:07:52 +00007794 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007795 Builder.defineMacro("__le32__");
7796 Builder.defineMacro("__pnacl__");
7797 }
Craig Topper3164f332014-03-11 03:39:26 +00007798 void getTargetDefines(const LangOptions &Opts,
7799 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007800 getArchDefines(Opts, Builder);
7801 }
Craig Topper3164f332014-03-11 03:39:26 +00007802 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007803 return Feature == "pnacl";
7804 }
Craig Topper6c03a542015-10-19 04:51:35 +00007805 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007806 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007807 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007808 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007809 ArrayRef<const char *> getGCCRegNames() const override;
7810 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007811 bool validateAsmConstraint(const char *&Name,
7812 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007813 return false;
7814 }
7815
Craig Topper3164f332014-03-11 03:39:26 +00007816 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007817 return "";
7818 }
7819};
7820
Craig Topperf054e3a2015-10-19 03:52:27 +00007821ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7822 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007823}
7824
Craig Topperf054e3a2015-10-19 03:52:27 +00007825ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7826 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007827}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007828
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007829// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007830class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007831public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007832 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7833 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007834
7835 BuiltinVaListKind getBuiltinVaListKind() const override {
7836 return TargetInfo::PNaClABIBuiltinVaList;
7837 }
7838};
7839
JF Bastien643817d2014-09-12 17:52:47 +00007840class Le64TargetInfo : public TargetInfo {
7841 static const Builtin::Info BuiltinInfo[];
7842
7843public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007844 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7845 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007846 NoAsmVariants = true;
7847 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7848 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007849 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007850 }
7851
7852 void getTargetDefines(const LangOptions &Opts,
7853 MacroBuilder &Builder) const override {
7854 DefineStd(Builder, "unix", Opts);
7855 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7856 Builder.defineMacro("__ELF__");
7857 }
Craig Topper6c03a542015-10-19 04:51:35 +00007858 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7859 return llvm::makeArrayRef(BuiltinInfo,
7860 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007861 }
7862 BuiltinVaListKind getBuiltinVaListKind() const override {
7863 return TargetInfo::PNaClABIBuiltinVaList;
7864 }
7865 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007866 ArrayRef<const char *> getGCCRegNames() const override {
7867 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007868 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007869 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7870 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007871 }
7872 bool validateAsmConstraint(const char *&Name,
7873 TargetInfo::ConstraintInfo &Info) const override {
7874 return false;
7875 }
7876
7877 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007878};
Dan Gohmanc2853072015-09-03 22:51:53 +00007879
7880class WebAssemblyTargetInfo : public TargetInfo {
7881 static const Builtin::Info BuiltinInfo[];
7882
7883 enum SIMDEnum {
7884 NoSIMD,
7885 SIMD128,
7886 } SIMDLevel;
7887
7888public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007889 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007890 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007891 NoAsmVariants = true;
7892 SuitableAlign = 128;
7893 LargeArrayMinWidth = 128;
7894 LargeArrayAlign = 128;
7895 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007896 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007897 LongDoubleWidth = LongDoubleAlign = 128;
7898 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007899 SizeType = UnsignedInt;
7900 PtrDiffType = SignedInt;
7901 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007902 }
7903
7904protected:
7905 void getTargetDefines(const LangOptions &Opts,
7906 MacroBuilder &Builder) const override {
7907 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7908 if (SIMDLevel >= SIMD128)
7909 Builder.defineMacro("__wasm_simd128__");
7910 }
7911
7912private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007913 bool
7914 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7915 StringRef CPU,
7916 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007917 if (CPU == "bleeding-edge")
7918 Features["simd128"] = true;
7919 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7920 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007921 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007922 return llvm::StringSwitch<bool>(Feature)
7923 .Case("simd128", SIMDLevel >= SIMD128)
7924 .Default(false);
7925 }
7926 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007927 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007928 for (const auto &Feature : Features) {
7929 if (Feature == "+simd128") {
7930 SIMDLevel = std::max(SIMDLevel, SIMD128);
7931 continue;
7932 }
7933 if (Feature == "-simd128") {
7934 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7935 continue;
7936 }
7937
7938 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7939 << "-target-feature";
7940 return false;
7941 }
7942 return true;
7943 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007944 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007945 return llvm::StringSwitch<bool>(Name)
7946 .Case("mvp", true)
7947 .Case("bleeding-edge", true)
7948 .Case("generic", true)
7949 .Default(false);
7950 }
Craig Topper6c03a542015-10-19 04:51:35 +00007951 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7952 return llvm::makeArrayRef(BuiltinInfo,
7953 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007954 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007955 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007956 return VoidPtrBuiltinVaList;
7957 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007958 ArrayRef<const char *> getGCCRegNames() const final {
7959 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007960 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007961 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7962 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007963 }
7964 bool
7965 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007966 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007967 return false;
7968 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007969 const char *getClobbers() const final { return ""; }
7970 bool isCLZForZeroUndef() const final { return false; }
7971 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007972 IntType getIntTypeByWidth(unsigned BitWidth,
7973 bool IsSigned) const final {
7974 // WebAssembly prefers long long for explicitly 64-bit integers.
7975 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7976 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7977 }
7978 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7979 bool IsSigned) const final {
7980 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7981 return BitWidth == 64
7982 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7983 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7984 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007985};
7986
7987const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7988#define BUILTIN(ID, TYPE, ATTRS) \
7989 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7990#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7991 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7992#include "clang/Basic/BuiltinsWebAssembly.def"
7993};
7994
7995class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7996public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007997 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7998 const TargetOptions &Opts)
7999 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008000 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008001 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008002 }
8003
8004protected:
8005 void getTargetDefines(const LangOptions &Opts,
8006 MacroBuilder &Builder) const override {
8007 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8008 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8009 }
8010};
8011
8012class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8013public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008014 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8015 const TargetOptions &Opts)
8016 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008017 LongAlign = LongWidth = 64;
8018 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008019 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008020 SizeType = UnsignedLong;
8021 PtrDiffType = SignedLong;
8022 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008023 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008024 }
8025
8026protected:
8027 void getTargetDefines(const LangOptions &Opts,
8028 MacroBuilder &Builder) const override {
8029 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8030 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8031 }
8032};
8033
JF Bastien643817d2014-09-12 17:52:47 +00008034const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8035#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008036 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008037#include "clang/Basic/BuiltinsLe64.def"
8038};
8039
Eric Christopherc48497a2015-09-18 21:26:24 +00008040static const unsigned SPIRAddrSpaceMap[] = {
8041 1, // opencl_global
8042 3, // opencl_local
8043 2, // opencl_constant
8044 4, // opencl_generic
8045 0, // cuda_device
8046 0, // cuda_constant
8047 0 // cuda_shared
8048};
8049class SPIRTargetInfo : public TargetInfo {
8050public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008051 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8052 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008053 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8054 "SPIR target must use unknown OS");
8055 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8056 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008057 TLSSupported = false;
8058 LongWidth = LongAlign = 64;
8059 AddrSpaceMap = &SPIRAddrSpaceMap;
8060 UseAddrSpaceMapMangling = true;
8061 // Define available target features
8062 // These must be defined in sorted order!
8063 NoAsmVariants = true;
8064 }
8065 void getTargetDefines(const LangOptions &Opts,
8066 MacroBuilder &Builder) const override {
8067 DefineStd(Builder, "SPIR", Opts);
8068 }
8069 bool hasFeature(StringRef Feature) const override {
8070 return Feature == "spir";
8071 }
Craig Topper3164f332014-03-11 03:39:26 +00008072
Craig Topper6c03a542015-10-19 04:51:35 +00008073 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008074 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008075 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008076 bool validateAsmConstraint(const char *&Name,
8077 TargetInfo::ConstraintInfo &info) const override {
8078 return true;
8079 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008080 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8081 return None;
8082 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008083 BuiltinVaListKind getBuiltinVaListKind() const override {
8084 return TargetInfo::VoidPtrBuiltinVaList;
8085 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008086
Eric Christopherc48497a2015-09-18 21:26:24 +00008087 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008088 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8089 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008090 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008091
Eric Christopherc48497a2015-09-18 21:26:24 +00008092 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8093 return CC_SpirFunction;
8094 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008095
8096 void setSupportedOpenCLOpts() override {
8097 // Assume all OpenCL extensions and optional core features are supported
8098 // for SPIR since it is a generic target.
8099 getSupportedOpenCLOpts().setAll();
8100 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008101};
Guy Benyeib798fc92012-12-11 21:38:14 +00008102
Eric Christopherc48497a2015-09-18 21:26:24 +00008103class SPIR32TargetInfo : public SPIRTargetInfo {
8104public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008105 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8106 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008107 PointerWidth = PointerAlign = 32;
8108 SizeType = TargetInfo::UnsignedInt;
8109 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008110 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8111 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008112 }
8113 void getTargetDefines(const LangOptions &Opts,
8114 MacroBuilder &Builder) const override {
8115 DefineStd(Builder, "SPIR32", Opts);
8116 }
8117};
Guy Benyeib798fc92012-12-11 21:38:14 +00008118
Eric Christopherc48497a2015-09-18 21:26:24 +00008119class SPIR64TargetInfo : public SPIRTargetInfo {
8120public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008121 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8122 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008123 PointerWidth = PointerAlign = 64;
8124 SizeType = TargetInfo::UnsignedLong;
8125 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008126 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8127 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008128 }
8129 void getTargetDefines(const LangOptions &Opts,
8130 MacroBuilder &Builder) const override {
8131 DefineStd(Builder, "SPIR64", Opts);
8132 }
8133};
Guy Benyeib798fc92012-12-11 21:38:14 +00008134
Robert Lytton0e076492013-08-13 09:43:10 +00008135class XCoreTargetInfo : public TargetInfo {
8136 static const Builtin::Info BuiltinInfo[];
8137public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008138 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8139 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008140 NoAsmVariants = true;
8141 LongLongAlign = 32;
8142 SuitableAlign = 32;
8143 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008144 SizeType = UnsignedInt;
8145 PtrDiffType = SignedInt;
8146 IntPtrType = SignedInt;
8147 WCharType = UnsignedChar;
8148 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008149 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008150 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8151 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008152 }
Craig Topper3164f332014-03-11 03:39:26 +00008153 void getTargetDefines(const LangOptions &Opts,
8154 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008155 Builder.defineMacro("__XS1B__");
8156 }
Craig Topper6c03a542015-10-19 04:51:35 +00008157 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8158 return llvm::makeArrayRef(BuiltinInfo,
8159 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008160 }
Craig Topper3164f332014-03-11 03:39:26 +00008161 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008162 return TargetInfo::VoidPtrBuiltinVaList;
8163 }
Craig Topper3164f332014-03-11 03:39:26 +00008164 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008165 return "";
8166 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008167 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008168 static const char * const GCCRegNames[] = {
8169 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8170 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8171 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008172 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008173 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008174 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8175 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008176 }
Craig Topper3164f332014-03-11 03:39:26 +00008177 bool validateAsmConstraint(const char *&Name,
8178 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008179 return false;
8180 }
Craig Topper3164f332014-03-11 03:39:26 +00008181 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008182 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8183 return (RegNo < 2)? RegNo : -1;
8184 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008185 bool allowsLargerPreferedTypeAlignment() const override {
8186 return false;
8187 }
Robert Lytton0e076492013-08-13 09:43:10 +00008188};
8189
8190const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008191#define BUILTIN(ID, TYPE, ATTRS) \
8192 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8193#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8194 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008195#include "clang/Basic/BuiltinsXCore.def"
8196};
Robert Lytton0e076492013-08-13 09:43:10 +00008197
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008198// x86_32 Android target
8199class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8200public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008201 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8202 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008203 SuitableAlign = 32;
8204 LongDoubleWidth = 64;
8205 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8206 }
8207};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008208
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008209// x86_64 Android target
8210class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8211public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008212 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8213 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008214 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8215 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008216
8217 bool useFloat128ManglingForLongDouble() const override {
8218 return true;
8219 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008220};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008221
8222// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8223class RenderScript32TargetInfo : public ARMleTargetInfo {
8224public:
8225 RenderScript32TargetInfo(const llvm::Triple &Triple,
8226 const TargetOptions &Opts)
8227 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8228 Triple.getOSName(),
8229 Triple.getEnvironmentName()),
8230 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008231 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008232 LongWidth = LongAlign = 64;
8233 }
8234 void getTargetDefines(const LangOptions &Opts,
8235 MacroBuilder &Builder) const override {
8236 Builder.defineMacro("__RENDERSCRIPT__");
8237 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8238 }
8239};
8240
8241// 64-bit RenderScript is aarch64
8242class RenderScript64TargetInfo : public AArch64leTargetInfo {
8243public:
8244 RenderScript64TargetInfo(const llvm::Triple &Triple,
8245 const TargetOptions &Opts)
8246 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8247 Triple.getOSName(),
8248 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008249 Opts) {
8250 IsRenderScriptTarget = true;
8251 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008252
8253 void getTargetDefines(const LangOptions &Opts,
8254 MacroBuilder &Builder) const override {
8255 Builder.defineMacro("__RENDERSCRIPT__");
8256 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8257 }
8258};
8259
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008260} // end anonymous namespace
8261
Chris Lattner5ba61f02006-10-14 07:39:34 +00008262//===----------------------------------------------------------------------===//
8263// Driver code
8264//===----------------------------------------------------------------------===//
8265
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008266static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8267 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008268 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008269
Daniel Dunbar52322032009-08-18 05:47:58 +00008270 switch (Triple.getArch()) {
8271 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008272 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008273
Tim Northover2a0783d2014-05-30 14:14:07 +00008274 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008275 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008276
8277 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008278 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008279
Jacques Pienaard964cc22016-03-28 21:02:54 +00008280 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008281 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008282
Tim Northover2a0783d2014-05-30 14:14:07 +00008283 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008284 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008285 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008286
8287 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008288 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008289 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008290 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008291 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008292 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008293 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008294 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008295 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek62e1d232016-10-06 06:08:09 +00008296 case llvm::Triple::Fuchsia:
8297 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008298 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008299 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008300 }
8301
Christian Pirker9b019ae2014-02-25 13:51:00 +00008302 case llvm::Triple::aarch64_be:
8303 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008304 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008305 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008306 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008308 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008309 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008310 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008312 }
8313
Daniel Dunbar52322032009-08-18 05:47:58 +00008314 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008315 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008316 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008317 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008318
Daniel Dunbar52322032009-08-18 05:47:58 +00008319 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008320 case llvm::Triple::CloudABI:
8321 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008322 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008323 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008324 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008325 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008326 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008328 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008329 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008330 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008331 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008332 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008333 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008334 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008336 case llvm::Triple::Win32:
8337 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008338 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008339 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008340 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008341 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008342 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008343 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008344 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008345 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008346 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008347 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008348 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008350 }
8351
8352 case llvm::Triple::armeb:
8353 case llvm::Triple::thumbeb:
8354 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008355 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008356
8357 switch (os) {
8358 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008359 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008360 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008361 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008362 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008363 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008364 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008365 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008366 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008367 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008368 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008370 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008371 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008372 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008373 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008374 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008375
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008376 case llvm::Triple::bpfeb:
8377 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008378 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008379
Daniel Dunbar52322032009-08-18 05:47:58 +00008380 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008381 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008382
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008383 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008384 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008385 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008386 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008387 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008388 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008389 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008390 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008391 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008392 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008393 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008394 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008395 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008396
8397 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008398 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008399 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008400 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008401 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008402 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008403 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008404 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008405 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008406 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008407 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008408 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008409 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008410 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008411 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008412
Akira Hatanakabef17452011-09-20 19:21:49 +00008413 case llvm::Triple::mips64:
8414 switch (os) {
8415 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008416 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008417 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008418 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008419 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008420 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008421 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008422 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008423 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008424 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008425 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008426 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008427 }
8428
8429 case llvm::Triple::mips64el:
8430 switch (os) {
8431 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008432 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008433 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008434 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008435 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008436 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008437 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008438 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008439 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008440 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008441 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008442 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008443 }
8444
Ivan Krasindd7403e2011-08-24 20:22:22 +00008445 case llvm::Triple::le32:
8446 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008447 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008448 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008449 default:
8450 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008451 }
8452
JF Bastien643817d2014-09-12 17:52:47 +00008453 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008454 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008455
Daniel Dunbar52322032009-08-18 05:47:58 +00008456 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008457 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008458 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008459 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008460 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008461 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008462 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008464 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008466 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008467 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008468 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008469 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008470 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008471 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008472 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008473
8474 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008475 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008476 return new DarwinPPC64TargetInfo(Triple, Opts);
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<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008480 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008481 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008482 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008483 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008484 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008485 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008486 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008487 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008488 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008489
Bill Schmidt778d3872013-07-26 01:36:11 +00008490 case llvm::Triple::ppc64le:
8491 switch (os) {
8492 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008493 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008494 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008495 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008496 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008497 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008498 }
8499
Peter Collingbournec947aae2012-05-20 23:28:41 +00008500 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008501 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008502 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008503 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008504
Tom Stellardd8e38a32015-01-06 20:34:47 +00008505 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008506 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008507 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008508
Daniel Dunbar52322032009-08-18 05:47:58 +00008509 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008510 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008511 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008512 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008513 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008514 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008515 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008516 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008517 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008518 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008519 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008520 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008521 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008522 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008523 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008524
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008525 // The 'sparcel' architecture copies all the above cases except for Solaris.
8526 case llvm::Triple::sparcel:
8527 switch (os) {
8528 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008529 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008530 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008531 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008532 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008533 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008534 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008535 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008536 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008537 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008538 }
8539
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008540 case llvm::Triple::sparcv9:
8541 switch (os) {
8542 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008543 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008544 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008545 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008546 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008547 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008548 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008549 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008550 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008551 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008552 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008553 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008554 }
8555
Ulrich Weigand47445072013-05-06 16:26:41 +00008556 case llvm::Triple::systemz:
8557 switch (os) {
8558 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008559 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008560 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008561 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008562 }
8563
Eli Friedmana9c3d712009-08-19 20:47:07 +00008564 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008565 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008566
Daniel Dunbar52322032009-08-18 05:47:58 +00008567 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008568 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008569 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008570
Daniel Dunbar52322032009-08-18 05:47:58 +00008571 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008572 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008573 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008574 case llvm::Triple::Linux: {
8575 switch (Triple.getEnvironment()) {
8576 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008577 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008578 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008579 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008580 }
8581 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008582 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008583 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008584 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008585 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008586 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008587 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008588 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008589 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008590 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008591 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008592 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008593 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008594 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008595 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008596 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008597 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008598 case llvm::Triple::Win32: {
8599 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008600 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008601 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008602 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008603 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008604 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008605 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008606 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008607 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008608 }
8609 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008610 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008611 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008612 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008613 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008614 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008615 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008616 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008617 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008618 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008619 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008620 }
8621
8622 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008623 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008624 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008625
Daniel Dunbar52322032009-08-18 05:47:58 +00008626 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008627 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008628 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008629 case llvm::Triple::Linux: {
8630 switch (Triple.getEnvironment()) {
8631 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008632 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008633 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008634 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008635 }
8636 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008637 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008638 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008639 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008640 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008641 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008642 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008643 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008644 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008645 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008646 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008647 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008648 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008649 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008650 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008651 case llvm::Triple::Win32: {
8652 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008653 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008654 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008655 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008656 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008657 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008658 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008659 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008660 }
8661 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008662 case llvm::Triple::Haiku:
8663 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008664 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008665 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek62e1d232016-10-06 06:08:09 +00008666 case llvm::Triple::Fuchsia:
8667 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008668 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008669 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008670 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008671 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008672 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008673
Douglas Katzman78d7c542015-05-12 21:18:10 +00008674 case llvm::Triple::spir: {
8675 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8676 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8677 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008678 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008679 }
8680 case llvm::Triple::spir64: {
8681 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8682 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8683 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008684 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008685 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008686 case llvm::Triple::wasm32:
8687 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8688 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008689 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008690 case llvm::Triple::wasm64:
8691 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8692 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008693 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008694
8695 case llvm::Triple::renderscript32:
8696 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8697 case llvm::Triple::renderscript64:
8698 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008699 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008700}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008701
8702/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008703/// options.
Alp Toker80758082014-07-06 05:26:44 +00008704TargetInfo *
8705TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008706 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008707 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008708
8709 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008710 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008711 if (!Target) {
8712 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008713 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008714 }
Alp Toker80758082014-07-06 05:26:44 +00008715 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008716
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008717 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008718 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8719 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008720 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008721 }
8722
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008723 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008724 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8725 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008726 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008727 }
8728
Rafael Espindolaeb265472013-08-21 21:59:03 +00008729 // Set the fp math unit.
8730 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8731 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008732 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008733 }
8734
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008735 // Compute the default target features, we need the target to handle this
8736 // because features may have dependencies on one another.
8737 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008738 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8739 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008740 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008741
8742 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008743 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008744 for (const auto &F : Features)
8745 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8746
Eric Christopher3ff21b32013-10-16 21:26:26 +00008747 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008748 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008749
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008750 Target->setSupportedOpenCLOpts();
8751
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008752 if (!Target->validateTarget(Diags))
8753 return nullptr;
8754
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008755 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008756}