blob: b549d1485ba0fca1320e5c2e30e008010e221efa [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346 DefineStd(Builder, "unix", Opts);
347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
391 DefineStd(Builder, "unix", Opts);
392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
414 DefineStd(Builder, "unix", Opts);
415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000809 // RegParmMax is inherited from the underlying architecture.
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
Dan Gohmanc2853072015-09-03 22:51:53 +0000826// WebAssembly target
827template <typename Target>
828class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
829 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000830 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000831 // A common platform macro.
832 if (Opts.POSIXThreads)
833 Builder.defineMacro("_REENTRANT");
834 // Follow g++ convention and predefine _GNU_SOURCE for C++.
835 if (Opts.CPlusPlus)
836 Builder.defineMacro("_GNU_SOURCE");
837 }
838
839 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000840 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000841 return ".text.__startup";
842 }
843
844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000845 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000848 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000849 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
850 }
851};
Dan Gohmanc2853072015-09-03 22:51:53 +0000852
Chris Lattner09d98f52008-10-05 21:50:58 +0000853//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000854// Specific target implementations.
855//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857// PPC abstract base class
858class PPCTargetInfo : public TargetInfo {
859 static const Builtin::Info BuiltinInfo[];
860 static const char * const GCCRegNames[];
861 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000862 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000863
864 // Target cpu features.
865 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000866 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000867 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000868 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000869 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000870 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000871 bool HasBPERMD;
872 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000873
Ulrich Weigand8afad612014-07-28 13:17:52 +0000874protected:
875 std::string ABI;
876
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000877public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000878 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000879 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
880 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000881 HasBPERMD(false), HasExtDiv(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000882 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000883 LongDoubleWidth = LongDoubleAlign = 128;
884 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
885 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000886
Hal Finkel6b984f02012-07-03 16:51:04 +0000887 /// \brief Flags for architecture specific defines.
888 typedef enum {
889 ArchDefineNone = 0,
890 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
891 ArchDefinePpcgr = 1 << 1,
892 ArchDefinePpcsq = 1 << 2,
893 ArchDefine440 = 1 << 3,
894 ArchDefine603 = 1 << 4,
895 ArchDefine604 = 1 << 5,
896 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000897 ArchDefinePwr5 = 1 << 7,
898 ArchDefinePwr5x = 1 << 8,
899 ArchDefinePwr6 = 1 << 9,
900 ArchDefinePwr6x = 1 << 10,
901 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000902 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000903 ArchDefinePwr9 = 1 << 13,
904 ArchDefineA2 = 1 << 14,
905 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000906 } ArchDefineTypes;
907
Bill Schmidt38378a02013-02-01 20:23:10 +0000908 // Note: GCC recognizes the following additional cpus:
909 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
910 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
911 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000912 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000913 bool CPUKnown = llvm::StringSwitch<bool>(Name)
914 .Case("generic", true)
915 .Case("440", true)
916 .Case("450", true)
917 .Case("601", true)
918 .Case("602", true)
919 .Case("603", true)
920 .Case("603e", true)
921 .Case("603ev", true)
922 .Case("604", true)
923 .Case("604e", true)
924 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000925 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000926 .Case("g3", true)
927 .Case("7400", true)
928 .Case("g4", true)
929 .Case("7450", true)
930 .Case("g4+", true)
931 .Case("750", true)
932 .Case("970", true)
933 .Case("g5", true)
934 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000935 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000936 .Case("e500mc", true)
937 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000938 .Case("power3", true)
939 .Case("pwr3", true)
940 .Case("power4", true)
941 .Case("pwr4", true)
942 .Case("power5", true)
943 .Case("pwr5", true)
944 .Case("power5x", true)
945 .Case("pwr5x", true)
946 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000947 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000948 .Case("power6x", true)
949 .Case("pwr6x", true)
950 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000951 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000952 .Case("power8", true)
953 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000954 .Case("power9", true)
955 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000956 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000957 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000958 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000959 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000960 .Case("powerpc64le", true)
961 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000962 .Default(false);
963
964 if (CPUKnown)
965 CPU = Name;
966
967 return CPUKnown;
968 }
969
Ulrich Weigand8afad612014-07-28 13:17:52 +0000970
971 StringRef getABI() const override { return ABI; }
972
Craig Topper6c03a542015-10-19 04:51:35 +0000973 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
974 return llvm::makeArrayRef(BuiltinInfo,
975 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000976 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000977
Craig Topper3164f332014-03-11 03:39:26 +0000978 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000979
Craig Topper3164f332014-03-11 03:39:26 +0000980 void getTargetDefines(const LangOptions &Opts,
981 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000982
Eric Christopher8c47b422015-10-09 18:39:55 +0000983 bool
984 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
985 StringRef CPU,
986 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000987
Craig Topper3164f332014-03-11 03:39:26 +0000988 bool handleTargetFeatures(std::vector<std::string> &Features,
989 DiagnosticsEngine &Diags) override;
990 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000991 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
992 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000993
Craig Topperf054e3a2015-10-19 03:52:27 +0000994 ArrayRef<const char *> getGCCRegNames() const override;
995 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000996 bool validateAsmConstraint(const char *&Name,
997 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000998 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000999 default: return false;
1000 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001001 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001002 case 'b': // Base register
1003 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001004 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001005 break;
1006 // FIXME: The following are added to allow parsing.
1007 // I just took a guess at what the actions should be.
1008 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001009 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001010 case 'v': // Altivec vector register
1011 Info.setAllowsRegister();
1012 break;
1013 case 'w':
1014 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001015 case 'd':// VSX vector register to hold vector double data
1016 case 'f':// VSX vector register to hold vector float data
1017 case 's':// VSX vector register to hold scalar float data
1018 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001019 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001020 break;
1021 default:
1022 return false;
1023 }
1024 Info.setAllowsRegister();
1025 Name++; // Skip over 'w'.
1026 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001027 case 'h': // `MQ', `CTR', or `LINK' register
1028 case 'q': // `MQ' register
1029 case 'c': // `CTR' register
1030 case 'l': // `LINK' register
1031 case 'x': // `CR' register (condition register) number 0
1032 case 'y': // `CR' register (condition register)
1033 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001034 Info.setAllowsRegister();
1035 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001036 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001037 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 // (use `L' instead for SImode constants)
1039 case 'K': // Unsigned 16-bit constant
1040 case 'L': // Signed 16-bit constant shifted left 16 bits
1041 case 'M': // Constant larger than 31
1042 case 'N': // Exact power of 2
1043 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001044 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001045 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001046 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001047 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001048 break;
1049 case 'm': // Memory operand. Note that on PowerPC targets, m can
1050 // include addresses that update the base register. It
1051 // is therefore only safe to use `m' in an asm statement
1052 // if that asm statement accesses the operand exactly once.
1053 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001054 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001055 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001056 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001057 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001058 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1059 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001060 // register to be updated.
1061 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001062 if (Name[1] != 's')
1063 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001064 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001065 // include any automodification of the base register. Unlike
1066 // `m', this constraint can be used in asm statements that
1067 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001068 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001069 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001070 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001071 break;
1072 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001073 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001074 case 'Z': // Memory operand that is an indexed or indirect from a
1075 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001076 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001077 Info.setAllowsMemory();
1078 Info.setAllowsRegister();
1079 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001081 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // register (`p' is preferable for asm statements)
1083 case 'S': // Constant suitable as a 64-bit mask operand
1084 case 'T': // Constant suitable as a 32-bit mask operand
1085 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001086 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001087 // instructions
1088 case 'W': // Vector constant that does not require memory
1089 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001090 break;
1091 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001092 }
John Thompson07a61a42010-06-24 22:44:13 +00001093 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001094 }
Craig Topper3164f332014-03-11 03:39:26 +00001095 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001096 std::string R;
1097 switch (*Constraint) {
1098 case 'e':
1099 case 'w':
1100 // Two-character constraint; add "^" hint for later parsing.
1101 R = std::string("^") + std::string(Constraint, 2);
1102 Constraint++;
1103 break;
1104 default:
1105 return TargetInfo::convertConstraint(Constraint);
1106 }
1107 return R;
1108 }
Craig Topper3164f332014-03-11 03:39:26 +00001109 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001110 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001111 }
Craig Topper3164f332014-03-11 03:39:26 +00001112 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001113 if (RegNo == 0) return 3;
1114 if (RegNo == 1) return 4;
1115 return -1;
1116 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001117
1118 bool hasSjLjLowering() const override {
1119 return true;
1120 }
David Majnemer2617ea62015-06-09 18:05:33 +00001121
1122 bool useFloat128ManglingForLongDouble() const override {
1123 return LongDoubleWidth == 128 &&
1124 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1125 getTriple().isOSBinFormatELF();
1126 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001127};
Anders Carlssonf511f642007-11-27 04:11:28 +00001128
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001129const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001130#define BUILTIN(ID, TYPE, ATTRS) \
1131 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1132#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1133 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001134#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001135};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001136
Eric Christopher917e9522014-11-18 22:36:15 +00001137/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001138/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001139bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001140 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001141 for (const auto &Feature : Features) {
1142 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001143 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001144 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001145 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001146 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001147 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001148 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001149 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001150 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001151 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001152 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001153 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001154 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001155 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001156 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001157 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001158 } else if (Feature == "+float128") {
1159 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001160 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001161 // TODO: Finish this list and add an assert that we've handled them
1162 // all.
1163 }
Eric Christopher02c33352015-08-25 00:59:11 +00001164
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001165 return true;
1166}
1167
Chris Lattnerecd49032009-03-02 22:27:17 +00001168/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1169/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001170void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001171 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001172 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001173 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001174 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001175 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001176 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001177 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001178 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001179 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001180 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001181 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001182 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001183 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001184
Chris Lattnerecd49032009-03-02 22:27:17 +00001185 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001186 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1187 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001188 } else {
1189 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1190 getTriple().getOS() != llvm::Triple::OpenBSD)
1191 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001192 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001193
Ulrich Weigand8afad612014-07-28 13:17:52 +00001194 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001195 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001196 Builder.defineMacro("_CALL_ELF", "1");
1197 if (ABI == "elfv2")
1198 Builder.defineMacro("_CALL_ELF", "2");
1199
Chris Lattnerecd49032009-03-02 22:27:17 +00001200 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001201 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1202 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001203
Chris Lattnerecd49032009-03-02 22:27:17 +00001204 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001205 if (LongDoubleWidth == 128)
1206 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001207
John Thompsone467e192009-11-19 17:18:50 +00001208 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001209 Builder.defineMacro("__VEC__", "10206");
1210 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001211 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001212
1213 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001214 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1215 .Case("440", ArchDefineName)
1216 .Case("450", ArchDefineName | ArchDefine440)
1217 .Case("601", ArchDefineName)
1218 .Case("602", ArchDefineName | ArchDefinePpcgr)
1219 .Case("603", ArchDefineName | ArchDefinePpcgr)
1220 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1221 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1222 .Case("604", ArchDefineName | ArchDefinePpcgr)
1223 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1224 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001225 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001226 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1227 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1228 .Case("750", ArchDefineName | ArchDefinePpcgr)
1229 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1230 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001231 .Case("a2", ArchDefineA2)
1232 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001233 .Case("pwr3", ArchDefinePpcgr)
1234 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1235 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1236 | ArchDefinePpcsq)
1237 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1238 | ArchDefinePpcgr | ArchDefinePpcsq)
1239 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1240 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1241 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1242 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1243 | ArchDefinePpcsq)
1244 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1245 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001246 | ArchDefinePpcgr | ArchDefinePpcsq)
1247 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1248 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1249 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001250 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1251 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1252 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1253 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001254 .Case("power3", ArchDefinePpcgr)
1255 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1256 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1257 | ArchDefinePpcsq)
1258 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1259 | ArchDefinePpcgr | ArchDefinePpcsq)
1260 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1261 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1262 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1263 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1264 | ArchDefinePpcsq)
1265 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1266 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001267 | ArchDefinePpcgr | ArchDefinePpcsq)
1268 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1269 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1270 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001271 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1272 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1273 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1274 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001275 .Default(ArchDefineNone);
1276
1277 if (defs & ArchDefineName)
1278 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1279 if (defs & ArchDefinePpcgr)
1280 Builder.defineMacro("_ARCH_PPCGR");
1281 if (defs & ArchDefinePpcsq)
1282 Builder.defineMacro("_ARCH_PPCSQ");
1283 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001284 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001285 if (defs & ArchDefine603)
1286 Builder.defineMacro("_ARCH_603");
1287 if (defs & ArchDefine604)
1288 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001289 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001290 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001291 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001292 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001293 if (defs & ArchDefinePwr5x)
1294 Builder.defineMacro("_ARCH_PWR5X");
1295 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001296 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001297 if (defs & ArchDefinePwr6x)
1298 Builder.defineMacro("_ARCH_PWR6X");
1299 if (defs & ArchDefinePwr7)
1300 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001301 if (defs & ArchDefinePwr8)
1302 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001303 if (defs & ArchDefinePwr9)
1304 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001305 if (defs & ArchDefineA2)
1306 Builder.defineMacro("_ARCH_A2");
1307 if (defs & ArchDefineA2q) {
1308 Builder.defineMacro("_ARCH_A2Q");
1309 Builder.defineMacro("_ARCH_QP");
1310 }
1311
1312 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1313 Builder.defineMacro("__bg__");
1314 Builder.defineMacro("__THW_BLUEGENE__");
1315 Builder.defineMacro("__bgq__");
1316 Builder.defineMacro("__TOS_BGQ__");
1317 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001318
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001319 if (HasVSX)
1320 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001321 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001322 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001323 if (HasP8Crypto)
1324 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001325 if (HasHTM)
1326 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001327 if (HasFloat128)
1328 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001329
1330 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1333 if (PointerWidth == 64)
1334 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001335
Bill Schmidt38378a02013-02-01 20:23:10 +00001336 // FIXME: The following are not yet generated here by Clang, but are
1337 // generated by GCC:
1338 //
1339 // _SOFT_FLOAT_
1340 // __RECIP_PRECISION__
1341 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001342 // __RECIP__
1343 // __RECIPF__
1344 // __RSQRTE__
1345 // __RSQRTEF__
1346 // _SOFT_DOUBLE_
1347 // __NO_LWSYNC__
1348 // __HAVE_BSWAP__
1349 // __LONGDOUBLE128
1350 // __CMODEL_MEDIUM__
1351 // __CMODEL_LARGE__
1352 // _CALL_SYSV
1353 // _CALL_DARWIN
1354 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001355}
1356
Eric Christophera8a14c32015-08-31 18:39:16 +00001357// Handle explicit options being passed to the compiler here: if we've
1358// explicitly turned off vsx and turned on power8-vector or direct-move then
1359// go ahead and error since the customer has expressed a somewhat incompatible
1360// set of options.
1361static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001362 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001363
1364 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1365 FeaturesVec.end()) {
1366 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1367 FeaturesVec.end()) {
1368 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1369 << "-mno-vsx";
1370 return false;
1371 }
1372
1373 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1374 FeaturesVec.end()) {
1375 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1376 << "-mno-vsx";
1377 return false;
1378 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001379
1380 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1381 FeaturesVec.end()) {
1382 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1383 << "-mno-vsx";
1384 return false;
1385 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001386 }
1387
1388 return true;
1389}
1390
Eric Christopher8c47b422015-10-09 18:39:55 +00001391bool PPCTargetInfo::initFeatureMap(
1392 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1393 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001394 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1395 .Case("7400", true)
1396 .Case("g4", true)
1397 .Case("7450", true)
1398 .Case("g4+", true)
1399 .Case("970", true)
1400 .Case("g5", true)
1401 .Case("pwr6", true)
1402 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001403 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001404 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001405 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001406 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001407 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001408
1409 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001410 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1411 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001412 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001413 .Case("pwr8", true)
1414 .Default(false);
1415 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1416 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001417 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001418 .Case("pwr8", true)
1419 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001420 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1421 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001422 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001423 .Case("pwr8", true)
1424 .Case("pwr7", true)
1425 .Default(false);
1426 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1427 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001428 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001429 .Case("pwr8", true)
1430 .Case("pwr7", true)
1431 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001432 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1433 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001434 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001435 .Case("pwr8", true)
1436 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001437 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1438 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001439 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001440 .Case("pwr8", true)
1441 .Case("pwr7", true)
1442 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001443
Eric Christophera8a14c32015-08-31 18:39:16 +00001444 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1445 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001446
Eric Christopher007b0a02015-08-28 22:32:01 +00001447 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001448}
1449
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001450bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001451 return llvm::StringSwitch<bool>(Feature)
1452 .Case("powerpc", true)
1453 .Case("vsx", HasVSX)
1454 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001455 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001456 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001457 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001458 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001459 .Case("bpermd", HasBPERMD)
1460 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001461 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001462 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001463}
Chris Lattner17df24e2008-04-21 18:56:49 +00001464
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001465void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1466 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001467 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1468 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1469 // incompatible options.
1470 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001471 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001472 Features[Name] = Features["vsx"] = true;
1473 } else if (Name == "power8-vector") {
1474 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001475 } else if (Name == "float128") {
1476 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001477 } else {
1478 Features[Name] = true;
1479 }
1480 } else {
1481 if (Name == "vsx") {
1482 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001483 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001484 } else {
1485 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001486 }
1487 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001488}
1489
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001490const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001491 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1492 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1493 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1494 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1495 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1496 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1497 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1498 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001499 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001500 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001501 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001502 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1503 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1504 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1505 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001506 "vrsave", "vscr",
1507 "spe_acc", "spefscr",
1508 "sfp"
1509};
Chris Lattner10a5b382007-01-29 05:24:35 +00001510
Craig Topperf054e3a2015-10-19 03:52:27 +00001511ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1512 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001513}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001514
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001515const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1516 // While some of these aliases do map to different registers
1517 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001518 { { "0" }, "r0" },
1519 { { "1"}, "r1" },
1520 { { "2" }, "r2" },
1521 { { "3" }, "r3" },
1522 { { "4" }, "r4" },
1523 { { "5" }, "r5" },
1524 { { "6" }, "r6" },
1525 { { "7" }, "r7" },
1526 { { "8" }, "r8" },
1527 { { "9" }, "r9" },
1528 { { "10" }, "r10" },
1529 { { "11" }, "r11" },
1530 { { "12" }, "r12" },
1531 { { "13" }, "r13" },
1532 { { "14" }, "r14" },
1533 { { "15" }, "r15" },
1534 { { "16" }, "r16" },
1535 { { "17" }, "r17" },
1536 { { "18" }, "r18" },
1537 { { "19" }, "r19" },
1538 { { "20" }, "r20" },
1539 { { "21" }, "r21" },
1540 { { "22" }, "r22" },
1541 { { "23" }, "r23" },
1542 { { "24" }, "r24" },
1543 { { "25" }, "r25" },
1544 { { "26" }, "r26" },
1545 { { "27" }, "r27" },
1546 { { "28" }, "r28" },
1547 { { "29" }, "r29" },
1548 { { "30" }, "r30" },
1549 { { "31" }, "r31" },
1550 { { "fr0" }, "f0" },
1551 { { "fr1" }, "f1" },
1552 { { "fr2" }, "f2" },
1553 { { "fr3" }, "f3" },
1554 { { "fr4" }, "f4" },
1555 { { "fr5" }, "f5" },
1556 { { "fr6" }, "f6" },
1557 { { "fr7" }, "f7" },
1558 { { "fr8" }, "f8" },
1559 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001560 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001561 { { "fr11" }, "f11" },
1562 { { "fr12" }, "f12" },
1563 { { "fr13" }, "f13" },
1564 { { "fr14" }, "f14" },
1565 { { "fr15" }, "f15" },
1566 { { "fr16" }, "f16" },
1567 { { "fr17" }, "f17" },
1568 { { "fr18" }, "f18" },
1569 { { "fr19" }, "f19" },
1570 { { "fr20" }, "f20" },
1571 { { "fr21" }, "f21" },
1572 { { "fr22" }, "f22" },
1573 { { "fr23" }, "f23" },
1574 { { "fr24" }, "f24" },
1575 { { "fr25" }, "f25" },
1576 { { "fr26" }, "f26" },
1577 { { "fr27" }, "f27" },
1578 { { "fr28" }, "f28" },
1579 { { "fr29" }, "f29" },
1580 { { "fr30" }, "f30" },
1581 { { "fr31" }, "f31" },
1582 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001583};
1584
Craig Topperf054e3a2015-10-19 03:52:27 +00001585ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1586 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001587}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001588
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001589class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001590public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001591 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1592 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001593 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001594
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001595 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001596 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001597 case llvm::Triple::FreeBSD:
1598 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001599 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001600 PtrDiffType = SignedInt;
1601 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001602 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001603 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001604 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001605 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001606
Roman Divacky3ffe7462012-03-13 19:20:17 +00001607 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1608 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001609 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001610 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001611
1612 // PPC32 supports atomics up to 4 bytes.
1613 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001614 }
1615
Craig Topper3164f332014-03-11 03:39:26 +00001616 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001617 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001618 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001619 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001620};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001621
Bill Schmidt778d3872013-07-26 01:36:11 +00001622// Note: ABI differences may eventually require us to have a separate
1623// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001624class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001625public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001626 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1627 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001628 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001629 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001630 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001631
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001632 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001633 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001634 ABI = "elfv2";
1635 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001636 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001637 ABI = "elfv1";
1638 }
1639
1640 switch (getTriple().getOS()) {
1641 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001642 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001643 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001644 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001645 case llvm::Triple::NetBSD:
1646 IntMaxType = SignedLongLong;
1647 Int64Type = SignedLongLong;
1648 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001649 default:
1650 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001651 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001652
1653 // PPC64 supports atomics up to 8 bytes.
1654 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001655 }
Craig Topper3164f332014-03-11 03:39:26 +00001656 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001657 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001658 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001659 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001660 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001661 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001662 ABI = Name;
1663 return true;
1664 }
1665 return false;
1666 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001667};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001669class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001670public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001671 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1672 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001673 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001674 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001675 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001676 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001677 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001678 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001679 }
Craig Topper3164f332014-03-11 03:39:26 +00001680 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001681 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001682 }
1683};
1684
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001685class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001686public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001687 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1688 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001689 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001690 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001691 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001692 }
1693};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001694
Eric Christopherc48497a2015-09-18 21:26:24 +00001695static const unsigned NVPTXAddrSpaceMap[] = {
1696 1, // opencl_global
1697 3, // opencl_local
1698 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001699 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001700 0, // opencl_generic
1701 1, // cuda_device
1702 4, // cuda_constant
1703 3, // cuda_shared
1704};
1705
1706class NVPTXTargetInfo : public TargetInfo {
1707 static const char *const GCCRegNames[];
1708 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001709 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001710
Eric Christopherc48497a2015-09-18 21:26:24 +00001711public:
Justin Lebar76945b22016-04-29 23:05:19 +00001712 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001714 TLSSupported = false;
1715 LongWidth = LongAlign = 64;
1716 AddrSpaceMap = &NVPTXAddrSpaceMap;
1717 UseAddrSpaceMapMangling = true;
1718 // Define available target features
1719 // These must be defined in sorted order!
1720 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001721 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001722
1723 // If possible, get a TargetInfo for our host triple, so we can match its
1724 // types.
1725 llvm::Triple HostTriple(Opts.HostTriple);
1726 if (HostTriple.isNVPTX())
1727 return;
1728 std::unique_ptr<TargetInfo> HostTarget(
1729 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1730 if (!HostTarget) {
1731 return;
1732 }
1733
1734 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1735 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1736 BoolWidth = HostTarget->getBoolWidth();
1737 BoolAlign = HostTarget->getBoolAlign();
1738 IntWidth = HostTarget->getIntWidth();
1739 IntAlign = HostTarget->getIntAlign();
1740 HalfWidth = HostTarget->getHalfWidth();
1741 HalfAlign = HostTarget->getHalfAlign();
1742 FloatWidth = HostTarget->getFloatWidth();
1743 FloatAlign = HostTarget->getFloatAlign();
1744 DoubleWidth = HostTarget->getDoubleWidth();
1745 DoubleAlign = HostTarget->getDoubleAlign();
1746 LongWidth = HostTarget->getLongWidth();
1747 LongAlign = HostTarget->getLongAlign();
1748 LongLongWidth = HostTarget->getLongLongWidth();
1749 LongLongAlign = HostTarget->getLongLongAlign();
1750 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1751 DefaultAlignForAttributeAligned =
1752 HostTarget->getDefaultAlignForAttributeAligned();
1753 SizeType = HostTarget->getSizeType();
1754 IntMaxType = HostTarget->getIntMaxType();
1755 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1756 IntPtrType = HostTarget->getIntPtrType();
1757 WCharType = HostTarget->getWCharType();
1758 WIntType = HostTarget->getWIntType();
1759 Char16Type = HostTarget->getChar16Type();
1760 Char32Type = HostTarget->getChar32Type();
1761 Int64Type = HostTarget->getInt64Type();
1762 SigAtomicType = HostTarget->getSigAtomicType();
1763 ProcessIDType = HostTarget->getProcessIDType();
1764
1765 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1766 UseZeroLengthBitfieldAlignment =
1767 HostTarget->useZeroLengthBitfieldAlignment();
1768 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1769 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1770
Justin Lebar5057f172016-09-09 20:35:43 +00001771 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1772 // we need those macros to be identical on host and device, because (among
1773 // other things) they affect which standard library classes are defined, and
1774 // we need all classes to be defined on both the host and device.
1775 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1776
Justin Lebar76945b22016-04-29 23:05:19 +00001777 // Properties intentionally not copied from host:
1778 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1779 // host/device boundary.
1780 // - SuitableAlign: Not visible across the host/device boundary, and may
1781 // correctly be different on host/device, e.g. if host has wider vector
1782 // types than device.
1783 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1784 // as its double type, but that's not necessarily true on the host.
1785 // TODO: nvcc emits a warning when using long double on device; we should
1786 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001787 }
1788 void getTargetDefines(const LangOptions &Opts,
1789 MacroBuilder &Builder) const override {
1790 Builder.defineMacro("__PTX__");
1791 Builder.defineMacro("__NVPTX__");
1792 if (Opts.CUDAIsDevice) {
1793 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001794 std::string CUDAArchCode = [this] {
1795 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001796 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001797 assert(false && "No GPU arch when compiling CUDA device code.");
1798 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001799 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001800 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001801 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001802 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001803 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001804 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001805 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001806 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001807 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001808 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001809 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001810 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001811 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001812 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001813 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001814 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001815 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001816 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001817 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001818 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001819 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001820 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001821 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001822 return "620";
1823 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001824 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001825 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001826 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001827 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001828 }
Craig Topper6c03a542015-10-19 04:51:35 +00001829 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1830 return llvm::makeArrayRef(BuiltinInfo,
1831 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001832 }
1833 bool hasFeature(StringRef Feature) const override {
1834 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001835 }
1836
Craig Topperf054e3a2015-10-19 03:52:27 +00001837 ArrayRef<const char *> getGCCRegNames() const override;
1838 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001839 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001840 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001841 }
1842 bool validateAsmConstraint(const char *&Name,
1843 TargetInfo::ConstraintInfo &Info) const override {
1844 switch (*Name) {
1845 default:
1846 return false;
1847 case 'c':
1848 case 'h':
1849 case 'r':
1850 case 'l':
1851 case 'f':
1852 case 'd':
1853 Info.setAllowsRegister();
1854 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001855 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001856 }
1857 const char *getClobbers() const override {
1858 // FIXME: Is this really right?
1859 return "";
1860 }
1861 BuiltinVaListKind getBuiltinVaListKind() const override {
1862 // FIXME: implement
1863 return TargetInfo::CharPtrBuiltinVaList;
1864 }
1865 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001866 GPU = StringToCudaArch(Name);
1867 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001868 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001869 void setSupportedOpenCLOpts() override {
1870 auto &Opts = getSupportedOpenCLOpts();
1871 Opts.cl_clang_storage_class_specifiers = 1;
1872 Opts.cl_khr_gl_sharing = 1;
1873 Opts.cl_khr_icd = 1;
1874
1875 Opts.cl_khr_fp64 = 1;
1876 Opts.cl_khr_byte_addressable_store = 1;
1877 Opts.cl_khr_global_int32_base_atomics = 1;
1878 Opts.cl_khr_global_int32_extended_atomics = 1;
1879 Opts.cl_khr_local_int32_base_atomics = 1;
1880 Opts.cl_khr_local_int32_extended_atomics = 1;
1881 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001882};
1883
1884const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1885#define BUILTIN(ID, TYPE, ATTRS) \
1886 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1887#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1888 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1889#include "clang/Basic/BuiltinsNVPTX.def"
1890};
1891
1892const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1893
Craig Topperf054e3a2015-10-19 03:52:27 +00001894ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1895 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001896}
1897
1898class NVPTX32TargetInfo : public NVPTXTargetInfo {
1899public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001900 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1901 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001902 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001903 PointerWidth = PointerAlign = 32;
1904 SizeType = TargetInfo::UnsignedInt;
1905 PtrDiffType = TargetInfo::SignedInt;
1906 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001907 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001908 }
1909};
1910
1911class NVPTX64TargetInfo : public NVPTXTargetInfo {
1912public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001913 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1914 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001915 PointerWidth = PointerAlign = 64;
1916 SizeType = TargetInfo::UnsignedLong;
1917 PtrDiffType = TargetInfo::SignedLong;
1918 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001919 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001920 }
1921};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001922
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001923static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001924 1, // opencl_global
1925 3, // opencl_local
1926 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001927 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001928 1, // cuda_device
1929 2, // cuda_constant
1930 3 // cuda_shared
1931};
1932
Tom Stellarda96344b2014-08-21 13:58:40 +00001933// If you edit the description strings, make sure you update
1934// getPointerWidthV().
1935
Craig Topper273dbc62015-10-18 05:29:26 +00001936static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001937 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1938 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001939
Craig Topper273dbc62015-10-18 05:29:26 +00001940static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001941 "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 +00001942 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1943 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001944
Matt Arsenault250024f2016-06-08 01:56:42 +00001945class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001946 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001947 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001948
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001949 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001950 enum GPUKind {
1951 GK_NONE,
1952 GK_R600,
1953 GK_R600_DOUBLE_OPS,
1954 GK_R700,
1955 GK_R700_DOUBLE_OPS,
1956 GK_EVERGREEN,
1957 GK_EVERGREEN_DOUBLE_OPS,
1958 GK_NORTHERN_ISLANDS,
1959 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001960 GK_GFX6,
1961 GK_GFX7,
1962 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00001963 } GPU;
1964
Jan Veselyeebeaea2015-05-04 19:53:36 +00001965 bool hasFP64:1;
1966 bool hasFMAF:1;
1967 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00001968 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001969
Matt Arsenault250024f2016-06-08 01:56:42 +00001970 static bool isAMDGCN(const llvm::Triple &TT) {
1971 return TT.getArch() == llvm::Triple::amdgcn;
1972 }
1973
Eli Friedmand13b41e2012-10-12 23:32:00 +00001974public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00001975 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00001976 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001977 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00001978 hasFP64(false),
1979 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00001980 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00001981 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00001982 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001983 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001984 hasFMAF = true;
1985 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001986 }
Matt Arsenault250024f2016-06-08 01:56:42 +00001987
1988 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1989 DataLayoutStringSI : DataLayoutStringR600);
1990
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001991 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001992 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001993 }
1994
Tom Stellarda96344b2014-08-21 13:58:40 +00001995 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1996 if (GPU <= GK_CAYMAN)
1997 return 32;
1998
1999 switch(AddrSpace) {
2000 default:
2001 return 64;
2002 case 0:
2003 case 3:
2004 case 5:
2005 return 32;
2006 }
2007 }
2008
Yaxun Liu26f75662016-08-19 05:17:25 +00002009 uint64_t getMaxPointerWidth() const override {
2010 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2011 }
2012
Craig Topper3164f332014-03-11 03:39:26 +00002013 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002014 return "";
2015 }
2016
Craig Topperf054e3a2015-10-19 03:52:27 +00002017 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002018
Craig Topperf054e3a2015-10-19 03:52:27 +00002019 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2020 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002021 }
2022
Craig Topper3164f332014-03-11 03:39:26 +00002023 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002024 TargetInfo::ConstraintInfo &Info) const override {
2025 switch (*Name) {
2026 default: break;
2027 case 'v': // vgpr
2028 case 's': // sgpr
2029 Info.setAllowsRegister();
2030 return true;
2031 }
2032 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002033 }
2034
Matt Arsenault250024f2016-06-08 01:56:42 +00002035 bool initFeatureMap(llvm::StringMap<bool> &Features,
2036 DiagnosticsEngine &Diags, StringRef CPU,
2037 const std::vector<std::string> &FeatureVec) const override;
2038
Yaxun Liu2c17e822016-08-09 19:43:38 +00002039 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2040 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002041 bool hasFP32Denormals = false;
2042 bool hasFP64Denormals = false;
2043 for (auto &I : TargetOpts.FeaturesAsWritten) {
2044 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2045 hasFP32Denormals = true;
2046 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2047 hasFP64Denormals = true;
2048 }
2049 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002050 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2051 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2052 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002053 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002054 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002055 }
2056
Craig Topper6c03a542015-10-19 04:51:35 +00002057 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2058 return llvm::makeArrayRef(BuiltinInfo,
2059 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002060 }
2061
Craig Topper3164f332014-03-11 03:39:26 +00002062 void getTargetDefines(const LangOptions &Opts,
2063 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002064 if (getTriple().getArch() == llvm::Triple::amdgcn)
2065 Builder.defineMacro("__AMDGCN__");
2066 else
2067 Builder.defineMacro("__R600__");
2068
Jan Veselyeebeaea2015-05-04 19:53:36 +00002069 if (hasFMAF)
2070 Builder.defineMacro("__HAS_FMAF__");
2071 if (hasLDEXPF)
2072 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002073 if (hasFP64)
2074 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002075 }
2076
Craig Topper3164f332014-03-11 03:39:26 +00002077 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002078 return TargetInfo::CharPtrBuiltinVaList;
2079 }
2080
Matt Arsenault250024f2016-06-08 01:56:42 +00002081 static GPUKind parseR600Name(StringRef Name) {
2082 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002083 .Case("r600" , GK_R600)
2084 .Case("rv610", GK_R600)
2085 .Case("rv620", GK_R600)
2086 .Case("rv630", GK_R600)
2087 .Case("rv635", GK_R600)
2088 .Case("rs780", GK_R600)
2089 .Case("rs880", GK_R600)
2090 .Case("rv670", GK_R600_DOUBLE_OPS)
2091 .Case("rv710", GK_R700)
2092 .Case("rv730", GK_R700)
2093 .Case("rv740", GK_R700_DOUBLE_OPS)
2094 .Case("rv770", GK_R700_DOUBLE_OPS)
2095 .Case("palm", GK_EVERGREEN)
2096 .Case("cedar", GK_EVERGREEN)
2097 .Case("sumo", GK_EVERGREEN)
2098 .Case("sumo2", GK_EVERGREEN)
2099 .Case("redwood", GK_EVERGREEN)
2100 .Case("juniper", GK_EVERGREEN)
2101 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2102 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2103 .Case("barts", GK_NORTHERN_ISLANDS)
2104 .Case("turks", GK_NORTHERN_ISLANDS)
2105 .Case("caicos", GK_NORTHERN_ISLANDS)
2106 .Case("cayman", GK_CAYMAN)
2107 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002108 .Default(GK_NONE);
2109 }
2110
2111 static GPUKind parseAMDGCNName(StringRef Name) {
2112 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002113 .Case("tahiti", GK_GFX6)
2114 .Case("pitcairn", GK_GFX6)
2115 .Case("verde", GK_GFX6)
2116 .Case("oland", GK_GFX6)
2117 .Case("hainan", GK_GFX6)
2118 .Case("bonaire", GK_GFX7)
2119 .Case("kabini", GK_GFX7)
2120 .Case("kaveri", GK_GFX7)
2121 .Case("hawaii", GK_GFX7)
2122 .Case("mullins", GK_GFX7)
2123 .Case("tonga", GK_GFX8)
2124 .Case("iceland", GK_GFX8)
2125 .Case("carrizo", GK_GFX8)
2126 .Case("fiji", GK_GFX8)
2127 .Case("stoney", GK_GFX8)
2128 .Case("polaris10", GK_GFX8)
2129 .Case("polaris11", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002130 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002131 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002132
Matt Arsenault250024f2016-06-08 01:56:42 +00002133 bool setCPU(const std::string &Name) override {
2134 if (getTriple().getArch() == llvm::Triple::amdgcn)
2135 GPU = parseAMDGCNName(Name);
2136 else
2137 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002138
Matt Arsenault250024f2016-06-08 01:56:42 +00002139 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002140 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002141
Jan Vesely211ba782016-06-17 02:25:03 +00002142 void setSupportedOpenCLOpts() override {
2143 auto &Opts = getSupportedOpenCLOpts();
2144 Opts.cl_clang_storage_class_specifiers = 1;
2145 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002146
Jan Vesely211ba782016-06-17 02:25:03 +00002147 if (hasFP64)
2148 Opts.cl_khr_fp64 = 1;
2149 if (GPU >= GK_EVERGREEN) {
2150 Opts.cl_khr_byte_addressable_store = 1;
2151 Opts.cl_khr_global_int32_base_atomics = 1;
2152 Opts.cl_khr_global_int32_extended_atomics = 1;
2153 Opts.cl_khr_local_int32_base_atomics = 1;
2154 Opts.cl_khr_local_int32_extended_atomics = 1;
2155 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002156 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002157 Opts.cl_khr_fp16 = 1;
2158 Opts.cl_khr_int64_base_atomics = 1;
2159 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002160 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002161 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002162 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002163 Opts.cl_amd_media_ops = 1;
2164 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002165 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002166 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002167
Yaxun Liu99444cb2016-08-03 20:38:06 +00002168 LangAS::ID getOpenCLImageAddrSpace() const override {
2169 return LangAS::opencl_constant;
2170 }
2171
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002172 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2173 switch (CC) {
2174 default:
2175 return CCCR_Warning;
2176 case CC_C:
2177 case CC_OpenCLKernel:
2178 return CCCR_OK;
2179 }
2180 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002181};
2182
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002183const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002184#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002185 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002186#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2187 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002188#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002189};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002190const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002191 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2192 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2193 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2194 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2195 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2196 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2197 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2198 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2199 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2200 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2201 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2202 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2203 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2204 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2205 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2206 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2207 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2208 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2209 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2210 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2211 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2212 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2213 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2214 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2215 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2216 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2217 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2218 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2219 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2220 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2221 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2222 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2223 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2224 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2225 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2226 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2227 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2228 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2229 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2230 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2231 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2232 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2233 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2234 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2235 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2236 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2237 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002238 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002239 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2240 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002241};
2242
Craig Topperf054e3a2015-10-19 03:52:27 +00002243ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2244 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002245}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002246
Matt Arsenault250024f2016-06-08 01:56:42 +00002247bool AMDGPUTargetInfo::initFeatureMap(
2248 llvm::StringMap<bool> &Features,
2249 DiagnosticsEngine &Diags, StringRef CPU,
2250 const std::vector<std::string> &FeatureVec) const {
2251
2252 // XXX - What does the member GPU mean if device name string passed here?
2253 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2254 if (CPU.empty())
2255 CPU = "tahiti";
2256
2257 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002258 case GK_GFX6:
2259 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002260 break;
2261
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002262 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002263 Features["s-memrealtime"] = true;
2264 Features["16-bit-insts"] = true;
2265 break;
2266
2267 case GK_NONE:
2268 return false;
2269 default:
2270 llvm_unreachable("unhandled subtarget");
2271 }
2272 } else {
2273 if (CPU.empty())
2274 CPU = "r600";
2275
2276 switch (parseR600Name(CPU)) {
2277 case GK_R600:
2278 case GK_R700:
2279 case GK_EVERGREEN:
2280 case GK_NORTHERN_ISLANDS:
2281 break;
2282 case GK_R600_DOUBLE_OPS:
2283 case GK_R700_DOUBLE_OPS:
2284 case GK_EVERGREEN_DOUBLE_OPS:
2285 case GK_CAYMAN:
2286 Features["fp64"] = true;
2287 break;
2288 case GK_NONE:
2289 return false;
2290 default:
2291 llvm_unreachable("unhandled subtarget");
2292 }
2293 }
2294
2295 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2296}
2297
Eli Friedman3fd920a2008-08-20 02:34:37 +00002298// Namespace for x86 abstract base class
2299const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002300#define BUILTIN(ID, TYPE, ATTRS) \
2301 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002302#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002303 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002304#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002305 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002306#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002307};
Eli Friedmanb5366062008-05-20 14:21:01 +00002308
Nuno Lopescfca1f02009-12-23 17:49:57 +00002309static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002310 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2311 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002312 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002313 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2314 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2315 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002316 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002317 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2318 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002319 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2320 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2321 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2322 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2323 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2324 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2325 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2326 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002327};
2328
Eric Christophercdd36352011-06-21 00:05:20 +00002329const TargetInfo::AddlRegName AddlRegNames[] = {
2330 { { "al", "ah", "eax", "rax" }, 0 },
2331 { { "bl", "bh", "ebx", "rbx" }, 3 },
2332 { { "cl", "ch", "ecx", "rcx" }, 2 },
2333 { { "dl", "dh", "edx", "rdx" }, 1 },
2334 { { "esi", "rsi" }, 4 },
2335 { { "edi", "rdi" }, 5 },
2336 { { "esp", "rsp" }, 7 },
2337 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002338 { { "r8d", "r8w", "r8b" }, 38 },
2339 { { "r9d", "r9w", "r9b" }, 39 },
2340 { { "r10d", "r10w", "r10b" }, 40 },
2341 { { "r11d", "r11w", "r11b" }, 41 },
2342 { { "r12d", "r12w", "r12b" }, 42 },
2343 { { "r13d", "r13w", "r13b" }, 43 },
2344 { { "r14d", "r14w", "r14b" }, 44 },
2345 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002346};
2347
2348// X86 target abstract base class; x86-32 and x86-64 are very close, so
2349// most of the implementation can be shared.
2350class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002351 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002352 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002353 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002354 enum MMX3DNowEnum {
2355 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002356 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002357 enum XOPEnum {
2358 NoXOP,
2359 SSE4A,
2360 FMA4,
2361 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002362 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002363
Craig Topper543f3bd2015-10-14 23:47:57 +00002364 bool HasAES = false;
2365 bool HasPCLMUL = false;
2366 bool HasLZCNT = false;
2367 bool HasRDRND = false;
2368 bool HasFSGSBASE = false;
2369 bool HasBMI = false;
2370 bool HasBMI2 = false;
2371 bool HasPOPCNT = false;
2372 bool HasRTM = false;
2373 bool HasPRFCHW = false;
2374 bool HasRDSEED = false;
2375 bool HasADX = false;
2376 bool HasTBM = false;
2377 bool HasFMA = false;
2378 bool HasF16C = false;
2379 bool HasAVX512CD = false;
2380 bool HasAVX512ER = false;
2381 bool HasAVX512PF = false;
2382 bool HasAVX512DQ = false;
2383 bool HasAVX512BW = false;
2384 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002385 bool HasAVX512VBMI = false;
2386 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002387 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002388 bool HasMPX = false;
2389 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002390 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002391 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002392 bool HasXSAVE = false;
2393 bool HasXSAVEOPT = false;
2394 bool HasXSAVEC = false;
2395 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002396 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002397 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002398 bool HasCLFLUSHOPT = false;
2399 bool HasPCOMMIT = false;
2400 bool HasCLWB = false;
2401 bool HasUMIP = false;
2402 bool HasMOVBE = false;
2403 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002404
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002405 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2406 ///
2407 /// Each enumeration represents a particular CPU supported by Clang. These
2408 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2409 enum CPUKind {
2410 CK_Generic,
2411
2412 /// \name i386
2413 /// i386-generation processors.
2414 //@{
2415 CK_i386,
2416 //@}
2417
2418 /// \name i486
2419 /// i486-generation processors.
2420 //@{
2421 CK_i486,
2422 CK_WinChipC6,
2423 CK_WinChip2,
2424 CK_C3,
2425 //@}
2426
2427 /// \name i586
2428 /// i586-generation processors, P5 microarchitecture based.
2429 //@{
2430 CK_i586,
2431 CK_Pentium,
2432 CK_PentiumMMX,
2433 //@}
2434
2435 /// \name i686
2436 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2437 //@{
2438 CK_i686,
2439 CK_PentiumPro,
2440 CK_Pentium2,
2441 CK_Pentium3,
2442 CK_Pentium3M,
2443 CK_PentiumM,
2444 CK_C3_2,
2445
2446 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2447 /// Clang however has some logic to suport this.
2448 // FIXME: Warn, deprecate, and potentially remove this.
2449 CK_Yonah,
2450 //@}
2451
2452 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002453 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002454 //@{
2455 CK_Pentium4,
2456 CK_Pentium4M,
2457 CK_Prescott,
2458 CK_Nocona,
2459 //@}
2460
2461 /// \name Core
2462 /// Core microarchitecture based processors.
2463 //@{
2464 CK_Core2,
2465
2466 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2467 /// codename which GCC no longer accepts as an option to -march, but Clang
2468 /// has some logic for recognizing it.
2469 // FIXME: Warn, deprecate, and potentially remove this.
2470 CK_Penryn,
2471 //@}
2472
2473 /// \name Atom
2474 /// Atom processors
2475 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002476 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002477 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002478 //@}
2479
2480 /// \name Nehalem
2481 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002482 CK_Nehalem,
2483
2484 /// \name Westmere
2485 /// Westmere microarchitecture based processors.
2486 CK_Westmere,
2487
2488 /// \name Sandy Bridge
2489 /// Sandy Bridge microarchitecture based processors.
2490 CK_SandyBridge,
2491
2492 /// \name Ivy Bridge
2493 /// Ivy Bridge microarchitecture based processors.
2494 CK_IvyBridge,
2495
2496 /// \name Haswell
2497 /// Haswell microarchitecture based processors.
2498 CK_Haswell,
2499
2500 /// \name Broadwell
2501 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002502 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002503
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002504 /// \name Skylake Client
2505 /// Skylake client microarchitecture based processors.
2506 CK_SkylakeClient,
2507
2508 /// \name Skylake Server
2509 /// Skylake server microarchitecture based processors.
2510 CK_SkylakeServer,
2511
2512 /// \name Cannonlake Client
2513 /// Cannonlake client microarchitecture based processors.
2514 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002515
Craig Topper449314e2013-08-20 07:09:39 +00002516 /// \name Knights Landing
2517 /// Knights Landing processor.
2518 CK_KNL,
2519
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002520 /// \name Lakemont
2521 /// Lakemont microarchitecture based processors.
2522 CK_Lakemont,
2523
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002524 /// \name K6
2525 /// K6 architecture processors.
2526 //@{
2527 CK_K6,
2528 CK_K6_2,
2529 CK_K6_3,
2530 //@}
2531
2532 /// \name K7
2533 /// K7 architecture processors.
2534 //@{
2535 CK_Athlon,
2536 CK_AthlonThunderbird,
2537 CK_Athlon4,
2538 CK_AthlonXP,
2539 CK_AthlonMP,
2540 //@}
2541
2542 /// \name K8
2543 /// K8 architecture processors.
2544 //@{
2545 CK_Athlon64,
2546 CK_Athlon64SSE3,
2547 CK_AthlonFX,
2548 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002549 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002550 CK_Opteron,
2551 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002552 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002553 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002554
Benjamin Kramer569f2152012-01-10 11:50:18 +00002555 /// \name Bobcat
2556 /// Bobcat architecture processors.
2557 //@{
2558 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002559 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002560 //@}
2561
2562 /// \name Bulldozer
2563 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002564 //@{
2565 CK_BDVER1,
2566 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002567 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002568 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002569 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002570
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002571 /// This specification is deprecated and will be removed in the future.
2572 /// Users should prefer \see CK_K8.
2573 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002574 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002575 CK_x86_64,
2576 //@}
2577
2578 /// \name Geode
2579 /// Geode processors.
2580 //@{
2581 CK_Geode
2582 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002583 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002584
Eric Christopherc50738f2015-08-27 00:05:50 +00002585 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002586 return llvm::StringSwitch<CPUKind>(CPU)
2587 .Case("i386", CK_i386)
2588 .Case("i486", CK_i486)
2589 .Case("winchip-c6", CK_WinChipC6)
2590 .Case("winchip2", CK_WinChip2)
2591 .Case("c3", CK_C3)
2592 .Case("i586", CK_i586)
2593 .Case("pentium", CK_Pentium)
2594 .Case("pentium-mmx", CK_PentiumMMX)
2595 .Case("i686", CK_i686)
2596 .Case("pentiumpro", CK_PentiumPro)
2597 .Case("pentium2", CK_Pentium2)
2598 .Case("pentium3", CK_Pentium3)
2599 .Case("pentium3m", CK_Pentium3M)
2600 .Case("pentium-m", CK_PentiumM)
2601 .Case("c3-2", CK_C3_2)
2602 .Case("yonah", CK_Yonah)
2603 .Case("pentium4", CK_Pentium4)
2604 .Case("pentium4m", CK_Pentium4M)
2605 .Case("prescott", CK_Prescott)
2606 .Case("nocona", CK_Nocona)
2607 .Case("core2", CK_Core2)
2608 .Case("penryn", CK_Penryn)
2609 .Case("bonnell", CK_Bonnell)
2610 .Case("atom", CK_Bonnell) // Legacy name.
2611 .Case("silvermont", CK_Silvermont)
2612 .Case("slm", CK_Silvermont) // Legacy name.
2613 .Case("nehalem", CK_Nehalem)
2614 .Case("corei7", CK_Nehalem) // Legacy name.
2615 .Case("westmere", CK_Westmere)
2616 .Case("sandybridge", CK_SandyBridge)
2617 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2618 .Case("ivybridge", CK_IvyBridge)
2619 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2620 .Case("haswell", CK_Haswell)
2621 .Case("core-avx2", CK_Haswell) // Legacy name.
2622 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002623 .Case("skylake", CK_SkylakeClient)
2624 .Case("skylake-avx512", CK_SkylakeServer)
2625 .Case("skx", CK_SkylakeServer) // Legacy name.
2626 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002627 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002628 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002629 .Case("k6", CK_K6)
2630 .Case("k6-2", CK_K6_2)
2631 .Case("k6-3", CK_K6_3)
2632 .Case("athlon", CK_Athlon)
2633 .Case("athlon-tbird", CK_AthlonThunderbird)
2634 .Case("athlon-4", CK_Athlon4)
2635 .Case("athlon-xp", CK_AthlonXP)
2636 .Case("athlon-mp", CK_AthlonMP)
2637 .Case("athlon64", CK_Athlon64)
2638 .Case("athlon64-sse3", CK_Athlon64SSE3)
2639 .Case("athlon-fx", CK_AthlonFX)
2640 .Case("k8", CK_K8)
2641 .Case("k8-sse3", CK_K8SSE3)
2642 .Case("opteron", CK_Opteron)
2643 .Case("opteron-sse3", CK_OpteronSSE3)
2644 .Case("barcelona", CK_AMDFAM10)
2645 .Case("amdfam10", CK_AMDFAM10)
2646 .Case("btver1", CK_BTVER1)
2647 .Case("btver2", CK_BTVER2)
2648 .Case("bdver1", CK_BDVER1)
2649 .Case("bdver2", CK_BDVER2)
2650 .Case("bdver3", CK_BDVER3)
2651 .Case("bdver4", CK_BDVER4)
2652 .Case("x86-64", CK_x86_64)
2653 .Case("geode", CK_Geode)
2654 .Default(CK_Generic);
2655 }
2656
Rafael Espindolaeb265472013-08-21 21:59:03 +00002657 enum FPMathKind {
2658 FP_Default,
2659 FP_SSE,
2660 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002661 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002662
Eli Friedman3fd920a2008-08-20 02:34:37 +00002663public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002664 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2665 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002666 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002667 }
Craig Topper3164f332014-03-11 03:39:26 +00002668 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002669 // X87 evaluates with 80 bits "long double" precision.
2670 return SSELevel == NoSSE ? 2 : 0;
2671 }
Craig Topper6c03a542015-10-19 04:51:35 +00002672 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2673 return llvm::makeArrayRef(BuiltinInfo,
2674 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002675 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002676 ArrayRef<const char *> getGCCRegNames() const override {
2677 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002678 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002679 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2680 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002681 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002682 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2683 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002684 }
Eric Christopherd9832702015-06-29 21:00:05 +00002685 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002686 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002687 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002688
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002689 bool validateGlobalRegisterVariable(StringRef RegName,
2690 unsigned RegSize,
2691 bool &HasSizeMismatch) const override {
2692 // esp and ebp are the only 32-bit registers the x86 backend can currently
2693 // handle.
2694 if (RegName.equals("esp") || RegName.equals("ebp")) {
2695 // Check that the register size is 32-bit.
2696 HasSizeMismatch = RegSize != 32;
2697 return true;
2698 }
2699
2700 return false;
2701 }
2702
Akira Hatanaka974131e2014-09-18 18:17:18 +00002703 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2704
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002705 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2706
Akira Hatanaka974131e2014-09-18 18:17:18 +00002707 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2708
Craig Topper3164f332014-03-11 03:39:26 +00002709 std::string convertConstraint(const char *&Constraint) const override;
2710 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002711 return "~{dirflag},~{fpsr},~{flags}";
2712 }
Craig Topper3164f332014-03-11 03:39:26 +00002713 void getTargetDefines(const LangOptions &Opts,
2714 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002715 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2716 bool Enabled);
2717 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2718 bool Enabled);
2719 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2720 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002721 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2722 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002723 setFeatureEnabledImpl(Features, Name, Enabled);
2724 }
2725 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002726 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002727 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2728 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002729 bool
2730 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2731 StringRef CPU,
2732 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002733 bool hasFeature(StringRef Feature) const override;
2734 bool handleTargetFeatures(std::vector<std::string> &Features,
2735 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002736 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002737 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2738 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002739 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002740 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002741 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002742 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002743 return "no-mmx";
2744 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002745 }
Craig Topper3164f332014-03-11 03:39:26 +00002746 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002747 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002748
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002749 // Perform any per-CPU checks necessary to determine if this CPU is
2750 // acceptable.
2751 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2752 // invalid without explaining *why*.
2753 switch (CPU) {
2754 case CK_Generic:
2755 // No processor selected!
2756 return false;
2757
2758 case CK_i386:
2759 case CK_i486:
2760 case CK_WinChipC6:
2761 case CK_WinChip2:
2762 case CK_C3:
2763 case CK_i586:
2764 case CK_Pentium:
2765 case CK_PentiumMMX:
2766 case CK_i686:
2767 case CK_PentiumPro:
2768 case CK_Pentium2:
2769 case CK_Pentium3:
2770 case CK_Pentium3M:
2771 case CK_PentiumM:
2772 case CK_Yonah:
2773 case CK_C3_2:
2774 case CK_Pentium4:
2775 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002776 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002777 case CK_Prescott:
2778 case CK_K6:
2779 case CK_K6_2:
2780 case CK_K6_3:
2781 case CK_Athlon:
2782 case CK_AthlonThunderbird:
2783 case CK_Athlon4:
2784 case CK_AthlonXP:
2785 case CK_AthlonMP:
2786 case CK_Geode:
2787 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002788 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002789 return false;
2790
2791 // Fallthrough
2792 case CK_Nocona:
2793 case CK_Core2:
2794 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002795 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002796 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002797 case CK_Nehalem:
2798 case CK_Westmere:
2799 case CK_SandyBridge:
2800 case CK_IvyBridge:
2801 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002802 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002803 case CK_SkylakeClient:
2804 case CK_SkylakeServer:
2805 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002806 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002807 case CK_Athlon64:
2808 case CK_Athlon64SSE3:
2809 case CK_AthlonFX:
2810 case CK_K8:
2811 case CK_K8SSE3:
2812 case CK_Opteron:
2813 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002814 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002815 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002816 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002817 case CK_BDVER1:
2818 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002819 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002820 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002821 case CK_x86_64:
2822 return true;
2823 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002824 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002825 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002826
Craig Topper3164f332014-03-11 03:39:26 +00002827 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002828
Craig Topper3164f332014-03-11 03:39:26 +00002829 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002830 // Most of the non-ARM calling conventions are i386 conventions.
2831 switch (CC) {
2832 case CC_X86ThisCall:
2833 case CC_X86FastCall:
2834 case CC_X86StdCall:
2835 case CC_X86VectorCall:
2836 case CC_C:
2837 case CC_Swift:
2838 case CC_X86Pascal:
2839 case CC_IntelOclBicc:
2840 return CCCR_OK;
2841 default:
2842 return CCCR_Warning;
2843 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002844 }
2845
Craig Topper3164f332014-03-11 03:39:26 +00002846 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002847 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002848 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002849
2850 bool hasSjLjLowering() const override {
2851 return true;
2852 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002853
2854 void setSupportedOpenCLOpts() override {
2855 getSupportedOpenCLOpts().setAll();
2856 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002857};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002858
Rafael Espindolaeb265472013-08-21 21:59:03 +00002859bool X86TargetInfo::setFPMath(StringRef Name) {
2860 if (Name == "387") {
2861 FPMath = FP_387;
2862 return true;
2863 }
2864 if (Name == "sse") {
2865 FPMath = FP_SSE;
2866 return true;
2867 }
2868 return false;
2869}
2870
Eric Christopher007b0a02015-08-28 22:32:01 +00002871bool X86TargetInfo::initFeatureMap(
2872 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002873 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002874 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002875 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002876 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002877 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002878
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002879 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002880
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002881 // Enable X87 for all X86 processors but Lakemont.
2882 if (Kind != CK_Lakemont)
2883 setFeatureEnabledImpl(Features, "x87", true);
2884
2885 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002886 case CK_Generic:
2887 case CK_i386:
2888 case CK_i486:
2889 case CK_i586:
2890 case CK_Pentium:
2891 case CK_i686:
2892 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002893 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002894 break;
2895 case CK_PentiumMMX:
2896 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002897 case CK_K6:
2898 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002899 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002900 break;
2901 case CK_Pentium3:
2902 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002903 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002904 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002905 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002906 break;
2907 case CK_PentiumM:
2908 case CK_Pentium4:
2909 case CK_Pentium4M:
2910 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002911 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002912 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002913 break;
2914 case CK_Yonah:
2915 case CK_Prescott:
2916 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002917 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002918 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002919 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002920 break;
2921 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002922 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002923 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002924 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002925 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002926 break;
2927 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002928 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002929 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002930 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002931 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002932 case CK_Cannonlake:
2933 setFeatureEnabledImpl(Features, "avx512ifma", true);
2934 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2935 setFeatureEnabledImpl(Features, "sha", true);
2936 setFeatureEnabledImpl(Features, "umip", true);
2937 // FALLTHROUGH
2938 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002939 setFeatureEnabledImpl(Features, "avx512f", true);
2940 setFeatureEnabledImpl(Features, "avx512cd", true);
2941 setFeatureEnabledImpl(Features, "avx512dq", true);
2942 setFeatureEnabledImpl(Features, "avx512bw", true);
2943 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002944 setFeatureEnabledImpl(Features, "pku", true);
2945 setFeatureEnabledImpl(Features, "pcommit", true);
2946 setFeatureEnabledImpl(Features, "clwb", true);
2947 // FALLTHROUGH
2948 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002949 setFeatureEnabledImpl(Features, "xsavec", true);
2950 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002951 setFeatureEnabledImpl(Features, "mpx", true);
2952 setFeatureEnabledImpl(Features, "sgx", true);
2953 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002954 // FALLTHROUGH
2955 case CK_Broadwell:
2956 setFeatureEnabledImpl(Features, "rdseed", true);
2957 setFeatureEnabledImpl(Features, "adx", true);
2958 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002959 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002960 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002961 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002962 setFeatureEnabledImpl(Features, "bmi", true);
2963 setFeatureEnabledImpl(Features, "bmi2", true);
2964 setFeatureEnabledImpl(Features, "rtm", true);
2965 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002966 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002967 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002968 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002969 setFeatureEnabledImpl(Features, "rdrnd", true);
2970 setFeatureEnabledImpl(Features, "f16c", true);
2971 setFeatureEnabledImpl(Features, "fsgsbase", true);
2972 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002973 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002974 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002975 setFeatureEnabledImpl(Features, "xsave", true);
2976 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002977 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002978 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002979 case CK_Silvermont:
2980 setFeatureEnabledImpl(Features, "aes", true);
2981 setFeatureEnabledImpl(Features, "pclmul", true);
2982 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002983 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002984 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002985 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002986 setFeatureEnabledImpl(Features, "cx16", true);
2987 break;
2988 case CK_KNL:
2989 setFeatureEnabledImpl(Features, "avx512f", true);
2990 setFeatureEnabledImpl(Features, "avx512cd", true);
2991 setFeatureEnabledImpl(Features, "avx512er", true);
2992 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002993 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002994 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002995 setFeatureEnabledImpl(Features, "rdseed", true);
2996 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002997 setFeatureEnabledImpl(Features, "lzcnt", true);
2998 setFeatureEnabledImpl(Features, "bmi", true);
2999 setFeatureEnabledImpl(Features, "bmi2", true);
3000 setFeatureEnabledImpl(Features, "rtm", true);
3001 setFeatureEnabledImpl(Features, "fma", true);
3002 setFeatureEnabledImpl(Features, "rdrnd", true);
3003 setFeatureEnabledImpl(Features, "f16c", true);
3004 setFeatureEnabledImpl(Features, "fsgsbase", true);
3005 setFeatureEnabledImpl(Features, "aes", true);
3006 setFeatureEnabledImpl(Features, "pclmul", true);
3007 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003008 setFeatureEnabledImpl(Features, "xsaveopt", true);
3009 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003010 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003011 break;
3012 case CK_K6_2:
3013 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003014 case CK_WinChip2:
3015 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003016 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003017 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003018 case CK_Athlon:
3019 case CK_AthlonThunderbird:
3020 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003021 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003022 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003023 case CK_Athlon4:
3024 case CK_AthlonXP:
3025 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003026 setFeatureEnabledImpl(Features, "sse", true);
3027 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003028 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003029 break;
3030 case CK_K8:
3031 case CK_Opteron:
3032 case CK_Athlon64:
3033 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003034 setFeatureEnabledImpl(Features, "sse2", true);
3035 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003036 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003037 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003038 case CK_AMDFAM10:
3039 setFeatureEnabledImpl(Features, "sse4a", true);
3040 setFeatureEnabledImpl(Features, "lzcnt", true);
3041 setFeatureEnabledImpl(Features, "popcnt", true);
3042 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003043 case CK_K8SSE3:
3044 case CK_OpteronSSE3:
3045 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003046 setFeatureEnabledImpl(Features, "sse3", true);
3047 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003048 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003049 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003050 case CK_BTVER2:
3051 setFeatureEnabledImpl(Features, "avx", true);
3052 setFeatureEnabledImpl(Features, "aes", true);
3053 setFeatureEnabledImpl(Features, "pclmul", true);
3054 setFeatureEnabledImpl(Features, "bmi", true);
3055 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003056 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003057 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003058 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003059 setFeatureEnabledImpl(Features, "ssse3", true);
3060 setFeatureEnabledImpl(Features, "sse4a", true);
3061 setFeatureEnabledImpl(Features, "lzcnt", true);
3062 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003063 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003064 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003065 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003066 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003067 case CK_BDVER4:
3068 setFeatureEnabledImpl(Features, "avx2", true);
3069 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003070 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003071 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003072 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003073 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003074 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003075 // FALLTHROUGH
3076 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003077 setFeatureEnabledImpl(Features, "bmi", true);
3078 setFeatureEnabledImpl(Features, "fma", true);
3079 setFeatureEnabledImpl(Features, "f16c", true);
3080 setFeatureEnabledImpl(Features, "tbm", true);
3081 // FALLTHROUGH
3082 case CK_BDVER1:
3083 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003084 setFeatureEnabledImpl(Features, "xop", true);
3085 setFeatureEnabledImpl(Features, "lzcnt", true);
3086 setFeatureEnabledImpl(Features, "aes", true);
3087 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003088 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003089 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003090 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003091 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003092 break;
Eli Friedman33465822011-07-08 23:31:17 +00003093 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003094 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3095 return false;
3096
3097 // Can't do this earlier because we need to be able to explicitly enable
3098 // or disable these features and the things that they depend upon.
3099
3100 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3101 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003102 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003103 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3104 FeaturesVec.end())
3105 Features["popcnt"] = true;
3106
3107 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3108 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003109 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003110 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3111 FeaturesVec.end())
3112 Features["prfchw"] = true;
3113
Eric Christophera7260af2015-10-08 20:10:18 +00003114 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3115 // then enable MMX.
3116 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003117 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003118 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3119 FeaturesVec.end())
3120 Features["mmx"] = true;
3121
Eric Christopherbbd746d2015-10-08 20:10:14 +00003122 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003123}
3124
Rafael Espindolae62e2792013-08-20 13:44:29 +00003125void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003126 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003127 if (Enabled) {
3128 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003129 case AVX512F:
3130 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003131 case AVX2:
3132 Features["avx2"] = true;
3133 case AVX:
3134 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003135 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003136 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003137 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003138 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003139 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003140 case SSSE3:
3141 Features["ssse3"] = true;
3142 case SSE3:
3143 Features["sse3"] = true;
3144 case SSE2:
3145 Features["sse2"] = true;
3146 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003147 Features["sse"] = true;
3148 case NoSSE:
3149 break;
3150 }
3151 return;
3152 }
3153
3154 switch (Level) {
3155 case NoSSE:
3156 case SSE1:
3157 Features["sse"] = false;
3158 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003159 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3160 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003161 case SSE3:
3162 Features["sse3"] = false;
3163 setXOPLevel(Features, NoXOP, false);
3164 case SSSE3:
3165 Features["ssse3"] = false;
3166 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003167 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003168 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003169 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003170 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003171 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3172 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003173 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003174 case AVX2:
3175 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003176 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003177 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003178 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003179 Features["avx512vl"] = Features["avx512vbmi"] =
3180 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003181 }
3182}
3183
3184void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003185 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003186 if (Enabled) {
3187 switch (Level) {
3188 case AMD3DNowAthlon:
3189 Features["3dnowa"] = true;
3190 case AMD3DNow:
3191 Features["3dnow"] = true;
3192 case MMX:
3193 Features["mmx"] = true;
3194 case NoMMX3DNow:
3195 break;
3196 }
3197 return;
3198 }
3199
3200 switch (Level) {
3201 case NoMMX3DNow:
3202 case MMX:
3203 Features["mmx"] = false;
3204 case AMD3DNow:
3205 Features["3dnow"] = false;
3206 case AMD3DNowAthlon:
3207 Features["3dnowa"] = false;
3208 }
3209}
3210
3211void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003212 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003213 if (Enabled) {
3214 switch (Level) {
3215 case XOP:
3216 Features["xop"] = true;
3217 case FMA4:
3218 Features["fma4"] = true;
3219 setSSELevel(Features, AVX, true);
3220 case SSE4A:
3221 Features["sse4a"] = true;
3222 setSSELevel(Features, SSE3, true);
3223 case NoXOP:
3224 break;
3225 }
3226 return;
3227 }
3228
3229 switch (Level) {
3230 case NoXOP:
3231 case SSE4A:
3232 Features["sse4a"] = false;
3233 case FMA4:
3234 Features["fma4"] = false;
3235 case XOP:
3236 Features["xop"] = false;
3237 }
3238}
3239
Craig Topper86d79ef2013-09-17 04:51:29 +00003240void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3241 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003242 // This is a bit of a hack to deal with the sse4 target feature when used
3243 // as part of the target attribute. We handle sse4 correctly everywhere
3244 // else. See below for more information on how we handle the sse4 options.
3245 if (Name != "sse4")
3246 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003247
Craig Topper29561122013-09-19 01:13:07 +00003248 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003249 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003250 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003251 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003252 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003253 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003254 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003255 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003256 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003257 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003258 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003259 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003260 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003261 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003262 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003263 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003264 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003265 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003266 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003267 if (Enabled)
3268 setSSELevel(Features, SSE2, Enabled);
3269 } else if (Name == "pclmul") {
3270 if (Enabled)
3271 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003272 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003273 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003274 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003275 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003276 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003277 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003278 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3279 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3280 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003281 if (Enabled)
3282 setSSELevel(Features, AVX512F, Enabled);
3283 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003284 if (Enabled)
3285 setSSELevel(Features, AVX, Enabled);
3286 } else if (Name == "fma4") {
3287 setXOPLevel(Features, FMA4, Enabled);
3288 } else if (Name == "xop") {
3289 setXOPLevel(Features, XOP, Enabled);
3290 } else if (Name == "sse4a") {
3291 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003292 } else if (Name == "f16c") {
3293 if (Enabled)
3294 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003295 } else if (Name == "sha") {
3296 if (Enabled)
3297 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003298 } else if (Name == "sse4") {
3299 // We can get here via the __target__ attribute since that's not controlled
3300 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3301 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3302 // disabled.
3303 if (Enabled)
3304 setSSELevel(Features, SSE42, Enabled);
3305 else
3306 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003307 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003308 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003309 Features["xsaveopt"] = false;
3310 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003311 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003312 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003313 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003314}
3315
Eric Christopher3ff21b32013-10-16 21:26:26 +00003316/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003317/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003318bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003319 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003320 for (const auto &Feature : Features) {
3321 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003322 continue;
3323
Eric Christopher610fe112015-08-26 08:21:55 +00003324 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003325 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003326 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003327 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003328 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003329 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003330 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003331 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003332 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003333 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003334 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003335 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003336 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003337 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003338 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003339 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003340 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003341 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003342 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003343 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003344 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003345 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003346 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003347 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003348 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003349 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003350 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003351 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003352 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003353 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003354 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003355 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003356 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003357 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003358 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003359 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003360 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003361 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003362 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003363 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003364 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003365 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003366 } else if (Feature == "+avx512vbmi") {
3367 HasAVX512VBMI = true;
3368 } else if (Feature == "+avx512ifma") {
3369 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003370 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003371 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003372 } else if (Feature == "+mpx") {
3373 HasMPX = true;
3374 } else if (Feature == "+movbe") {
3375 HasMOVBE = true;
3376 } else if (Feature == "+sgx") {
3377 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003378 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003379 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003380 } else if (Feature == "+fxsr") {
3381 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003382 } else if (Feature == "+xsave") {
3383 HasXSAVE = true;
3384 } else if (Feature == "+xsaveopt") {
3385 HasXSAVEOPT = true;
3386 } else if (Feature == "+xsavec") {
3387 HasXSAVEC = true;
3388 } else if (Feature == "+xsaves") {
3389 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003390 } else if (Feature == "+mwaitx") {
3391 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003392 } else if (Feature == "+pku") {
3393 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003394 } else if (Feature == "+clflushopt") {
3395 HasCLFLUSHOPT = true;
3396 } else if (Feature == "+pcommit") {
3397 HasPCOMMIT = true;
3398 } else if (Feature == "+clwb") {
3399 HasCLWB = true;
3400 } else if (Feature == "+umip") {
3401 HasUMIP = true;
3402 } else if (Feature == "+prefetchwt1") {
3403 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003404 }
3405
Benjamin Kramer27402c62012-03-05 15:10:44 +00003406 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003407 .Case("+avx512f", AVX512F)
3408 .Case("+avx2", AVX2)
3409 .Case("+avx", AVX)
3410 .Case("+sse4.2", SSE42)
3411 .Case("+sse4.1", SSE41)
3412 .Case("+ssse3", SSSE3)
3413 .Case("+sse3", SSE3)
3414 .Case("+sse2", SSE2)
3415 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003416 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003417 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003418
Eli Friedman33465822011-07-08 23:31:17 +00003419 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003420 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003421 .Case("+3dnowa", AMD3DNowAthlon)
3422 .Case("+3dnow", AMD3DNow)
3423 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003424 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003425 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003426
3427 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003428 .Case("+xop", XOP)
3429 .Case("+fma4", FMA4)
3430 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003431 .Default(NoXOP);
3432 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003433 }
Eli Friedman33465822011-07-08 23:31:17 +00003434
Rafael Espindolaeb265472013-08-21 21:59:03 +00003435 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3436 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003437 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3438 (FPMath == FP_387 && SSELevel >= SSE1)) {
3439 Diags.Report(diag::err_target_unsupported_fpmath) <<
3440 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003441 return false;
3442 }
3443
Alexey Bataev00396512015-07-02 03:40:19 +00003444 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003445 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003446 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003447}
Chris Lattnerecd49032009-03-02 22:27:17 +00003448
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003449/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3450/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003451void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003452 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003453 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003454 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003455 Builder.defineMacro("__amd64__");
3456 Builder.defineMacro("__amd64");
3457 Builder.defineMacro("__x86_64");
3458 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003459 if (getTriple().getArchName() == "x86_64h") {
3460 Builder.defineMacro("__x86_64h");
3461 Builder.defineMacro("__x86_64h__");
3462 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003463 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003464 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003465 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003466
Chris Lattnerecd49032009-03-02 22:27:17 +00003467 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003468 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3469 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003470 switch (CPU) {
3471 case CK_Generic:
3472 break;
3473 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003474 // The rest are coming from the i386 define above.
3475 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003476 break;
3477 case CK_i486:
3478 case CK_WinChipC6:
3479 case CK_WinChip2:
3480 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003481 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003482 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003483 case CK_PentiumMMX:
3484 Builder.defineMacro("__pentium_mmx__");
3485 Builder.defineMacro("__tune_pentium_mmx__");
3486 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003487 case CK_i586:
3488 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003489 defineCPUMacros(Builder, "i586");
3490 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003491 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003492 case CK_Pentium3:
3493 case CK_Pentium3M:
3494 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003495 Builder.defineMacro("__tune_pentium3__");
3496 // Fallthrough
3497 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003498 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003499 Builder.defineMacro("__tune_pentium2__");
3500 // Fallthrough
3501 case CK_PentiumPro:
3502 Builder.defineMacro("__tune_i686__");
3503 Builder.defineMacro("__tune_pentiumpro__");
3504 // Fallthrough
3505 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003506 Builder.defineMacro("__i686");
3507 Builder.defineMacro("__i686__");
3508 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3509 Builder.defineMacro("__pentiumpro");
3510 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003511 break;
3512 case CK_Pentium4:
3513 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003514 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003515 break;
3516 case CK_Yonah:
3517 case CK_Prescott:
3518 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003519 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003520 break;
3521 case CK_Core2:
3522 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003523 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003524 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003525 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003526 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003527 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003528 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003529 defineCPUMacros(Builder, "slm");
3530 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003531 case CK_Nehalem:
3532 case CK_Westmere:
3533 case CK_SandyBridge:
3534 case CK_IvyBridge:
3535 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003536 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003537 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003538 // FIXME: Historically, we defined this legacy name, it would be nice to
3539 // remove it at some point. We've never exposed fine-grained names for
3540 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003541 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003542 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003543 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003544 defineCPUMacros(Builder, "skx");
3545 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003546 case CK_Cannonlake:
3547 break;
Craig Topper449314e2013-08-20 07:09:39 +00003548 case CK_KNL:
3549 defineCPUMacros(Builder, "knl");
3550 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003551 case CK_Lakemont:
3552 Builder.defineMacro("__tune_lakemont__");
3553 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003554 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003555 Builder.defineMacro("__k6_2__");
3556 Builder.defineMacro("__tune_k6_2__");
3557 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003558 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003559 if (CPU != CK_K6_2) { // In case of fallthrough
3560 // FIXME: GCC may be enabling these in cases where some other k6
3561 // architecture is specified but -m3dnow is explicitly provided. The
3562 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003563 Builder.defineMacro("__k6_3__");
3564 Builder.defineMacro("__tune_k6_3__");
3565 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003566 // Fallthrough
3567 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003568 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003569 break;
3570 case CK_Athlon:
3571 case CK_AthlonThunderbird:
3572 case CK_Athlon4:
3573 case CK_AthlonXP:
3574 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003575 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003576 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003577 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003578 Builder.defineMacro("__tune_athlon_sse__");
3579 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003580 break;
3581 case CK_K8:
3582 case CK_K8SSE3:
3583 case CK_x86_64:
3584 case CK_Opteron:
3585 case CK_OpteronSSE3:
3586 case CK_Athlon64:
3587 case CK_Athlon64SSE3:
3588 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003589 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003590 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003591 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003592 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003593 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003594 case CK_BTVER1:
3595 defineCPUMacros(Builder, "btver1");
3596 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003597 case CK_BTVER2:
3598 defineCPUMacros(Builder, "btver2");
3599 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003600 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003601 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003602 break;
3603 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003604 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003605 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003606 case CK_BDVER3:
3607 defineCPUMacros(Builder, "bdver3");
3608 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003609 case CK_BDVER4:
3610 defineCPUMacros(Builder, "bdver4");
3611 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003612 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003613 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003614 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003615 }
Chris Lattner96e43572009-03-02 22:40:39 +00003616
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003617 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003618 Builder.defineMacro("__REGISTER_PREFIX__", "");
3619
Chris Lattner6df41af2009-04-19 17:32:33 +00003620 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3621 // functions in glibc header files that use FP Stack inline asm which the
3622 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003623 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003624
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003625 if (HasAES)
3626 Builder.defineMacro("__AES__");
3627
Craig Topper3f122a72012-05-31 05:18:48 +00003628 if (HasPCLMUL)
3629 Builder.defineMacro("__PCLMUL__");
3630
Craig Topper22967d42011-12-25 05:06:45 +00003631 if (HasLZCNT)
3632 Builder.defineMacro("__LZCNT__");
3633
Benjamin Kramer1e250392012-07-07 09:39:18 +00003634 if (HasRDRND)
3635 Builder.defineMacro("__RDRND__");
3636
Craig Topper8c7f2512014-11-03 06:51:41 +00003637 if (HasFSGSBASE)
3638 Builder.defineMacro("__FSGSBASE__");
3639
Craig Topper22967d42011-12-25 05:06:45 +00003640 if (HasBMI)
3641 Builder.defineMacro("__BMI__");
3642
3643 if (HasBMI2)
3644 Builder.defineMacro("__BMI2__");
3645
Craig Topper1de83482011-12-29 16:10:46 +00003646 if (HasPOPCNT)
3647 Builder.defineMacro("__POPCNT__");
3648
Michael Liao625a8752012-11-10 05:17:46 +00003649 if (HasRTM)
3650 Builder.defineMacro("__RTM__");
3651
Michael Liao74f4eaf2013-03-26 17:52:08 +00003652 if (HasPRFCHW)
3653 Builder.defineMacro("__PRFCHW__");
3654
Michael Liaoffaae352013-03-29 05:17:55 +00003655 if (HasRDSEED)
3656 Builder.defineMacro("__RDSEED__");
3657
Robert Khasanov50e6f582014-09-19 09:53:48 +00003658 if (HasADX)
3659 Builder.defineMacro("__ADX__");
3660
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003661 if (HasTBM)
3662 Builder.defineMacro("__TBM__");
3663
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003664 if (HasMWAITX)
3665 Builder.defineMacro("__MWAITX__");
3666
Rafael Espindolae62e2792013-08-20 13:44:29 +00003667 switch (XOPLevel) {
3668 case XOP:
3669 Builder.defineMacro("__XOP__");
3670 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003671 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003672 case SSE4A:
3673 Builder.defineMacro("__SSE4A__");
3674 case NoXOP:
3675 break;
3676 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003677
Craig Topperbba778b2012-06-03 21:46:30 +00003678 if (HasFMA)
3679 Builder.defineMacro("__FMA__");
3680
Manman Rena45358c2012-10-11 00:59:55 +00003681 if (HasF16C)
3682 Builder.defineMacro("__F16C__");
3683
Craig Topper679b53a2013-08-21 05:29:10 +00003684 if (HasAVX512CD)
3685 Builder.defineMacro("__AVX512CD__");
3686 if (HasAVX512ER)
3687 Builder.defineMacro("__AVX512ER__");
3688 if (HasAVX512PF)
3689 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003690 if (HasAVX512DQ)
3691 Builder.defineMacro("__AVX512DQ__");
3692 if (HasAVX512BW)
3693 Builder.defineMacro("__AVX512BW__");
3694 if (HasAVX512VL)
3695 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003696 if (HasAVX512VBMI)
3697 Builder.defineMacro("__AVX512VBMI__");
3698 if (HasAVX512IFMA)
3699 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003700
Ben Langmuir58078d02013-09-19 13:22:04 +00003701 if (HasSHA)
3702 Builder.defineMacro("__SHA__");
3703
Craig Toppere33f51f2015-10-16 06:22:36 +00003704 if (HasFXSR)
3705 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003706 if (HasXSAVE)
3707 Builder.defineMacro("__XSAVE__");
3708 if (HasXSAVEOPT)
3709 Builder.defineMacro("__XSAVEOPT__");
3710 if (HasXSAVEC)
3711 Builder.defineMacro("__XSAVEC__");
3712 if (HasXSAVES)
3713 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003714 if (HasPKU)
3715 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003716 if (HasCX16)
3717 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3718
Chris Lattner96e43572009-03-02 22:40:39 +00003719 // Each case falls through to the previous one here.
3720 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003721 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003722 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003723 case AVX2:
3724 Builder.defineMacro("__AVX2__");
3725 case AVX:
3726 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003727 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003728 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003729 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003730 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003731 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003732 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003733 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003734 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003735 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003736 Builder.defineMacro("__SSE2__");
3737 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003738 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003739 Builder.defineMacro("__SSE__");
3740 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003741 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003742 break;
3743 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003744
Derek Schuffc7dd7222012-10-11 15:52:22 +00003745 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003746 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003747 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003748 case AVX2:
3749 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003750 case SSE42:
3751 case SSE41:
3752 case SSSE3:
3753 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003754 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003755 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003756 break;
3757 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003758 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003759 break;
3760 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003761 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003762 }
3763 }
3764
Anders Carlssone437c682010-01-27 03:47:49 +00003765 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003766 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003767 case AMD3DNowAthlon:
3768 Builder.defineMacro("__3dNOW_A__");
3769 case AMD3DNow:
3770 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003771 case MMX:
3772 Builder.defineMacro("__MMX__");
3773 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003774 break;
3775 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003776
3777 if (CPU >= CK_i486) {
3778 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3779 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3780 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3781 }
3782 if (CPU >= CK_i586)
3783 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003784}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003785
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003786bool X86TargetInfo::hasFeature(StringRef Feature) const {
3787 return llvm::StringSwitch<bool>(Feature)
3788 .Case("aes", HasAES)
3789 .Case("avx", SSELevel >= AVX)
3790 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003791 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003792 .Case("avx512cd", HasAVX512CD)
3793 .Case("avx512er", HasAVX512ER)
3794 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003795 .Case("avx512dq", HasAVX512DQ)
3796 .Case("avx512bw", HasAVX512BW)
3797 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003798 .Case("avx512vbmi", HasAVX512VBMI)
3799 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003800 .Case("bmi", HasBMI)
3801 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003802 .Case("clflushopt", HasCLFLUSHOPT)
3803 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003804 .Case("cx16", HasCX16)
3805 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003806 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003807 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003808 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003809 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003810 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003811 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3812 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3813 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003814 .Case("movbe", HasMOVBE)
3815 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003816 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003817 .Case("pcommit", HasPCOMMIT)
3818 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003819 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003820 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003821 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003822 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003823 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003824 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003825 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003826 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003827 .Case("sse", SSELevel >= SSE1)
3828 .Case("sse2", SSELevel >= SSE2)
3829 .Case("sse3", SSELevel >= SSE3)
3830 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003831 .Case("sse4.1", SSELevel >= SSE41)
3832 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003833 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003834 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003835 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003836 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003837 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3838 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003839 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003840 .Case("xsave", HasXSAVE)
3841 .Case("xsavec", HasXSAVEC)
3842 .Case("xsaves", HasXSAVES)
3843 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003844 .Default(false);
3845}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003846
Eric Christopherd9832702015-06-29 21:00:05 +00003847// We can't use a generic validation scheme for the features accepted here
3848// versus subtarget features accepted in the target attribute because the
3849// bitfield structure that's initialized in the runtime only supports the
3850// below currently rather than the full range of subtarget features. (See
3851// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3852bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3853 return llvm::StringSwitch<bool>(FeatureStr)
3854 .Case("cmov", true)
3855 .Case("mmx", true)
3856 .Case("popcnt", true)
3857 .Case("sse", true)
3858 .Case("sse2", true)
3859 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003860 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003861 .Case("sse4.1", true)
3862 .Case("sse4.2", true)
3863 .Case("avx", true)
3864 .Case("avx2", true)
3865 .Case("sse4a", true)
3866 .Case("fma4", true)
3867 .Case("xop", true)
3868 .Case("fma", true)
3869 .Case("avx512f", true)
3870 .Case("bmi", true)
3871 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003872 .Case("aes", true)
3873 .Case("pclmul", true)
3874 .Case("avx512vl", true)
3875 .Case("avx512bw", true)
3876 .Case("avx512dq", true)
3877 .Case("avx512cd", true)
3878 .Case("avx512er", true)
3879 .Case("avx512pf", true)
3880 .Case("avx512vbmi", true)
3881 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003882 .Default(false);
3883}
3884
Eli Friedman3fd920a2008-08-20 02:34:37 +00003885bool
Anders Carlsson58436352009-02-28 17:11:49 +00003886X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003887 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003888 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003889 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003890 // Constant constraints.
3891 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3892 // instructions.
3893 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3894 // x86_64 instructions.
3895 case 's':
3896 Info.setRequiresImmediate();
3897 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003898 case 'I':
3899 Info.setRequiresImmediate(0, 31);
3900 return true;
3901 case 'J':
3902 Info.setRequiresImmediate(0, 63);
3903 return true;
3904 case 'K':
3905 Info.setRequiresImmediate(-128, 127);
3906 return true;
3907 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003908 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003909 return true;
3910 case 'M':
3911 Info.setRequiresImmediate(0, 3);
3912 return true;
3913 case 'N':
3914 Info.setRequiresImmediate(0, 255);
3915 return true;
3916 case 'O':
3917 Info.setRequiresImmediate(0, 127);
3918 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003919 // Register constraints.
3920 case 'Y': // 'Y' is the first character for several 2-character constraints.
3921 // Shift the pointer to the second character of the constraint.
3922 Name++;
3923 switch (*Name) {
3924 default:
3925 return false;
3926 case '0': // First SSE register.
3927 case 't': // Any SSE register, when SSE2 is enabled.
3928 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3929 case 'm': // Any MMX register, when inter-unit moves enabled.
3930 Info.setAllowsRegister();
3931 return true;
3932 }
3933 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003934 // Constraint 'f' cannot be used for output operands.
3935 if (Info.ConstraintStr[0] == '=')
3936 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003937 Info.setAllowsRegister();
3938 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003939 case 'a': // eax.
3940 case 'b': // ebx.
3941 case 'c': // ecx.
3942 case 'd': // edx.
3943 case 'S': // esi.
3944 case 'D': // edi.
3945 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003946 case 't': // Top of floating point stack.
3947 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003948 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003949 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003950 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003951 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003952 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3953 case 'l': // "Index" registers: any general register that can be used as an
3954 // index in a base+index memory access.
3955 Info.setAllowsRegister();
3956 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003957 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003958 case 'C': // SSE floating point constant.
3959 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003960 return true;
3961 }
3962}
3963
Akira Hatanaka974131e2014-09-18 18:17:18 +00003964bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3965 unsigned Size) const {
3966 // Strip off constraint modifiers.
3967 while (Constraint[0] == '=' ||
3968 Constraint[0] == '+' ||
3969 Constraint[0] == '&')
3970 Constraint = Constraint.substr(1);
3971
3972 return validateOperandSize(Constraint, Size);
3973}
3974
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003975bool X86TargetInfo::validateInputSize(StringRef Constraint,
3976 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003977 return validateOperandSize(Constraint, Size);
3978}
3979
3980bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3981 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003982 switch (Constraint[0]) {
3983 default: break;
3984 case 'y':
3985 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003986 case 'f':
3987 case 't':
3988 case 'u':
3989 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003990 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003991 if (SSELevel >= AVX512F)
3992 // 512-bit zmm registers can be used if target supports AVX512F.
3993 return Size <= 512U;
3994 else if (SSELevel >= AVX)
3995 // 256-bit ymm registers can be used if target supports AVX.
3996 return Size <= 256U;
3997 return Size <= 128U;
3998 case 'Y':
3999 // 'Y' is the first character for several 2-character constraints.
4000 switch (Constraint[1]) {
4001 default: break;
4002 case 'm':
4003 // 'Ym' is synonymous with 'y'.
4004 return Size <= 64;
4005 case 'i':
4006 case 't':
4007 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4008 if (SSELevel >= AVX512F)
4009 return Size <= 512U;
4010 else if (SSELevel >= AVX)
4011 return Size <= 256U;
4012 return SSELevel >= SSE2 && Size <= 128U;
4013 }
4014
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004015 }
4016
4017 return true;
4018}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004019
Eli Friedman3fd920a2008-08-20 02:34:37 +00004020std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004021X86TargetInfo::convertConstraint(const char *&Constraint) const {
4022 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004023 case 'a': return std::string("{ax}");
4024 case 'b': return std::string("{bx}");
4025 case 'c': return std::string("{cx}");
4026 case 'd': return std::string("{dx}");
4027 case 'S': return std::string("{si}");
4028 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004029 case 'p': // address
4030 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004031 case 't': // top of floating point stack.
4032 return std::string("{st}");
4033 case 'u': // second from top of floating point stack.
4034 return std::string("{st(1)}"); // second from top of floating point stack.
4035 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004036 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004037 }
4038}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004039
Eli Friedman3fd920a2008-08-20 02:34:37 +00004040// X86-32 generic target
4041class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004042public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004043 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4044 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004045 DoubleAlign = LongLongAlign = 32;
4046 LongDoubleWidth = 96;
4047 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004048 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004049 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004050 SizeType = UnsignedInt;
4051 PtrDiffType = SignedInt;
4052 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004053 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004054
4055 // Use fpret for all types.
4056 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4057 (1 << TargetInfo::Double) |
4058 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004059
4060 // x86-32 has atomics up to 8 bytes
4061 // FIXME: Check that we actually have cmpxchg8b before setting
4062 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4063 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004064 }
Craig Topper3164f332014-03-11 03:39:26 +00004065 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004066 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004067 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004068
Craig Topper3164f332014-03-11 03:39:26 +00004069 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004070 if (RegNo == 0) return 0;
4071 if (RegNo == 1) return 2;
4072 return -1;
4073 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004074 bool validateOperandSize(StringRef Constraint,
4075 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004076 switch (Constraint[0]) {
4077 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004078 case 'R':
4079 case 'q':
4080 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004081 case 'a':
4082 case 'b':
4083 case 'c':
4084 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004085 case 'S':
4086 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004087 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004088 case 'A':
4089 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004090 }
4091
Akira Hatanaka974131e2014-09-18 18:17:18 +00004092 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004093 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004094};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004095
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004096class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4097public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004098 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4099 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004100
Craig Topper3164f332014-03-11 03:39:26 +00004101 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004102 unsigned Major, Minor, Micro;
4103 getTriple().getOSVersion(Major, Minor, Micro);
4104 // New NetBSD uses the default rounding mode.
4105 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4106 return X86_32TargetInfo::getFloatEvalMethod();
4107 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004108 return 1;
4109 }
4110};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004111
Eli Friedmane3aa4542009-07-05 18:47:56 +00004112class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4113public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004114 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4115 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004116 SizeType = UnsignedLong;
4117 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004118 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004119 }
4120};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004121
Eli Friedman9fa28852012-08-08 23:57:20 +00004122class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4123public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004124 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4125 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004126 SizeType = UnsignedLong;
4127 IntPtrType = SignedLong;
4128 PtrDiffType = SignedLong;
4129 }
4130};
Eli Friedman9fa28852012-08-08 23:57:20 +00004131
Torok Edwinb2b37c62009-06-30 17:10:35 +00004132class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004133public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004134 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4135 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004136 LongDoubleWidth = 128;
4137 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004138 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004139 MaxVectorAlign = 256;
4140 // The watchOS simulator uses the builtin bool type for Objective-C.
4141 llvm::Triple T = llvm::Triple(Triple);
4142 if (T.isWatchOS())
4143 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004144 SizeType = UnsignedLong;
4145 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004146 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004147 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004148 }
4149
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004150 bool handleTargetFeatures(std::vector<std::string> &Features,
4151 DiagnosticsEngine &Diags) override {
4152 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4153 Diags))
4154 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004155 // We now know the features we have: we can decide how to align vectors.
4156 MaxVectorAlign =
4157 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004158 return true;
4159 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004160};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004161
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004162// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004163class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004164public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004165 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4166 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004167 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004168 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004169 bool IsWinCOFF =
4170 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004171 resetDataLayout(IsWinCOFF
4172 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4173 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004174 }
Craig Topper3164f332014-03-11 03:39:26 +00004175 void getTargetDefines(const LangOptions &Opts,
4176 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004177 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4178 }
4179};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004180
4181// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004182class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004183public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004184 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4185 const TargetOptions &Opts)
4186 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004187 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004188 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4189 }
Craig Topper3164f332014-03-11 03:39:26 +00004190 void getTargetDefines(const LangOptions &Opts,
4191 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004192 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4193 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4194 // The value of the following reflects processor type.
4195 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4196 // We lost the original triple, so we use the default.
4197 Builder.defineMacro("_M_IX86", "600");
4198 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004199};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004200
David Majnemerae1ed0e2015-05-28 04:36:18 +00004201static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004202 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4203 // supports __declspec natively under -fms-extensions, but we define a no-op
4204 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004205 if (Opts.MicrosoftExt)
4206 Builder.defineMacro("__declspec", "__declspec");
4207 else
4208 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4209
4210 if (!Opts.MicrosoftExt) {
4211 // Provide macros for all the calling convention keywords. Provide both
4212 // single and double underscore prefixed variants. These are available on
4213 // x64 as well as x86, even though they have no effect.
4214 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4215 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004216 std::string GCCSpelling = "__attribute__((__";
4217 GCCSpelling += CC;
4218 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004219 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4220 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4221 }
4222 }
4223}
4224
David Majnemerae1ed0e2015-05-28 04:36:18 +00004225static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4226 Builder.defineMacro("__MSVCRT__");
4227 Builder.defineMacro("__MINGW32__");
4228 addCygMingDefines(Opts, Builder);
4229}
4230
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004231// x86-32 MinGW target
4232class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4233public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004234 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4235 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004236 void getTargetDefines(const LangOptions &Opts,
4237 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004238 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004239 DefineStd(Builder, "WIN32", Opts);
4240 DefineStd(Builder, "WINNT", Opts);
4241 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004242 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004243 }
4244};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004245
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004246// x86-32 Cygwin target
4247class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4248public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004249 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4250 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004251 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004252 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004253 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 +00004254 }
Craig Topper3164f332014-03-11 03:39:26 +00004255 void getTargetDefines(const LangOptions &Opts,
4256 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004257 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004258 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004259 Builder.defineMacro("__CYGWIN__");
4260 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004261 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004262 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004263 if (Opts.CPlusPlus)
4264 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004265 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004266};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004267
Chris Lattnerb986aba2010-04-11 19:29:39 +00004268// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004269class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004270public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004271 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004272 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004273 }
Craig Topper3164f332014-03-11 03:39:26 +00004274 void getTargetDefines(const LangOptions &Opts,
4275 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004276 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004277 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004278 }
4279};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004280
Alexey Bataevc99b0492015-11-25 09:24:26 +00004281// X86-32 MCU target
4282class MCUX86_32TargetInfo : public X86_32TargetInfo {
4283public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004284 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4285 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004286 LongDoubleWidth = 64;
4287 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004288 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 +00004289 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004290 }
4291
4292 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4293 // On MCU we support only C calling convention.
4294 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4295 }
4296
4297 void getTargetDefines(const LangOptions &Opts,
4298 MacroBuilder &Builder) const override {
4299 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4300 Builder.defineMacro("__iamcu");
4301 Builder.defineMacro("__iamcu__");
4302 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004303
4304 bool allowsLargerPreferedTypeAlignment() const override {
4305 return false;
4306 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004307};
4308
Douglas Gregor9fabd852011-07-01 22:41:14 +00004309// RTEMS Target
4310template<typename Target>
4311class RTEMSTargetInfo : public OSTargetInfo<Target> {
4312protected:
Craig Topper3164f332014-03-11 03:39:26 +00004313 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4314 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004315 // RTEMS defines; list based off of gcc output
4316
Douglas Gregor9fabd852011-07-01 22:41:14 +00004317 Builder.defineMacro("__rtems__");
4318 Builder.defineMacro("__ELF__");
4319 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004320
Douglas Gregor9fabd852011-07-01 22:41:14 +00004321public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004322 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4323 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004324 switch (Triple.getArch()) {
4325 default:
4326 case llvm::Triple::x86:
4327 // this->MCountName = ".mcount";
4328 break;
4329 case llvm::Triple::mips:
4330 case llvm::Triple::mipsel:
4331 case llvm::Triple::ppc:
4332 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004333 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004334 // this->MCountName = "_mcount";
4335 break;
4336 case llvm::Triple::arm:
4337 // this->MCountName = "__mcount";
4338 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004339 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004340 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004341};
4342
Douglas Gregor9fabd852011-07-01 22:41:14 +00004343// x86-32 RTEMS target
4344class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4345public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004346 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4347 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004348 SizeType = UnsignedLong;
4349 IntPtrType = SignedLong;
4350 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004351 }
Craig Topper3164f332014-03-11 03:39:26 +00004352 void getTargetDefines(const LangOptions &Opts,
4353 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004354 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4355 Builder.defineMacro("__INTEL__");
4356 Builder.defineMacro("__rtems__");
4357 }
4358};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004359
Eli Friedman3fd920a2008-08-20 02:34:37 +00004360// x86-64 generic target
4361class X86_64TargetInfo : public X86TargetInfo {
4362public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004363 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4364 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004365 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004366 bool IsWinCOFF =
4367 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004368 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004369 LongDoubleWidth = 128;
4370 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004371 LargeArrayMinWidth = 128;
4372 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004373 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004374 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4375 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4376 IntPtrType = IsX32 ? SignedInt : SignedLong;
4377 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004378 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004379 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004380
Eric Christopher917e9522014-11-18 22:36:15 +00004381 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004382 resetDataLayout(IsX32
4383 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4384 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4385 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004386
4387 // Use fpret only for long double.
4388 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004389
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004390 // Use fp2ret for _Complex long double.
4391 ComplexLongDoubleUsesFP2Ret = true;
4392
Charles Davisc7d5c942015-09-17 20:55:33 +00004393 // Make __builtin_ms_va_list available.
4394 HasBuiltinMSVaList = true;
4395
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004396 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004397 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004398 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004399 }
Craig Topper3164f332014-03-11 03:39:26 +00004400 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004401 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004402 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004403
Craig Topper3164f332014-03-11 03:39:26 +00004404 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004405 if (RegNo == 0) return 0;
4406 if (RegNo == 1) return 1;
4407 return -1;
4408 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004409
Craig Topper3164f332014-03-11 03:39:26 +00004410 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004411 switch (CC) {
4412 case CC_C:
4413 case CC_Swift:
4414 case CC_X86VectorCall:
4415 case CC_IntelOclBicc:
4416 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004417 case CC_PreserveMost:
4418 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004419 return CCCR_OK;
4420 default:
4421 return CCCR_Warning;
4422 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004423 }
4424
Craig Topper3164f332014-03-11 03:39:26 +00004425 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004426 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004427 }
4428
Pavel Chupinfd223e12014-08-04 12:39:43 +00004429 // for x32 we need it here explicitly
4430 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004431 unsigned getUnwindWordWidth() const override { return 64; }
4432 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004433
4434 bool validateGlobalRegisterVariable(StringRef RegName,
4435 unsigned RegSize,
4436 bool &HasSizeMismatch) const override {
4437 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4438 // handle.
4439 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4440 // Check that the register size is 64-bit.
4441 HasSizeMismatch = RegSize != 64;
4442 return true;
4443 }
4444
4445 // Check if the register is a 32-bit register the backend can handle.
4446 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4447 HasSizeMismatch);
4448 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004449};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004450
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004451// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004452class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004453public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004454 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4455 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004456 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004457 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004458 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004459 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004460 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004461 SizeType = UnsignedLongLong;
4462 PtrDiffType = SignedLongLong;
4463 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004464 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004465
Craig Topper3164f332014-03-11 03:39:26 +00004466 void getTargetDefines(const LangOptions &Opts,
4467 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004468 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004469 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004470 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004471
Craig Topper3164f332014-03-11 03:39:26 +00004472 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004473 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004474 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004475
Craig Topper3164f332014-03-11 03:39:26 +00004476 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004477 switch (CC) {
4478 case CC_X86StdCall:
4479 case CC_X86ThisCall:
4480 case CC_X86FastCall:
4481 return CCCR_Ignore;
4482 case CC_C:
4483 case CC_X86VectorCall:
4484 case CC_IntelOclBicc:
4485 case CC_X86_64SysV:
4486 return CCCR_OK;
4487 default:
4488 return CCCR_Warning;
4489 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004490 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004491};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004492
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004493// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004494class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004495public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004496 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4497 const TargetOptions &Opts)
4498 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004499 LongDoubleWidth = LongDoubleAlign = 64;
4500 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004501 }
Craig Topper3164f332014-03-11 03:39:26 +00004502 void getTargetDefines(const LangOptions &Opts,
4503 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004504 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4505 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004506 Builder.defineMacro("_M_X64", "100");
4507 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004508 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004509};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004510
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004511// x86-64 MinGW target
4512class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4513public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004514 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4515 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004516 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4517 // with x86 FP ops. Weird.
4518 LongDoubleWidth = LongDoubleAlign = 128;
4519 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4520 }
4521
Craig Topper3164f332014-03-11 03:39:26 +00004522 void getTargetDefines(const LangOptions &Opts,
4523 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004524 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004525 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004526 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004527 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004528
4529 // GCC defines this macro when it is using __gxx_personality_seh0.
4530 if (!Opts.SjLjExceptions)
4531 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004532 }
4533};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004534
Yaron Kerend030d112015-07-22 17:38:19 +00004535// x86-64 Cygwin target
4536class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4537public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004538 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4539 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004540 TLSSupported = false;
4541 WCharType = UnsignedShort;
4542 }
4543 void getTargetDefines(const LangOptions &Opts,
4544 MacroBuilder &Builder) const override {
4545 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4546 Builder.defineMacro("__x86_64__");
4547 Builder.defineMacro("__CYGWIN__");
4548 Builder.defineMacro("__CYGWIN64__");
4549 addCygMingDefines(Opts, Builder);
4550 DefineStd(Builder, "unix", Opts);
4551 if (Opts.CPlusPlus)
4552 Builder.defineMacro("_GNU_SOURCE");
4553
4554 // GCC defines this macro when it is using __gxx_personality_seh0.
4555 if (!Opts.SjLjExceptions)
4556 Builder.defineMacro("__SEH__");
4557 }
4558};
4559
Eli Friedman2857ccb2009-07-01 03:36:11 +00004560class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4561public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004562 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4563 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004564 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004565 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4566 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004567 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004568 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004569 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004570 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004571
4572 bool handleTargetFeatures(std::vector<std::string> &Features,
4573 DiagnosticsEngine &Diags) override {
4574 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4575 Diags))
4576 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004577 // We now know the features we have: we can decide how to align vectors.
4578 MaxVectorAlign =
4579 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004580 return true;
4581 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004582};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004583
Eli Friedman245f2292009-07-05 22:31:18 +00004584class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4585public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004586 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4587 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004588 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004589 Int64Type = SignedLongLong;
4590 }
4591};
Eli Friedman245f2292009-07-05 22:31:18 +00004592
Eli Friedman9fa28852012-08-08 23:57:20 +00004593class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4594public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004595 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4596 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004597 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004598 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004599 }
4600};
Tim Northover9bb857a2013-01-31 12:13:10 +00004601
Eli Friedmanf05b7722008-08-20 07:44:10 +00004602class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004603 // Possible FPU choices.
4604 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004605 VFP2FPU = (1 << 0),
4606 VFP3FPU = (1 << 1),
4607 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004608 NeonFPU = (1 << 3),
4609 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004610 };
4611
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004612 // Possible HWDiv features.
4613 enum HWDivMode {
4614 HWDivThumb = (1 << 0),
4615 HWDivARM = (1 << 1)
4616 };
4617
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004618 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004619 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004620 }
4621
4622 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4623 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004624
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004625 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004626
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004627 StringRef CPUProfile;
4628 StringRef CPUAttr;
4629
Rafael Espindolaeb265472013-08-21 21:59:03 +00004630 enum {
4631 FP_Default,
4632 FP_VFP,
4633 FP_Neon
4634 } FPMath;
4635
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004636 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004637 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004638 unsigned ArchProfile;
4639 unsigned ArchVersion;
4640
Bernard Ogdenda13af32013-10-24 18:32:51 +00004641 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004642
Logan Chien57086ce2012-10-10 06:56:20 +00004643 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004644 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004645
4646 // Initialized via features.
4647 unsigned SoftFloat : 1;
4648 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004649
Bernard Ogden18b57012013-10-29 09:47:51 +00004650 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004651 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004652 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004653 unsigned Unaligned : 1;
4654
4655 enum {
4656 LDREX_B = (1 << 0), /// byte (8-bit)
4657 LDREX_H = (1 << 1), /// half (16-bit)
4658 LDREX_W = (1 << 2), /// word (32-bit)
4659 LDREX_D = (1 << 3), /// double (64-bit)
4660 };
4661
4662 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004663
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004664 // ACLE 6.5.1 Hardware floating point
4665 enum {
4666 HW_FP_HP = (1 << 1), /// half (16-bit)
4667 HW_FP_SP = (1 << 2), /// single (32-bit)
4668 HW_FP_DP = (1 << 3), /// double (64-bit)
4669 };
4670 uint32_t HW_FP;
4671
Chris Lattner5cc15e02010-03-03 19:03:45 +00004672 static const Builtin::Info BuiltinInfo[];
4673
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004674 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004675 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004676
4677 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004678 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004679
Renato Golin9ba39232015-02-27 16:35:48 +00004680 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4681 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4682 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004683 SizeType = UnsignedLong;
4684 else
4685 SizeType = UnsignedInt;
4686
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004687 switch (T.getOS()) {
4688 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004689 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004690 break;
4691 case llvm::Triple::Win32:
4692 WCharType = UnsignedShort;
4693 break;
4694 case llvm::Triple::Linux:
4695 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004696 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4697 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004698 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004699 }
4700
4701 UseBitFieldTypeAlignment = true;
4702
4703 ZeroLengthBitfieldBoundary = 0;
4704
Tim Northover147cd2f2014-10-14 22:12:21 +00004705 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4706 // so set preferred for small types to 32.
4707 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004708 resetDataLayout(BigEndian
4709 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4710 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004711 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004712 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004713 resetDataLayout("e"
4714 "-m:w"
4715 "-p:32:32"
4716 "-i64:64"
4717 "-v128:64:128"
4718 "-a:0:32"
4719 "-n32"
4720 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004721 } else if (T.isOSNaCl()) {
4722 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004723 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004724 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004725 resetDataLayout(BigEndian
4726 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4727 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004728 }
4729
4730 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004731 }
4732
Tim Northover5627d392015-10-30 16:30:45 +00004733 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004734 const llvm::Triple &T = getTriple();
4735
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004736 IsAAPCS = false;
4737
Tim Northover5627d392015-10-30 16:30:45 +00004738 if (IsAAPCS16)
4739 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4740 else
4741 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004742
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004743 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004744 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004745 SizeType = UnsignedInt;
4746 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004747 SizeType = UnsignedLong;
4748
4749 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4750 WCharType = SignedInt;
4751
4752 // Do not respect the alignment of bit-field types when laying out
4753 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4754 UseBitFieldTypeAlignment = false;
4755
4756 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4757 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4758 /// gcc.
4759 ZeroLengthBitfieldBoundary = 32;
4760
Tim Northover5627d392015-10-30 16:30:45 +00004761 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4762 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004763 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004764 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004765 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004766 BigEndian
4767 ? "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 +00004768 : "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 +00004769 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004770 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004771 BigEndian
4772 ? "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 +00004773 : "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 +00004774
4775 // FIXME: Override "preferred align" for double and long long.
4776 }
4777
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004778 void setArchInfo() {
4779 StringRef ArchName = getTriple().getArchName();
4780
Renato Goline84b0002015-10-08 16:43:26 +00004781 ArchISA = llvm::ARM::parseArchISA(ArchName);
4782 CPU = llvm::ARM::getDefaultCPU(ArchName);
4783 unsigned AK = llvm::ARM::parseArch(ArchName);
4784 if (AK != llvm::ARM::AK_INVALID)
4785 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004786 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004787 }
4788
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004789 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004790 StringRef SubArch;
4791
4792 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004793 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004794 SubArch = llvm::ARM::getSubArch(ArchKind);
4795 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4796 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004797
4798 // cache CPU related strings
4799 CPUAttr = getCPUAttr();
4800 CPUProfile = getCPUProfile();
4801 }
4802
4803 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004804 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004805 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004806 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004807 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4808 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004809 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004810 if (ArchProfile == llvm::ARM::PK_M) {
4811 MaxAtomicPromoteWidth = 32;
4812 if (ShouldUseInlineAtomic)
4813 MaxAtomicInlineWidth = 32;
4814 }
4815 else {
4816 MaxAtomicPromoteWidth = 64;
4817 if (ShouldUseInlineAtomic)
4818 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004819 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004820 }
4821
4822 bool isThumb() const {
4823 return (ArchISA == llvm::ARM::IK_THUMB);
4824 }
4825
4826 bool supportsThumb() const {
4827 return CPUAttr.count('T') || ArchVersion >= 6;
4828 }
4829
4830 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004831 return CPUAttr.equals("6T2") ||
4832 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004833 }
4834
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004835 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004836 // For most sub-arches, the build attribute CPU name is enough.
4837 // For Cortex variants, it's slightly different.
4838 switch(ArchKind) {
4839 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004840 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004841 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004842 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004843 case llvm::ARM::AK_ARMV7S:
4844 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004845 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004846 return "7A";
4847 case llvm::ARM::AK_ARMV7R:
4848 return "7R";
4849 case llvm::ARM::AK_ARMV7M:
4850 return "7M";
4851 case llvm::ARM::AK_ARMV7EM:
4852 return "7EM";
4853 case llvm::ARM::AK_ARMV8A:
4854 return "8A";
4855 case llvm::ARM::AK_ARMV8_1A:
4856 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004857 case llvm::ARM::AK_ARMV8_2A:
4858 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004859 case llvm::ARM::AK_ARMV8MBaseline:
4860 return "8M_BASE";
4861 case llvm::ARM::AK_ARMV8MMainline:
4862 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004863 }
4864 }
4865
4866 StringRef getCPUProfile() const {
4867 switch(ArchProfile) {
4868 case llvm::ARM::PK_A:
4869 return "A";
4870 case llvm::ARM::PK_R:
4871 return "R";
4872 case llvm::ARM::PK_M:
4873 return "M";
4874 default:
4875 return "";
4876 }
4877 }
4878
Chris Lattner17df24e2008-04-21 18:56:49 +00004879public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004880 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004881 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4882 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004883
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004884 switch (getTriple().getOS()) {
4885 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004886 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004887 break;
4888 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004889 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004890 break;
4891 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004892
Renato Goline84b0002015-10-08 16:43:26 +00004893 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004894 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004895
Chris Lattner1a8f3942010-04-23 16:29:58 +00004896 // {} in inline assembly are neon specifiers, not assembly variant
4897 // specifiers.
4898 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004899
Eric Christopher0e261882014-12-05 01:06:59 +00004900 // FIXME: This duplicates code from the driver that sets the -target-abi
4901 // option - this code is used if -target-abi isn't passed and should
4902 // be unified in some way.
4903 if (Triple.isOSBinFormatMachO()) {
4904 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4905 // the frontend matches that.
4906 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4907 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004908 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004909 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004910 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004911 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004912 } else {
4913 setABI("apcs-gnu");
4914 }
4915 } else if (Triple.isOSWindows()) {
4916 // FIXME: this is invalid for WindowsCE
4917 setABI("aapcs");
4918 } else {
4919 // Select the default based on the platform.
4920 switch (Triple.getEnvironment()) {
4921 case llvm::Triple::Android:
4922 case llvm::Triple::GNUEABI:
4923 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004924 case llvm::Triple::MuslEABI:
4925 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004926 setABI("aapcs-linux");
4927 break;
4928 case llvm::Triple::EABIHF:
4929 case llvm::Triple::EABI:
4930 setABI("aapcs");
4931 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004932 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004933 setABI("apcs-gnu");
4934 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004935 default:
4936 if (Triple.getOS() == llvm::Triple::NetBSD)
4937 setABI("apcs-gnu");
4938 else
4939 setABI("aapcs");
4940 break;
4941 }
4942 }
John McCall86353412010-08-21 22:46:04 +00004943
4944 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004945 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004946
Renato Golin15b86152015-07-03 16:41:13 +00004947 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004948 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004949
James Molloya7139222012-03-12 09:14:10 +00004950 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004951 // the alignment of the zero-length bitfield is greater than the member
4952 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004953 // zero length bitfield.
4954 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004955
4956 if (Triple.getOS() == llvm::Triple::Linux ||
4957 Triple.getOS() == llvm::Triple::UnknownOS)
4958 this->MCountName =
4959 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004960 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004961
Alp Toker4925ba72014-06-07 23:30:42 +00004962 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004963
Craig Topper3164f332014-03-11 03:39:26 +00004964 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004965 ABI = Name;
4966
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004967 // The defaults (above) are for AAPCS, check if we need to change them.
4968 //
4969 // FIXME: We need support for -meabi... we could just mangle it into the
4970 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004971 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004972 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004973 return true;
4974 }
4975 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4976 setABIAAPCS();
4977 return true;
4978 }
4979 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004980 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004981
Renato Golinf5c4dec2015-05-27 13:33:00 +00004982 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004983 bool
4984 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4985 StringRef CPU,
4986 const std::vector<std::string> &FeaturesVec) const override {
4987
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004988 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004989 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004990
4991 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004992 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004993 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4994
4995 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004996 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004997 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4998
4999 for (const char *Feature : TargetFeatures)
5000 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00005001 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005002
Eric Christopher007b0a02015-08-28 22:32:01 +00005003 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005004 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005005
Craig Topper3164f332014-03-11 03:39:26 +00005006 bool handleTargetFeatures(std::vector<std::string> &Features,
5007 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005008 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005009 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005010 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005011 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005012 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005013 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005014 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005015
Ranjeet Singhac08e532015-06-24 23:39:25 +00005016 // This does not diagnose illegal cases like having both
5017 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5018 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005019 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005020 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005021 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005022 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005023 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005024 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005025 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005026 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005027 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005028 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005029 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005030 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005031 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005032 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005033 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005034 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005035 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005036 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005037 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005038 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005039 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005040 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005041 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005042 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005043 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005044 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005045 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005046 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005047 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005048 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005049 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005050 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005051 } else if (Feature == "+strict-align") {
5052 Unaligned = 0;
5053 } else if (Feature == "+fp16") {
5054 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005055 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005056 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005057 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005058
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005059 switch (ArchVersion) {
5060 case 6:
5061 if (ArchProfile == llvm::ARM::PK_M)
5062 LDREX = 0;
5063 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5064 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5065 else
5066 LDREX = LDREX_W;
5067 break;
5068 case 7:
5069 if (ArchProfile == llvm::ARM::PK_M)
5070 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5071 else
5072 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5073 break;
5074 case 8:
5075 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5076 }
5077
Rafael Espindolaeb265472013-08-21 21:59:03 +00005078 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5079 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5080 return false;
5081 }
5082
5083 if (FPMath == FP_Neon)
5084 Features.push_back("+neonfp");
5085 else if (FPMath == FP_VFP)
5086 Features.push_back("-neonfp");
5087
Daniel Dunbar893d4752009-12-19 04:15:38 +00005088 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005089 auto Feature =
5090 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5091 if (Feature != Features.end())
5092 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005093
Rafael Espindolaeb265472013-08-21 21:59:03 +00005094 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005095 }
5096
Craig Topper3164f332014-03-11 03:39:26 +00005097 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005098 return llvm::StringSwitch<bool>(Feature)
5099 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005100 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005101 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005102 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005103 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005104 .Case("hwdiv", HWDiv & HWDivThumb)
5105 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005106 .Default(false);
5107 }
Renato Golin15b86152015-07-03 16:41:13 +00005108
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005109 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005110 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005111 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005112
Renato Golin15b86152015-07-03 16:41:13 +00005113 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005114 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005115 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005116 CPU = Name;
5117 return true;
5118 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005119
Craig Topper3164f332014-03-11 03:39:26 +00005120 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005121
Craig Topper3164f332014-03-11 03:39:26 +00005122 void getTargetDefines(const LangOptions &Opts,
5123 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005124 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005125 Builder.defineMacro("__arm");
5126 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005127 // For bare-metal none-eabi.
5128 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5129 getTriple().getEnvironment() == llvm::Triple::EABI)
5130 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005131
Chris Lattnerecd49032009-03-02 22:27:17 +00005132 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005133 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005134
5135 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5136 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005137 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005138 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5139
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005140 if (!CPUAttr.empty())
5141 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005142
5143 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005144 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005145 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005146
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005147 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005148 // ACLE 6.5.7 Crypto Extension
5149 if (Crypto)
5150 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5151 // ACLE 6.5.8 CRC32 Extension
5152 if (CRC)
5153 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5154 // ACLE 6.5.10 Numeric Maximum and Minimum
5155 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5156 // ACLE 6.5.9 Directed Rounding
5157 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005158 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005159
5160 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5161 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005162 // NOTE that the default profile is assumed to be 'A'
5163 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005164 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5165
Bradley Smithf4affc12016-03-03 13:52:22 +00005166 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5167 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5168 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5169 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005170 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005171 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005172 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005173 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5174
5175 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5176 // instruction set such as ARM or Thumb.
5177 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5178
5179 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5180
5181 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005182 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005183 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005184
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005185 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005186 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005187 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005188
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005189 // ACLE 6.4.4 LDREX/STREX
5190 if (LDREX)
5191 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5192
5193 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005194 if (ArchVersion == 5 ||
5195 (ArchVersion == 6 && CPUProfile != "M") ||
5196 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005197 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5198
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005199 // ACLE 6.5.1 Hardware Floating Point
5200 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005201 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005202
Yi Konga44c4d72014-06-27 21:25:42 +00005203 // ACLE predefines.
5204 Builder.defineMacro("__ARM_ACLE", "200");
5205
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005206 // FP16 support (we currently only support IEEE format).
5207 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5208 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5209
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005210 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005211 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005212 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5213
Mike Stump9d54bd72009-04-08 02:07:04 +00005214 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005215
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005216 // FIXME: It's more complicated than this and we don't really support
5217 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005218 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005219 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005220 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005221
David Tweed8f676532012-10-25 13:33:01 +00005222 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005223 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005224 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005225 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005226 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005227 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005228 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005229
Tim Northover28fc0e12016-04-28 13:59:55 +00005230 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5231 ABI == "aapcs16")
5232 Builder.defineMacro("__ARM_PCS_VFP", "1");
5233
Daniel Dunbar893d4752009-12-19 04:15:38 +00005234 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005235 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005236
Zijiao Ma56a83722016-08-17 02:13:33 +00005237 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005238 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005239
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005240 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005241 Builder.defineMacro("__THUMBEL__");
5242 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005243 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005244 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005245 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005246
5247 // ACLE 6.4.9 32-bit SIMD instructions
5248 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5249 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5250
5251 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005252 if (((HWDiv & HWDivThumb) && isThumb()) ||
5253 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005254 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005255 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005256 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005257
5258 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005259 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005260
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005261 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005262 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005263 if (FPU & VFP2FPU)
5264 Builder.defineMacro("__ARM_VFPV2__");
5265 if (FPU & VFP3FPU)
5266 Builder.defineMacro("__ARM_VFPV3__");
5267 if (FPU & VFP4FPU)
5268 Builder.defineMacro("__ARM_VFPV4__");
5269 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005270
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005271 // This only gets set when Neon instructions are actually available, unlike
5272 // the VFP define, hence the soft float and arch check. This is subtly
5273 // different from gcc, we follow the intent which was that it should be set
5274 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005275 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005276 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005277 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005278 // current AArch32 NEON implementations do not support double-precision
5279 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005280 Builder.defineMacro("__ARM_NEON_FP",
5281 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005282 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005283
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005284 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5285 Opts.ShortWChar ? "2" : "4");
5286
5287 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5288 Opts.ShortEnums ? "1" : "4");
5289
Bradley Smithf4affc12016-03-03 13:52:22 +00005290 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005291 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5292 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5293 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5294 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5295 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005296
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005297 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005298 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005299 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005300 }
5301
5302 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005303 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005304 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5305 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005306 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005307 }
5308
5309 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005310 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005311 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005312
5313 if (Opts.UnsafeFPMath)
5314 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005315
5316 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5317 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005318 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005319
Craig Topper6c03a542015-10-19 04:51:35 +00005320 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5321 return llvm::makeArrayRef(BuiltinInfo,
5322 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005323 }
Craig Topper3164f332014-03-11 03:39:26 +00005324 bool isCLZForZeroUndef() const override { return false; }
5325 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005326 return IsAAPCS
5327 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005328 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5329 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005330 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005331 ArrayRef<const char *> getGCCRegNames() const override;
5332 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005333 bool validateAsmConstraint(const char *&Name,
5334 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005335 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005336 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005337 case 'l': // r0-r7
5338 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005339 case 't': // VFP Floating point register single precision
5340 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005341 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005342 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005343 case 'I':
5344 case 'J':
5345 case 'K':
5346 case 'L':
5347 case 'M':
5348 // FIXME
5349 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005350 case 'Q': // A memory address that is a single base register.
5351 Info.setAllowsMemory();
5352 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005353 case 'U': // a memory reference...
5354 switch (Name[1]) {
5355 case 'q': // ...ARMV4 ldrsb
5356 case 'v': // ...VFP load/store (reg+constant offset)
5357 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005358 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005359 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005360 case 'n': // valid address for Neon doubleword vector load/store
5361 case 'm': // valid address for Neon element and structure load/store
5362 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005363 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005364 Info.setAllowsMemory();
5365 Name++;
5366 return true;
5367 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005368 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005369 return false;
5370 }
Craig Topper3164f332014-03-11 03:39:26 +00005371 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005372 std::string R;
5373 switch (*Constraint) {
5374 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005375 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005376 Constraint++;
5377 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005378 case 'p': // 'p' should be translated to 'r' by default.
5379 R = std::string("r");
5380 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005381 default:
5382 return std::string(1, *Constraint);
5383 }
5384 return R;
5385 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005386 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005387 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005388 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005389 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005390 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005391
Bill Wendling9d1ee112012-10-25 23:28:48 +00005392 // Strip off constraint modifiers.
5393 while (Constraint[0] == '=' ||
5394 Constraint[0] == '+' ||
5395 Constraint[0] == '&')
5396 Constraint = Constraint.substr(1);
5397
5398 switch (Constraint[0]) {
5399 default: break;
5400 case 'r': {
5401 switch (Modifier) {
5402 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005403 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005404 case 'q':
5405 // A register of size 32 cannot fit a vector type.
5406 return false;
5407 }
5408 }
5409 }
5410
5411 return true;
5412 }
Craig Topper3164f332014-03-11 03:39:26 +00005413 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005414 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005415 return "";
5416 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005417
Craig Topper3164f332014-03-11 03:39:26 +00005418 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005419 switch (CC) {
5420 case CC_AAPCS:
5421 case CC_AAPCS_VFP:
5422 case CC_Swift:
5423 return CCCR_OK;
5424 default:
5425 return CCCR_Warning;
5426 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005427 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005428
Craig Topper3164f332014-03-11 03:39:26 +00005429 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005430 if (RegNo == 0) return 0;
5431 if (RegNo == 1) return 1;
5432 return -1;
5433 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005434
5435 bool hasSjLjLowering() const override {
5436 return true;
5437 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005438};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005439
Rafael Espindolaeb265472013-08-21 21:59:03 +00005440bool ARMTargetInfo::setFPMath(StringRef Name) {
5441 if (Name == "neon") {
5442 FPMath = FP_Neon;
5443 return true;
5444 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5445 Name == "vfp4") {
5446 FPMath = FP_VFP;
5447 return true;
5448 }
5449 return false;
5450}
5451
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005452const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005453 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005454 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005455 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5456
5457 // Float registers
5458 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5459 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5460 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005461 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005462
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005463 // Double registers
5464 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5465 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005466 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5467 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005468
5469 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005470 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5471 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005472};
5473
Craig Topperf054e3a2015-10-19 03:52:27 +00005474ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5475 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005476}
5477
5478const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005479 { { "a1" }, "r0" },
5480 { { "a2" }, "r1" },
5481 { { "a3" }, "r2" },
5482 { { "a4" }, "r3" },
5483 { { "v1" }, "r4" },
5484 { { "v2" }, "r5" },
5485 { { "v3" }, "r6" },
5486 { { "v4" }, "r7" },
5487 { { "v5" }, "r8" },
5488 { { "v6", "rfp" }, "r9" },
5489 { { "sl" }, "r10" },
5490 { { "fp" }, "r11" },
5491 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005492 { { "r13" }, "sp" },
5493 { { "r14" }, "lr" },
5494 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005495 // The S, D and Q registers overlap, but aren't really aliases; we
5496 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005497};
5498
Craig Topperf054e3a2015-10-19 03:52:27 +00005499ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5500 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005501}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005502
5503const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005504#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005505 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005506#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5507 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005508#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005509
Craig Topper07d3b622015-08-07 05:14:44 +00005510#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005511 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005512#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005513 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005514#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5515 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005516#include "clang/Basic/BuiltinsARM.def"
5517};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005518
5519class ARMleTargetInfo : public ARMTargetInfo {
5520public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005521 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005522 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005523 void getTargetDefines(const LangOptions &Opts,
5524 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005525 Builder.defineMacro("__ARMEL__");
5526 ARMTargetInfo::getTargetDefines(Opts, Builder);
5527 }
5528};
5529
5530class ARMbeTargetInfo : public ARMTargetInfo {
5531public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005532 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005533 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005534 void getTargetDefines(const LangOptions &Opts,
5535 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005536 Builder.defineMacro("__ARMEB__");
5537 Builder.defineMacro("__ARM_BIG_ENDIAN");
5538 ARMTargetInfo::getTargetDefines(Opts, Builder);
5539 }
5540};
Chris Lattner17df24e2008-04-21 18:56:49 +00005541
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005542class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5543 const llvm::Triple Triple;
5544public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005545 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5546 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005547 WCharType = UnsignedShort;
5548 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005549 }
5550 void getVisualStudioDefines(const LangOptions &Opts,
5551 MacroBuilder &Builder) const {
5552 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5553
5554 // FIXME: this is invalid for WindowsCE
5555 Builder.defineMacro("_M_ARM_NT", "1");
5556 Builder.defineMacro("_M_ARMT", "_M_ARM");
5557 Builder.defineMacro("_M_THUMB", "_M_ARM");
5558
5559 assert((Triple.getArch() == llvm::Triple::arm ||
5560 Triple.getArch() == llvm::Triple::thumb) &&
5561 "invalid architecture for Windows ARM target info");
5562 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5563 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5564
5565 // TODO map the complete set of values
5566 // 31: VFPv3 40: VFPv4
5567 Builder.defineMacro("_M_ARM_FP", "31");
5568 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005569 BuiltinVaListKind getBuiltinVaListKind() const override {
5570 return TargetInfo::CharPtrBuiltinVaList;
5571 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005572 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5573 switch (CC) {
5574 case CC_X86StdCall:
5575 case CC_X86ThisCall:
5576 case CC_X86FastCall:
5577 case CC_X86VectorCall:
5578 return CCCR_Ignore;
5579 case CC_C:
5580 return CCCR_OK;
5581 default:
5582 return CCCR_Warning;
5583 }
5584 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005585};
5586
5587// Windows ARM + Itanium C++ ABI Target
5588class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5589public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005590 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5591 const TargetOptions &Opts)
5592 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005593 TheCXXABI.set(TargetCXXABI::GenericARM);
5594 }
5595
5596 void getTargetDefines(const LangOptions &Opts,
5597 MacroBuilder &Builder) const override {
5598 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5599
5600 if (Opts.MSVCCompat)
5601 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5602 }
5603};
5604
5605// Windows ARM, MS (C++) ABI
5606class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5607public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005608 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5609 const TargetOptions &Opts)
5610 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005611 TheCXXABI.set(TargetCXXABI::Microsoft);
5612 }
5613
5614 void getTargetDefines(const LangOptions &Opts,
5615 MacroBuilder &Builder) const override {
5616 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5617 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5618 }
5619};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005620
Yaron Keren321249c2015-07-15 13:32:23 +00005621// ARM MinGW target
5622class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5623public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005624 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5625 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005626 TheCXXABI.set(TargetCXXABI::GenericARM);
5627 }
5628
5629 void getTargetDefines(const LangOptions &Opts,
5630 MacroBuilder &Builder) const override {
5631 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5632 DefineStd(Builder, "WIN32", Opts);
5633 DefineStd(Builder, "WINNT", Opts);
5634 Builder.defineMacro("_ARM_");
5635 addMinGWDefines(Opts, Builder);
5636 }
5637};
5638
5639// ARM Cygwin target
5640class CygwinARMTargetInfo : public ARMleTargetInfo {
5641public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005642 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5643 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005644 TLSSupported = false;
5645 WCharType = UnsignedShort;
5646 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005647 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005648 }
5649 void getTargetDefines(const LangOptions &Opts,
5650 MacroBuilder &Builder) const override {
5651 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5652 Builder.defineMacro("_ARM_");
5653 Builder.defineMacro("__CYGWIN__");
5654 Builder.defineMacro("__CYGWIN32__");
5655 DefineStd(Builder, "unix", Opts);
5656 if (Opts.CPlusPlus)
5657 Builder.defineMacro("_GNU_SOURCE");
5658 }
5659};
5660
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005661class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005662protected:
Craig Topper3164f332014-03-11 03:39:26 +00005663 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5664 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005665 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005666 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005667
Torok Edwinb2b37c62009-06-30 17:10:35 +00005668public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005669 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5670 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005671 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005672 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005673 // FIXME: This should be based off of the target features in
5674 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005675 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005676
Tim Northoverd88ecb32016-01-27 19:32:40 +00005677 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005678 // Darwin on iOS uses a variant of the ARM C++ ABI.
5679 TheCXXABI.set(TargetCXXABI::WatchOS);
5680
5681 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5682 // size_t is long, it's a bit weird for it to be int.
5683 PtrDiffType = SignedLong;
5684
5685 // BOOL should be a real boolean on the new ABI
5686 UseSignedCharForObjCBool = false;
5687 } else
5688 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005689 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005690};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005691
Tim Northover573cbee2014-05-24 12:52:07 +00005692class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005693 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005694 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5695 static const char *const GCCRegNames[];
5696
James Molloy75f5f9e2014-04-16 15:33:48 +00005697 enum FPUModeEnum {
5698 FPUMode,
5699 NeonMode
5700 };
5701
5702 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005703 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005704 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005705 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005706 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005707
Tim Northovera2ee4332014-03-29 15:09:45 +00005708 static const Builtin::Info BuiltinInfo[];
5709
5710 std::string ABI;
5711
5712public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005713 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005714 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005715 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5716 WCharType = SignedInt;
5717
5718 // NetBSD apparently prefers consistency across ARM targets to consistency
5719 // across 64-bit targets.
5720 Int64Type = SignedLongLong;
5721 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005722 } else {
5723 WCharType = UnsignedInt;
5724 Int64Type = SignedLong;
5725 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005726 }
5727
Tim Northovera2ee4332014-03-29 15:09:45 +00005728 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005729 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005730 MaxAtomicInlineWidth = 128;
5731 MaxAtomicPromoteWidth = 128;
5732
Tim Northovera6a19f12015-02-06 01:25:07 +00005733 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005734 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5735
Tim Northovera2ee4332014-03-29 15:09:45 +00005736 // {} in inline assembly are neon specifiers, not assembly variant
5737 // specifiers.
5738 NoAsmVariants = true;
5739
Tim Northover7ad87af2015-01-16 18:44:04 +00005740 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5741 // contributes to the alignment of the containing aggregate in the same way
5742 // a plain (non bit-field) member of that type would, without exception for
5743 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005744 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005745 UseZeroLengthBitfieldAlignment = true;
5746
Tim Northover573cbee2014-05-24 12:52:07 +00005747 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005748 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005749
5750 if (Triple.getOS() == llvm::Triple::Linux ||
5751 Triple.getOS() == llvm::Triple::UnknownOS)
5752 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005753 }
5754
Alp Toker4925ba72014-06-07 23:30:42 +00005755 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005756 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005757 if (Name != "aapcs" && Name != "darwinpcs")
5758 return false;
5759
5760 ABI = Name;
5761 return true;
5762 }
5763
David Blaikie1cbb9712014-11-14 19:09:44 +00005764 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005765 return Name == "generic" ||
5766 llvm::AArch64::parseCPUArch(Name) !=
5767 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005768 }
5769
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005770 void getTargetDefines(const LangOptions &Opts,
5771 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005772 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005773 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005774
5775 // Target properties.
5776 Builder.defineMacro("_LP64");
5777 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005778
5779 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5780 Builder.defineMacro("__ARM_ACLE", "200");
5781 Builder.defineMacro("__ARM_ARCH", "8");
5782 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5783
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005784 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005785 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005786 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005787
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005788 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5789 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5790 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5791 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005792 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005793 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5794 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005795
5796 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5797
5798 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005799 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005800
5801 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5802 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005803 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5804 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005805
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005806 if (Opts.UnsafeFPMath)
5807 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005808
5809 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5810
5811 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5812 Opts.ShortEnums ? "1" : "4");
5813
James Molloy75f5f9e2014-04-16 15:33:48 +00005814 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005815 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005816 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005817 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005818 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005819
Bradley Smith418c5932014-05-02 15:17:51 +00005820 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005821 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005822
James Molloy75f5f9e2014-04-16 15:33:48 +00005823 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005824 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5825
5826 if (Unaligned)
5827 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005828
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005829 if (V8_1A)
5830 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5831
Reid Klecknerd167d422015-05-06 15:31:46 +00005832 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5833 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5834 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5835 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5836 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005837 }
5838
Craig Topper6c03a542015-10-19 04:51:35 +00005839 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5840 return llvm::makeArrayRef(BuiltinInfo,
5841 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005842 }
5843
David Blaikie1cbb9712014-11-14 19:09:44 +00005844 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005845 return Feature == "aarch64" ||
5846 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005847 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005848 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005849 }
5850
James Molloy5e73df52014-04-16 15:06:20 +00005851 bool handleTargetFeatures(std::vector<std::string> &Features,
5852 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005853 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005854 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005855 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005856 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005857 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005858
Eric Christopher610fe112015-08-26 08:21:55 +00005859 for (const auto &Feature : Features) {
5860 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005861 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005862 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005863 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005864 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005865 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005866 if (Feature == "+strict-align")
5867 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005868 if (Feature == "+v8.1a")
5869 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005870 }
5871
James Y Knightb214cbc2016-03-04 19:00:41 +00005872 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005873
5874 return true;
5875 }
5876
John McCall477f2bb2016-03-03 06:39:32 +00005877 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5878 switch (CC) {
5879 case CC_C:
5880 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005881 case CC_PreserveMost:
5882 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005883 return CCCR_OK;
5884 default:
5885 return CCCR_Warning;
5886 }
5887 }
5888
David Blaikie1cbb9712014-11-14 19:09:44 +00005889 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005890
David Blaikie1cbb9712014-11-14 19:09:44 +00005891 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005892 return TargetInfo::AArch64ABIBuiltinVaList;
5893 }
5894
Craig Topperf054e3a2015-10-19 03:52:27 +00005895 ArrayRef<const char *> getGCCRegNames() const override;
5896 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005897
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005898 bool validateAsmConstraint(const char *&Name,
5899 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005900 switch (*Name) {
5901 default:
5902 return false;
5903 case 'w': // Floating point and SIMD registers (V0-V31)
5904 Info.setAllowsRegister();
5905 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005906 case 'I': // Constant that can be used with an ADD instruction
5907 case 'J': // Constant that can be used with a SUB instruction
5908 case 'K': // Constant that can be used with a 32-bit logical instruction
5909 case 'L': // Constant that can be used with a 64-bit logical instruction
5910 case 'M': // Constant that can be used as a 32-bit MOV immediate
5911 case 'N': // Constant that can be used as a 64-bit MOV immediate
5912 case 'Y': // Floating point constant zero
5913 case 'Z': // Integer constant zero
5914 return true;
5915 case 'Q': // A memory reference with base register and no offset
5916 Info.setAllowsMemory();
5917 return true;
5918 case 'S': // A symbolic address
5919 Info.setAllowsRegister();
5920 return true;
5921 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005922 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5923 // Utf: A memory address suitable for ldp/stp in TF mode.
5924 // Usa: An absolute symbolic address.
5925 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5926 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005927 case 'z': // Zero register, wzr or xzr
5928 Info.setAllowsRegister();
5929 return true;
5930 case 'x': // Floating point and SIMD registers (V0-V15)
5931 Info.setAllowsRegister();
5932 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005933 }
5934 return false;
5935 }
5936
Akira Hatanaka987f1862014-08-22 06:05:21 +00005937 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005938 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005939 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005940 // Strip off constraint modifiers.
5941 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5942 Constraint = Constraint.substr(1);
5943
5944 switch (Constraint[0]) {
5945 default:
5946 return true;
5947 case 'z':
5948 case 'r': {
5949 switch (Modifier) {
5950 case 'x':
5951 case 'w':
5952 // For now assume that the person knows what they're
5953 // doing with the modifier.
5954 return true;
5955 default:
5956 // By default an 'r' constraint will be in the 'x'
5957 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005958 if (Size == 64)
5959 return true;
5960
5961 SuggestedModifier = "w";
5962 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005963 }
5964 }
5965 }
5966 }
5967
David Blaikie1cbb9712014-11-14 19:09:44 +00005968 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005969
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005970 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005971 if (RegNo == 0)
5972 return 0;
5973 if (RegNo == 1)
5974 return 1;
5975 return -1;
5976 }
5977};
5978
Tim Northover573cbee2014-05-24 12:52:07 +00005979const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005980 // 32-bit Integer registers
5981 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5982 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5983 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5984
5985 // 64-bit Integer registers
5986 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5987 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5988 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5989
5990 // 32-bit floating point regsisters
5991 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5992 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5993 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5994
5995 // 64-bit floating point regsisters
5996 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5997 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5998 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5999
6000 // Vector registers
6001 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6002 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6003 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6004};
6005
Craig Topperf054e3a2015-10-19 03:52:27 +00006006ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6007 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006008}
6009
Tim Northover573cbee2014-05-24 12:52:07 +00006010const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006011 { { "w31" }, "wsp" },
6012 { { "x29" }, "fp" },
6013 { { "x30" }, "lr" },
6014 { { "x31" }, "sp" },
6015 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6016 // don't want to substitute one of these for a different-sized one.
6017};
6018
Craig Topperf054e3a2015-10-19 03:52:27 +00006019ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6020 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006021}
6022
Tim Northover573cbee2014-05-24 12:52:07 +00006023const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006024#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006025 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006026#include "clang/Basic/BuiltinsNEON.def"
6027
6028#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006029 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006030#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006031};
James Molloy5e73df52014-04-16 15:06:20 +00006032
Tim Northover573cbee2014-05-24 12:52:07 +00006033class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006034 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006035 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006036 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006037 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006038 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006039 }
6040
6041public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006042 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6043 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006044 }
James Molloy5e73df52014-04-16 15:06:20 +00006045 void getTargetDefines(const LangOptions &Opts,
6046 MacroBuilder &Builder) const override {
6047 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006048 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006049 }
6050};
6051
Tim Northover573cbee2014-05-24 12:52:07 +00006052class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006053 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006054 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006055 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006056 }
6057
6058public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006059 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6060 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006061 void getTargetDefines(const LangOptions &Opts,
6062 MacroBuilder &Builder) const override {
6063 Builder.defineMacro("__AARCH64EB__");
6064 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6065 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006066 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006067 }
6068};
Tim Northovera2ee4332014-03-29 15:09:45 +00006069
Tim Northover573cbee2014-05-24 12:52:07 +00006070class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006071protected:
6072 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6073 MacroBuilder &Builder) const override {
6074 Builder.defineMacro("__AARCH64_SIMD__");
6075 Builder.defineMacro("__ARM64_ARCH_8__");
6076 Builder.defineMacro("__ARM_NEON__");
6077 Builder.defineMacro("__LITTLE_ENDIAN__");
6078 Builder.defineMacro("__REGISTER_PREFIX__", "");
6079 Builder.defineMacro("__arm64", "1");
6080 Builder.defineMacro("__arm64__", "1");
6081
6082 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6083 }
6084
Tim Northovera2ee4332014-03-29 15:09:45 +00006085public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006086 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6087 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006088 Int64Type = SignedLongLong;
6089 WCharType = SignedInt;
6090 UseSignedCharForObjCBool = false;
6091
Tim Northovera6a19f12015-02-06 01:25:07 +00006092 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006093 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6094
6095 TheCXXABI.set(TargetCXXABI::iOS64);
6096 }
6097
David Blaikie1cbb9712014-11-14 19:09:44 +00006098 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006099 return TargetInfo::CharPtrBuiltinVaList;
6100 }
6101};
Tim Northovera2ee4332014-03-29 15:09:45 +00006102
Tony Linthicum76329bf2011-12-12 21:14:55 +00006103// Hexagon abstract base class
6104class HexagonTargetInfo : public TargetInfo {
6105 static const Builtin::Info BuiltinInfo[];
6106 static const char * const GCCRegNames[];
6107 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6108 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006109 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006110 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006111
Tony Linthicum76329bf2011-12-12 21:14:55 +00006112public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006113 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6114 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006115 // Specify the vector alignment explicitly. For v512x1, the calculated
6116 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6117 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006118 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006119 "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 +00006120 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006121 SizeType = UnsignedInt;
6122 PtrDiffType = SignedInt;
6123 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006124
6125 // {} in inline assembly are packet specifiers, not assembly variant
6126 // specifiers.
6127 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006128
6129 LargeArrayMinWidth = 64;
6130 LargeArrayAlign = 64;
6131 UseBitFieldTypeAlignment = true;
6132 ZeroLengthBitfieldBoundary = 32;
6133 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006134 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006135 }
6136
Craig Topper6c03a542015-10-19 04:51:35 +00006137 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6138 return llvm::makeArrayRef(BuiltinInfo,
6139 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006140 }
6141
Craig Topper3164f332014-03-11 03:39:26 +00006142 bool validateAsmConstraint(const char *&Name,
6143 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006144 switch (*Name) {
6145 case 'v':
6146 case 'q':
6147 if (HasHVX) {
6148 Info.setAllowsRegister();
6149 return true;
6150 }
6151 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006152 case 's':
6153 // Relocatable constant.
6154 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006155 }
6156 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006157 }
6158
Craig Topper3164f332014-03-11 03:39:26 +00006159 void getTargetDefines(const LangOptions &Opts,
6160 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006161
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006162 bool isCLZForZeroUndef() const override { return false; }
6163
Craig Topper3164f332014-03-11 03:39:26 +00006164 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006165 return llvm::StringSwitch<bool>(Feature)
6166 .Case("hexagon", true)
6167 .Case("hvx", HasHVX)
6168 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006169 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006170 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006171 }
Craig Topper3164f332014-03-11 03:39:26 +00006172
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006173 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6174 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6175 const override;
6176
6177 bool handleTargetFeatures(std::vector<std::string> &Features,
6178 DiagnosticsEngine &Diags) override;
6179
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006180 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6181 bool Enabled) const override;
6182
Craig Topper3164f332014-03-11 03:39:26 +00006183 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006184 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006185 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006186 ArrayRef<const char *> getGCCRegNames() const override;
6187 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006188 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006189 return "";
6190 }
Sebastian Pop86500282012-01-13 20:37:10 +00006191
6192 static const char *getHexagonCPUSuffix(StringRef Name) {
6193 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006194 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006195 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006196 .Case("hexagonv55", "55")
6197 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006198 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006199 }
6200
Craig Topper3164f332014-03-11 03:39:26 +00006201 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006202 if (!getHexagonCPUSuffix(Name))
6203 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006204 CPU = Name;
6205 return true;
6206 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006207
6208 int getEHDataRegisterNumber(unsigned RegNo) const override {
6209 return RegNo < 2 ? RegNo : -1;
6210 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006211};
6212
6213void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006214 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006215 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006216 Builder.defineMacro("__hexagon__", "1");
6217
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006218 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006219 Builder.defineMacro("__HEXAGON_V4__");
6220 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006221 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006222 Builder.defineMacro("__QDSP6_V4__");
6223 Builder.defineMacro("__QDSP6_ARCH__", "4");
6224 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006225 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006226 Builder.defineMacro("__HEXAGON_V5__");
6227 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6228 if(Opts.HexagonQdsp6Compat) {
6229 Builder.defineMacro("__QDSP6_V5__");
6230 Builder.defineMacro("__QDSP6_ARCH__", "5");
6231 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006232 } else if (CPU == "hexagonv55") {
6233 Builder.defineMacro("__HEXAGON_V55__");
6234 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6235 Builder.defineMacro("__QDSP6_V55__");
6236 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006237 } else if (CPU == "hexagonv60") {
6238 Builder.defineMacro("__HEXAGON_V60__");
6239 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6240 Builder.defineMacro("__QDSP6_V60__");
6241 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006242 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006243
6244 if (hasFeature("hvx")) {
6245 Builder.defineMacro("__HVX__");
6246 if (hasFeature("hvx-double"))
6247 Builder.defineMacro("__HVXDBL__");
6248 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006249}
6250
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006251bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6252 DiagnosticsEngine &Diags, StringRef CPU,
6253 const std::vector<std::string> &FeaturesVec) const {
6254 // Default for v60: -hvx, -hvx-double.
6255 Features["hvx"] = false;
6256 Features["hvx-double"] = false;
6257 Features["long-calls"] = false;
6258
6259 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6260}
6261
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006262bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6263 DiagnosticsEngine &Diags) {
6264 for (auto &F : Features) {
6265 if (F == "+hvx")
6266 HasHVX = true;
6267 else if (F == "-hvx")
6268 HasHVX = HasHVXDouble = false;
6269 else if (F == "+hvx-double")
6270 HasHVX = HasHVXDouble = true;
6271 else if (F == "-hvx-double")
6272 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006273
6274 if (F == "+long-calls")
6275 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006276 else if (F == "-long-calls")
6277 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006278 }
6279 return true;
6280}
6281
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006282void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6283 StringRef Name, bool Enabled) const {
6284 if (Enabled) {
6285 if (Name == "hvx-double")
6286 Features["hvx"] = true;
6287 } else {
6288 if (Name == "hvx")
6289 Features["hvx-double"] = false;
6290 }
6291 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006292}
6293
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006294const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006295 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6296 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6297 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6298 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6299 "p0", "p1", "p2", "p3",
6300 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6301};
6302
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006303ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006304 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006305}
6306
Tony Linthicum76329bf2011-12-12 21:14:55 +00006307const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6308 { { "sp" }, "r29" },
6309 { { "fp" }, "r30" },
6310 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006311};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006312
Craig Topperf054e3a2015-10-19 03:52:27 +00006313ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6314 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006315}
6316
6317
6318const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006319#define BUILTIN(ID, TYPE, ATTRS) \
6320 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6321#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6322 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006323#include "clang/Basic/BuiltinsHexagon.def"
6324};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006325
Jacques Pienaard964cc22016-03-28 21:02:54 +00006326class LanaiTargetInfo : public TargetInfo {
6327 // Class for Lanai (32-bit).
6328 // The CPU profiles supported by the Lanai backend
6329 enum CPUKind {
6330 CK_NONE,
6331 CK_V11,
6332 } CPU;
6333
6334 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6335 static const char *const GCCRegNames[];
6336
6337public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006338 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6339 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006340 // Description string has to be kept in sync with backend.
6341 resetDataLayout("E" // Big endian
6342 "-m:e" // ELF name manging
6343 "-p:32:32" // 32 bit pointers, 32 bit aligned
6344 "-i64:64" // 64 bit integers, 64 bit aligned
6345 "-a:0:32" // 32 bit alignment of objects of aggregate type
6346 "-n32" // 32 bit native integer width
6347 "-S64" // 64 bit natural stack alignment
6348 );
6349
6350 // Setting RegParmMax equal to what mregparm was set to in the old
6351 // toolchain
6352 RegParmMax = 4;
6353
6354 // Set the default CPU to V11
6355 CPU = CK_V11;
6356
6357 // Temporary approach to make everything at least word-aligned and allow for
6358 // safely casting between pointers with different alignment requirements.
6359 // TODO: Remove this when there are no more cast align warnings on the
6360 // firmware.
6361 MinGlobalAlign = 32;
6362 }
6363
6364 void getTargetDefines(const LangOptions &Opts,
6365 MacroBuilder &Builder) const override {
6366 // Define __lanai__ when building for target lanai.
6367 Builder.defineMacro("__lanai__");
6368
6369 // Set define for the CPU specified.
6370 switch (CPU) {
6371 case CK_V11:
6372 Builder.defineMacro("__LANAI_V11__");
6373 break;
6374 case CK_NONE:
6375 llvm_unreachable("Unhandled target CPU");
6376 }
6377 }
6378
6379 bool setCPU(const std::string &Name) override {
6380 CPU = llvm::StringSwitch<CPUKind>(Name)
6381 .Case("v11", CK_V11)
6382 .Default(CK_NONE);
6383
6384 return CPU != CK_NONE;
6385 }
6386
6387 bool hasFeature(StringRef Feature) const override {
6388 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6389 }
6390
6391 ArrayRef<const char *> getGCCRegNames() const override;
6392
6393 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6394
6395 BuiltinVaListKind getBuiltinVaListKind() const override {
6396 return TargetInfo::VoidPtrBuiltinVaList;
6397 }
6398
6399 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6400
6401 bool validateAsmConstraint(const char *&Name,
6402 TargetInfo::ConstraintInfo &info) const override {
6403 return false;
6404 }
6405
6406 const char *getClobbers() const override { return ""; }
6407};
6408
6409const char *const LanaiTargetInfo::GCCRegNames[] = {
6410 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6411 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6412 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6413
6414ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6415 return llvm::makeArrayRef(GCCRegNames);
6416}
6417
6418const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6419 {{"pc"}, "r2"},
6420 {{"sp"}, "r4"},
6421 {{"fp"}, "r5"},
6422 {{"rv"}, "r8"},
6423 {{"rr1"}, "r10"},
6424 {{"rr2"}, "r11"},
6425 {{"rca"}, "r15"},
6426};
6427
6428ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6429 return llvm::makeArrayRef(GCCRegAliases);
6430}
6431
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006432// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6433class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006434 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6435 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006436 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006437public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006438 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006439 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006440
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006441 int getEHDataRegisterNumber(unsigned RegNo) const override {
6442 if (RegNo == 0) return 24;
6443 if (RegNo == 1) return 25;
6444 return -1;
6445 }
6446
Craig Topper3164f332014-03-11 03:39:26 +00006447 bool handleTargetFeatures(std::vector<std::string> &Features,
6448 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006449 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006450 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6451 if (Feature != Features.end()) {
6452 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006453 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006454 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006455 }
Craig Topper3164f332014-03-11 03:39:26 +00006456 void getTargetDefines(const LangOptions &Opts,
6457 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006458 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006459 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006460
6461 if (SoftFloat)
6462 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006463 }
Craig Topper3164f332014-03-11 03:39:26 +00006464
6465 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006466 return llvm::StringSwitch<bool>(Feature)
6467 .Case("softfloat", SoftFloat)
6468 .Case("sparc", true)
6469 .Default(false);
6470 }
Craig Topper3164f332014-03-11 03:39:26 +00006471
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006472 bool hasSjLjLowering() const override {
6473 return true;
6474 }
6475
Craig Topper6c03a542015-10-19 04:51:35 +00006476 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006477 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006478 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006479 }
Craig Topper3164f332014-03-11 03:39:26 +00006480 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006481 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006482 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006483 ArrayRef<const char *> getGCCRegNames() const override;
6484 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006485 bool validateAsmConstraint(const char *&Name,
6486 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006487 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006488 switch (*Name) {
6489 case 'I': // Signed 13-bit constant
6490 case 'J': // Zero
6491 case 'K': // 32-bit constant with the low 12 bits clear
6492 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6493 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6494 case 'N': // Same as 'K' but zext (required for SIMode)
6495 case 'O': // The constant 4096
6496 return true;
6497 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006498 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006499 }
Craig Topper3164f332014-03-11 03:39:26 +00006500 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006501 // FIXME: Implement!
6502 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006503 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006504
6505 // No Sparc V7 for now, the backend doesn't support it anyway.
6506 enum CPUKind {
6507 CK_GENERIC,
6508 CK_V8,
6509 CK_SUPERSPARC,
6510 CK_SPARCLITE,
6511 CK_F934,
6512 CK_HYPERSPARC,
6513 CK_SPARCLITE86X,
6514 CK_SPARCLET,
6515 CK_TSC701,
6516 CK_V9,
6517 CK_ULTRASPARC,
6518 CK_ULTRASPARC3,
6519 CK_NIAGARA,
6520 CK_NIAGARA2,
6521 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006522 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006523 CK_MYRIAD2100,
6524 CK_MYRIAD2150,
6525 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006526 CK_LEON2,
6527 CK_LEON2_AT697E,
6528 CK_LEON2_AT697F,
6529 CK_LEON3,
6530 CK_LEON3_UT699,
6531 CK_LEON3_GR712RC,
6532 CK_LEON4,
6533 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006534 } CPU = CK_GENERIC;
6535
6536 enum CPUGeneration {
6537 CG_V8,
6538 CG_V9,
6539 };
6540
6541 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6542 switch (Kind) {
6543 case CK_GENERIC:
6544 case CK_V8:
6545 case CK_SUPERSPARC:
6546 case CK_SPARCLITE:
6547 case CK_F934:
6548 case CK_HYPERSPARC:
6549 case CK_SPARCLITE86X:
6550 case CK_SPARCLET:
6551 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006552 case CK_MYRIAD2100:
6553 case CK_MYRIAD2150:
6554 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006555 case CK_LEON2:
6556 case CK_LEON2_AT697E:
6557 case CK_LEON2_AT697F:
6558 case CK_LEON3:
6559 case CK_LEON3_UT699:
6560 case CK_LEON3_GR712RC:
6561 case CK_LEON4:
6562 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006563 return CG_V8;
6564 case CK_V9:
6565 case CK_ULTRASPARC:
6566 case CK_ULTRASPARC3:
6567 case CK_NIAGARA:
6568 case CK_NIAGARA2:
6569 case CK_NIAGARA3:
6570 case CK_NIAGARA4:
6571 return CG_V9;
6572 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006573 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006574 }
6575
6576 CPUKind getCPUKind(StringRef Name) const {
6577 return llvm::StringSwitch<CPUKind>(Name)
6578 .Case("v8", CK_V8)
6579 .Case("supersparc", CK_SUPERSPARC)
6580 .Case("sparclite", CK_SPARCLITE)
6581 .Case("f934", CK_F934)
6582 .Case("hypersparc", CK_HYPERSPARC)
6583 .Case("sparclite86x", CK_SPARCLITE86X)
6584 .Case("sparclet", CK_SPARCLET)
6585 .Case("tsc701", CK_TSC701)
6586 .Case("v9", CK_V9)
6587 .Case("ultrasparc", CK_ULTRASPARC)
6588 .Case("ultrasparc3", CK_ULTRASPARC3)
6589 .Case("niagara", CK_NIAGARA)
6590 .Case("niagara2", CK_NIAGARA2)
6591 .Case("niagara3", CK_NIAGARA3)
6592 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006593 .Case("ma2100", CK_MYRIAD2100)
6594 .Case("ma2150", CK_MYRIAD2150)
6595 .Case("ma2450", CK_MYRIAD2450)
6596 // FIXME: the myriad2[.n] spellings are obsolete,
6597 // but a grace period is needed to allow updating dependent builds.
6598 .Case("myriad2", CK_MYRIAD2100)
6599 .Case("myriad2.1", CK_MYRIAD2100)
6600 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006601 .Case("leon2", CK_LEON2)
6602 .Case("at697e", CK_LEON2_AT697E)
6603 .Case("at697f", CK_LEON2_AT697F)
6604 .Case("leon3", CK_LEON3)
6605 .Case("ut699", CK_LEON3_UT699)
6606 .Case("gr712rc", CK_LEON3_GR712RC)
6607 .Case("leon4", CK_LEON4)
6608 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006609 .Default(CK_GENERIC);
6610 }
6611
6612 bool setCPU(const std::string &Name) override {
6613 CPU = getCPUKind(Name);
6614 return CPU != CK_GENERIC;
6615 }
Gabor Greif49991682008-02-21 16:29:08 +00006616};
6617
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006618const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006619 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6620 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6621 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6622 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6623};
6624
Craig Topperf054e3a2015-10-19 03:52:27 +00006625ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6626 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006627}
6628
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006629const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006630 { { "g0" }, "r0" },
6631 { { "g1" }, "r1" },
6632 { { "g2" }, "r2" },
6633 { { "g3" }, "r3" },
6634 { { "g4" }, "r4" },
6635 { { "g5" }, "r5" },
6636 { { "g6" }, "r6" },
6637 { { "g7" }, "r7" },
6638 { { "o0" }, "r8" },
6639 { { "o1" }, "r9" },
6640 { { "o2" }, "r10" },
6641 { { "o3" }, "r11" },
6642 { { "o4" }, "r12" },
6643 { { "o5" }, "r13" },
6644 { { "o6", "sp" }, "r14" },
6645 { { "o7" }, "r15" },
6646 { { "l0" }, "r16" },
6647 { { "l1" }, "r17" },
6648 { { "l2" }, "r18" },
6649 { { "l3" }, "r19" },
6650 { { "l4" }, "r20" },
6651 { { "l5" }, "r21" },
6652 { { "l6" }, "r22" },
6653 { { "l7" }, "r23" },
6654 { { "i0" }, "r24" },
6655 { { "i1" }, "r25" },
6656 { { "i2" }, "r26" },
6657 { { "i3" }, "r27" },
6658 { { "i4" }, "r28" },
6659 { { "i5" }, "r29" },
6660 { { "i6", "fp" }, "r30" },
6661 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006662};
6663
Craig Topperf054e3a2015-10-19 03:52:27 +00006664ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6665 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006666}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006667
6668// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6669class SparcV8TargetInfo : public SparcTargetInfo {
6670public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006671 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6672 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006673 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006674 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6675 switch (getTriple().getOS()) {
6676 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006677 SizeType = UnsignedInt;
6678 IntPtrType = SignedInt;
6679 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006680 break;
6681 case llvm::Triple::NetBSD:
6682 case llvm::Triple::OpenBSD:
6683 SizeType = UnsignedLong;
6684 IntPtrType = SignedLong;
6685 PtrDiffType = SignedLong;
6686 break;
Brad Smith56495d52015-08-13 22:00:53 +00006687 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006688 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006689 }
6690
Craig Topper3164f332014-03-11 03:39:26 +00006691 void getTargetDefines(const LangOptions &Opts,
6692 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006693 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006694 switch (getCPUGeneration(CPU)) {
6695 case CG_V8:
6696 Builder.defineMacro("__sparcv8");
6697 if (getTriple().getOS() != llvm::Triple::Solaris)
6698 Builder.defineMacro("__sparcv8__");
6699 break;
6700 case CG_V9:
6701 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006702 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006703 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006704 Builder.defineMacro("__sparc_v9__");
6705 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006706 break;
6707 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006708 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006709 std::string MyriadArchValue, Myriad2Value;
6710 Builder.defineMacro("__sparc_v8__");
6711 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006712 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006713 case CK_MYRIAD2150:
6714 MyriadArchValue = "__ma2150";
6715 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006716 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006717 case CK_MYRIAD2450:
6718 MyriadArchValue = "__ma2450";
6719 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006720 break;
6721 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006722 MyriadArchValue = "__ma2100";
6723 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006724 break;
6725 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006726 Builder.defineMacro(MyriadArchValue, "1");
6727 Builder.defineMacro(MyriadArchValue+"__", "1");
6728 Builder.defineMacro("__myriad2__", Myriad2Value);
6729 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006730 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006731 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006732
6733 bool hasSjLjLowering() const override {
6734 return true;
6735 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006736};
6737
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006738// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6739class SparcV8elTargetInfo : public SparcV8TargetInfo {
6740 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006741 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6742 : SparcV8TargetInfo(Triple, Opts) {
6743 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006744 }
6745};
6746
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006747// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6748class SparcV9TargetInfo : public SparcTargetInfo {
6749public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006750 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6751 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006752 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006753 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006754 // This is an LP64 platform.
6755 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006756
6757 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006758 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006759 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006760 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006761 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006762 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006763
6764 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6765 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6766 LongDoubleWidth = 128;
6767 LongDoubleAlign = 128;
6768 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006769 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006770 }
6771
Craig Topper3164f332014-03-11 03:39:26 +00006772 void getTargetDefines(const LangOptions &Opts,
6773 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006774 SparcTargetInfo::getTargetDefines(Opts, Builder);
6775 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006776 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006777 // Solaris doesn't need these variants, but the BSDs do.
6778 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006779 Builder.defineMacro("__sparc64__");
6780 Builder.defineMacro("__sparc_v9__");
6781 Builder.defineMacro("__sparcv9__");
6782 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006783 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006784
Craig Topper3164f332014-03-11 03:39:26 +00006785 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006786 if (!SparcTargetInfo::setCPU(Name))
6787 return false;
6788 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006789 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006790};
6791
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006792class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006793 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006794 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006795 std::string CPU;
6796 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006797 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006798
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006799public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006800 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006801 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6802 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006803 IntMaxType = SignedLong;
6804 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006805 TLSSupported = true;
6806 IntWidth = IntAlign = 32;
6807 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6808 PointerWidth = PointerAlign = 64;
6809 LongDoubleWidth = 128;
6810 LongDoubleAlign = 64;
6811 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006812 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006813 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006814 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 +00006815 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6816 }
6817 void getTargetDefines(const LangOptions &Opts,
6818 MacroBuilder &Builder) const override {
6819 Builder.defineMacro("__s390__");
6820 Builder.defineMacro("__s390x__");
6821 Builder.defineMacro("__zarch__");
6822 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006823
6824 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6825 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6826 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6827 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6828
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006829 if (HasTransactionalExecution)
6830 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006831 if (Opts.ZVector)
6832 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006833 }
Craig Topper6c03a542015-10-19 04:51:35 +00006834 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6835 return llvm::makeArrayRef(BuiltinInfo,
6836 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006837 }
6838
Craig Topperf054e3a2015-10-19 03:52:27 +00006839 ArrayRef<const char *> getGCCRegNames() const override;
6840 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006841 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006842 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006843 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006844 bool validateAsmConstraint(const char *&Name,
6845 TargetInfo::ConstraintInfo &info) const override;
6846 const char *getClobbers() const override {
6847 // FIXME: Is this really right?
6848 return "";
6849 }
6850 BuiltinVaListKind getBuiltinVaListKind() const override {
6851 return TargetInfo::SystemZBuiltinVaList;
6852 }
6853 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006854 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006855 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6856 .Case("z10", true)
6857 .Case("z196", true)
6858 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006859 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006860 .Default(false);
6861
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006862 return CPUKnown;
6863 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006864 bool
6865 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6866 StringRef CPU,
6867 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006868 if (CPU == "zEC12")
6869 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006870 if (CPU == "z13") {
6871 Features["transactional-execution"] = true;
6872 Features["vector"] = true;
6873 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006874 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006875 }
6876
6877 bool handleTargetFeatures(std::vector<std::string> &Features,
6878 DiagnosticsEngine &Diags) override {
6879 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006880 for (const auto &Feature : Features) {
6881 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006882 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006883 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006884 HasVector = true;
6885 }
6886 // If we use the vector ABI, vector types are 64-bit aligned.
6887 if (HasVector) {
6888 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006889 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6890 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006891 }
6892 return true;
6893 }
6894
6895 bool hasFeature(StringRef Feature) const override {
6896 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006897 .Case("systemz", true)
6898 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006899 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006900 .Default(false);
6901 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006902
Bryan Chane3f1ed52016-04-28 13:56:43 +00006903 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6904 switch (CC) {
6905 case CC_C:
6906 case CC_Swift:
6907 return CCCR_OK;
6908 default:
6909 return CCCR_Warning;
6910 }
6911 }
6912
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006913 StringRef getABI() const override {
6914 if (HasVector)
6915 return "vector";
6916 return "";
6917 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006918
6919 bool useFloat128ManglingForLongDouble() const override {
6920 return true;
6921 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006922};
6923
6924const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6925#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006926 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006927#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6928 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006929#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006930};
6931
6932const char *const SystemZTargetInfo::GCCRegNames[] = {
6933 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6934 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6935 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6936 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6937};
6938
Craig Topperf054e3a2015-10-19 03:52:27 +00006939ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6940 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006941}
6942
6943bool SystemZTargetInfo::
6944validateAsmConstraint(const char *&Name,
6945 TargetInfo::ConstraintInfo &Info) const {
6946 switch (*Name) {
6947 default:
6948 return false;
6949
6950 case 'a': // Address register
6951 case 'd': // Data register (equivalent to 'r')
6952 case 'f': // Floating-point register
6953 Info.setAllowsRegister();
6954 return true;
6955
6956 case 'I': // Unsigned 8-bit constant
6957 case 'J': // Unsigned 12-bit constant
6958 case 'K': // Signed 16-bit constant
6959 case 'L': // Signed 20-bit displacement (on all targets we support)
6960 case 'M': // 0x7fffffff
6961 return true;
6962
6963 case 'Q': // Memory with base and unsigned 12-bit displacement
6964 case 'R': // Likewise, plus an index
6965 case 'S': // Memory with base and signed 20-bit displacement
6966 case 'T': // Likewise, plus an index
6967 Info.setAllowsMemory();
6968 return true;
6969 }
6970}
Ulrich Weigand47445072013-05-06 16:26:41 +00006971
Eric Christopherc48497a2015-09-18 21:26:24 +00006972class MSP430TargetInfo : public TargetInfo {
6973 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006974
Eric Christopherc48497a2015-09-18 21:26:24 +00006975public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006976 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6977 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006978 TLSSupported = false;
6979 IntWidth = 16;
6980 IntAlign = 16;
6981 LongWidth = 32;
6982 LongLongWidth = 64;
6983 LongAlign = LongLongAlign = 16;
6984 PointerWidth = 16;
6985 PointerAlign = 16;
6986 SuitableAlign = 16;
6987 SizeType = UnsignedInt;
6988 IntMaxType = SignedLongLong;
6989 IntPtrType = SignedInt;
6990 PtrDiffType = SignedInt;
6991 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006992 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006993 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006994 void getTargetDefines(const LangOptions &Opts,
6995 MacroBuilder &Builder) const override {
6996 Builder.defineMacro("MSP430");
6997 Builder.defineMacro("__MSP430__");
6998 // FIXME: defines for different 'flavours' of MCU
6999 }
Craig Topper6c03a542015-10-19 04:51:35 +00007000 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007001 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007002 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007003 }
7004 bool hasFeature(StringRef Feature) const override {
7005 return Feature == "msp430";
7006 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007007 ArrayRef<const char *> getGCCRegNames() const override;
7008 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007009 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007010 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007011 }
7012 bool validateAsmConstraint(const char *&Name,
7013 TargetInfo::ConstraintInfo &info) const override {
7014 // FIXME: implement
7015 switch (*Name) {
7016 case 'K': // the constant 1
7017 case 'L': // constant -1^20 .. 1^19
7018 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007019 return true;
7020 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007021 // No target constraints for now.
7022 return false;
7023 }
7024 const char *getClobbers() const override {
7025 // FIXME: Is this really right?
7026 return "";
7027 }
7028 BuiltinVaListKind getBuiltinVaListKind() const override {
7029 // FIXME: implement
7030 return TargetInfo::CharPtrBuiltinVaList;
7031 }
7032};
7033
7034const char *const MSP430TargetInfo::GCCRegNames[] = {
7035 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7036 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7037
Craig Topperf054e3a2015-10-19 03:52:27 +00007038ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7039 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007040}
7041
7042// LLVM and Clang cannot be used directly to output native binaries for
7043// target, but is used to compile C code to llvm bitcode with correct
7044// type and alignment information.
7045//
7046// TCE uses the llvm bitcode as input and uses it for generating customized
7047// target processor and program binary. TCE co-design environment is
7048// publicly available in http://tce.cs.tut.fi
7049
7050static const unsigned TCEOpenCLAddrSpaceMap[] = {
7051 3, // opencl_global
7052 4, // opencl_local
7053 5, // opencl_constant
7054 // FIXME: generic has to be added to the target
7055 0, // opencl_generic
7056 0, // cuda_device
7057 0, // cuda_constant
7058 0 // cuda_shared
7059};
7060
7061class TCETargetInfo : public TargetInfo {
7062public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007063 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7064 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007065 TLSSupported = false;
7066 IntWidth = 32;
7067 LongWidth = LongLongWidth = 32;
7068 PointerWidth = 32;
7069 IntAlign = 32;
7070 LongAlign = LongLongAlign = 32;
7071 PointerAlign = 32;
7072 SuitableAlign = 32;
7073 SizeType = UnsignedInt;
7074 IntMaxType = SignedLong;
7075 IntPtrType = SignedInt;
7076 PtrDiffType = SignedInt;
7077 FloatWidth = 32;
7078 FloatAlign = 32;
7079 DoubleWidth = 32;
7080 DoubleAlign = 32;
7081 LongDoubleWidth = 32;
7082 LongDoubleAlign = 32;
7083 FloatFormat = &llvm::APFloat::IEEEsingle;
7084 DoubleFormat = &llvm::APFloat::IEEEsingle;
7085 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007086 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7087 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007088 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7089 UseAddrSpaceMapMangling = true;
7090 }
7091
7092 void getTargetDefines(const LangOptions &Opts,
7093 MacroBuilder &Builder) const override {
7094 DefineStd(Builder, "tce", Opts);
7095 Builder.defineMacro("__TCE__");
7096 Builder.defineMacro("__TCE_V1__");
7097 }
7098 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7099
Craig Topper6c03a542015-10-19 04:51:35 +00007100 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007101 const char *getClobbers() const override { return ""; }
7102 BuiltinVaListKind getBuiltinVaListKind() const override {
7103 return TargetInfo::VoidPtrBuiltinVaList;
7104 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007105 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007106 bool validateAsmConstraint(const char *&Name,
7107 TargetInfo::ConstraintInfo &info) const override {
7108 return true;
7109 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007110 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7111 return None;
7112 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007113};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007114
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007115class BPFTargetInfo : public TargetInfo {
7116public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007117 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7118 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007119 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7120 SizeType = UnsignedLong;
7121 PtrDiffType = SignedLong;
7122 IntPtrType = SignedLong;
7123 IntMaxType = SignedLong;
7124 Int64Type = SignedLong;
7125 RegParmMax = 5;
7126 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007127 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007128 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007129 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007130 }
7131 MaxAtomicPromoteWidth = 64;
7132 MaxAtomicInlineWidth = 64;
7133 TLSSupported = false;
7134 }
7135 void getTargetDefines(const LangOptions &Opts,
7136 MacroBuilder &Builder) const override {
7137 DefineStd(Builder, "bpf", Opts);
7138 Builder.defineMacro("__BPF__");
7139 }
7140 bool hasFeature(StringRef Feature) const override {
7141 return Feature == "bpf";
7142 }
7143
Craig Topper6c03a542015-10-19 04:51:35 +00007144 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007145 const char *getClobbers() const override {
7146 return "";
7147 }
7148 BuiltinVaListKind getBuiltinVaListKind() const override {
7149 return TargetInfo::VoidPtrBuiltinVaList;
7150 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007151 ArrayRef<const char *> getGCCRegNames() const override {
7152 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007153 }
7154 bool validateAsmConstraint(const char *&Name,
7155 TargetInfo::ConstraintInfo &info) const override {
7156 return true;
7157 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007158 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7159 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007160 }
7161};
7162
Daniel Sanders4672af62016-05-27 11:51:02 +00007163class MipsTargetInfo : public TargetInfo {
7164 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007165 StringRef Layout;
7166
7167 if (ABI == "o32")
7168 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7169 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007170 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007171 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007172 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007173 else
7174 llvm_unreachable("Invalid ABI");
7175
7176 if (BigEndian)
7177 resetDataLayout(("E-" + Layout).str());
7178 else
7179 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007180 }
7181
Akira Hatanaka9064e362013-10-29 18:30:33 +00007182
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007183 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007184 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007185 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007186 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007187 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007188 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007189 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007190 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007191 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007192 enum DspRevEnum {
7193 NoDSP, DSP1, DSP2
7194 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007195 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007196
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007197protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007198 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007199 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007200
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007201public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007202 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007203 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7204 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7205 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007206 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007207
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007208 setABI((getTriple().getArch() == llvm::Triple::mips ||
7209 getTriple().getArch() == llvm::Triple::mipsel)
7210 ? "o32"
7211 : "n64");
7212
7213 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007214 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007215
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007216 bool isNaN2008Default() const {
7217 return CPU == "mips32r6" || CPU == "mips64r6";
7218 }
7219
7220 bool isFP64Default() const {
7221 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7222 }
7223
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007224 bool isNan2008() const override {
7225 return IsNan2008;
7226 }
7227
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007228 bool processorSupportsGPR64() const {
7229 return llvm::StringSwitch<bool>(CPU)
7230 .Case("mips3", true)
7231 .Case("mips4", true)
7232 .Case("mips5", true)
7233 .Case("mips64", true)
7234 .Case("mips64r2", true)
7235 .Case("mips64r3", true)
7236 .Case("mips64r5", true)
7237 .Case("mips64r6", true)
7238 .Case("octeon", true)
7239 .Default(false);
7240 return false;
7241 }
7242
Alp Toker4925ba72014-06-07 23:30:42 +00007243 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007244 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007245 if (Name == "o32") {
7246 setO32ABITypes();
7247 ABI = Name;
7248 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007249 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007250
7251 if (Name == "n32") {
7252 setN32ABITypes();
7253 ABI = Name;
7254 return true;
7255 }
7256 if (Name == "n64") {
7257 setN64ABITypes();
7258 ABI = Name;
7259 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007260 }
7261 return false;
7262 }
7263
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007264 void setO32ABITypes() {
7265 Int64Type = SignedLongLong;
7266 IntMaxType = Int64Type;
7267 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7268 LongDoubleWidth = LongDoubleAlign = 64;
7269 LongWidth = LongAlign = 32;
7270 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7271 PointerWidth = PointerAlign = 32;
7272 PtrDiffType = SignedInt;
7273 SizeType = UnsignedInt;
7274 SuitableAlign = 64;
7275 }
7276
7277 void setN32N64ABITypes() {
7278 LongDoubleWidth = LongDoubleAlign = 128;
7279 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7280 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7281 LongDoubleWidth = LongDoubleAlign = 64;
7282 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7283 }
7284 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7285 SuitableAlign = 128;
7286 }
7287
Daniel Sanders4672af62016-05-27 11:51:02 +00007288 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007289 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007290 Int64Type = SignedLong;
7291 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007292 LongWidth = LongAlign = 64;
7293 PointerWidth = PointerAlign = 64;
7294 PtrDiffType = SignedLong;
7295 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007296 }
7297
7298 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007299 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007300 Int64Type = SignedLongLong;
7301 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007302 LongWidth = LongAlign = 32;
7303 PointerWidth = PointerAlign = 32;
7304 PtrDiffType = SignedInt;
7305 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007306 }
7307
Craig Topper3164f332014-03-11 03:39:26 +00007308 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007309 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007310 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007311 .Case("mips1", true)
7312 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007313 .Case("mips3", true)
7314 .Case("mips4", true)
7315 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007316 .Case("mips32", true)
7317 .Case("mips32r2", true)
7318 .Case("mips32r3", true)
7319 .Case("mips32r5", true)
7320 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007321 .Case("mips64", true)
7322 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007323 .Case("mips64r3", true)
7324 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007325 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007326 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007327 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007328 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007329 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007330 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007331 bool
7332 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7333 StringRef CPU,
7334 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007335 if (CPU.empty())
7336 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007337 if (CPU == "octeon")
7338 Features["mips64r2"] = Features["cnmips"] = true;
7339 else
7340 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007341 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007342 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007343
Craig Topper3164f332014-03-11 03:39:26 +00007344 void getTargetDefines(const LangOptions &Opts,
7345 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007346 if (BigEndian) {
7347 DefineStd(Builder, "MIPSEB", Opts);
7348 Builder.defineMacro("_MIPSEB");
7349 } else {
7350 DefineStd(Builder, "MIPSEL", Opts);
7351 Builder.defineMacro("_MIPSEL");
7352 }
7353
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007354 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007355 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007356 if (Opts.GNUMode)
7357 Builder.defineMacro("mips");
7358
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007359 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007360 Builder.defineMacro("__mips", "32");
7361 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7362 } else {
7363 Builder.defineMacro("__mips", "64");
7364 Builder.defineMacro("__mips64");
7365 Builder.defineMacro("__mips64__");
7366 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7367 }
7368
7369 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7370 .Cases("mips32", "mips64", "1")
7371 .Cases("mips32r2", "mips64r2", "2")
7372 .Cases("mips32r3", "mips64r3", "3")
7373 .Cases("mips32r5", "mips64r5", "5")
7374 .Cases("mips32r6", "mips64r6", "6")
7375 .Default("");
7376 if (!ISARev.empty())
7377 Builder.defineMacro("__mips_isa_rev", ISARev);
7378
7379 if (ABI == "o32") {
7380 Builder.defineMacro("__mips_o32");
7381 Builder.defineMacro("_ABIO32", "1");
7382 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007383 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007384 Builder.defineMacro("__mips_n32");
7385 Builder.defineMacro("_ABIN32", "2");
7386 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7387 } else if (ABI == "n64") {
7388 Builder.defineMacro("__mips_n64");
7389 Builder.defineMacro("_ABI64", "3");
7390 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7391 } else
7392 llvm_unreachable("Invalid ABI.");
7393
Simon Atanasyan683535b2012-08-29 19:14:58 +00007394 Builder.defineMacro("__REGISTER_PREFIX__", "");
7395
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007396 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007397 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007398 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007399 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007400 case SoftFloat:
7401 Builder.defineMacro("__mips_soft_float", Twine(1));
7402 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007403 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007404
Simon Atanasyan16071912013-04-14 14:07:30 +00007405 if (IsSingleFloat)
7406 Builder.defineMacro("__mips_single_float", Twine(1));
7407
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007408 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7409 Builder.defineMacro("_MIPS_FPSET",
7410 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7411
Simon Atanasyan72244b62012-07-05 16:06:06 +00007412 if (IsMips16)
7413 Builder.defineMacro("__mips16", Twine(1));
7414
Simon Atanasyan60777612013-04-14 14:07:51 +00007415 if (IsMicromips)
7416 Builder.defineMacro("__mips_micromips", Twine(1));
7417
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007418 if (IsNan2008)
7419 Builder.defineMacro("__mips_nan2008", Twine(1));
7420
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007421 switch (DspRev) {
7422 default:
7423 break;
7424 case DSP1:
7425 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7426 Builder.defineMacro("__mips_dsp", Twine(1));
7427 break;
7428 case DSP2:
7429 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7430 Builder.defineMacro("__mips_dspr2", Twine(1));
7431 Builder.defineMacro("__mips_dsp", Twine(1));
7432 break;
7433 }
7434
Jack Carter44ff1e52013-08-12 17:20:29 +00007435 if (HasMSA)
7436 Builder.defineMacro("__mips_msa", Twine(1));
7437
Simon Atanasyan26f19672012-04-05 19:28:31 +00007438 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7439 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7440 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007441
7442 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7443 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007444
7445 // These shouldn't be defined for MIPS-I but there's no need to check
7446 // for that since MIPS-I isn't supported.
7447 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7448 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7449 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007450
7451 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7452 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7453 // the instructions exist but using them violates the ABI since they
7454 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7455 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007456 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007457 }
7458
Craig Topper6c03a542015-10-19 04:51:35 +00007459 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7460 return llvm::makeArrayRef(BuiltinInfo,
7461 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007462 }
Craig Topper3164f332014-03-11 03:39:26 +00007463 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007464 return llvm::StringSwitch<bool>(Feature)
7465 .Case("mips", true)
7466 .Case("fp64", HasFP64)
7467 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007468 }
Craig Topper3164f332014-03-11 03:39:26 +00007469 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007470 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007471 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007472 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007473 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007474 // CPU register names
7475 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007476 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7477 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7478 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007479 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7480 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007481 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7482 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7483 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7484 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007485 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007486 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007487 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7488 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007489 // MSA register names
7490 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7491 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7492 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7493 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7494 // MSA control register names
7495 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7496 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007497 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007498 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007499 }
Craig Topper3164f332014-03-11 03:39:26 +00007500 bool validateAsmConstraint(const char *&Name,
7501 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007502 switch (*Name) {
7503 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007504 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007505 case 'r': // CPU registers.
7506 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007507 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007508 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007509 case 'c': // $25 for indirect jumps
7510 case 'l': // lo register
7511 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007512 Info.setAllowsRegister();
7513 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007514 case 'I': // Signed 16-bit constant
7515 case 'J': // Integer 0
7516 case 'K': // Unsigned 16-bit constant
7517 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7518 case 'M': // Constants not loadable via lui, addiu, or ori
7519 case 'N': // Constant -1 to -65535
7520 case 'O': // A signed 15-bit constant
7521 case 'P': // A constant between 1 go 65535
7522 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007523 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007524 Info.setAllowsMemory();
7525 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007526 case 'Z':
7527 if (Name[1] == 'C') { // An address usable by ll, and sc.
7528 Info.setAllowsMemory();
7529 Name++; // Skip over 'Z'.
7530 return true;
7531 }
7532 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007533 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007534 }
7535
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007536 std::string convertConstraint(const char *&Constraint) const override {
7537 std::string R;
7538 switch (*Constraint) {
7539 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7540 if (Constraint[1] == 'C') {
7541 R = std::string("^") + std::string(Constraint, 2);
7542 Constraint++;
7543 return R;
7544 }
7545 break;
7546 }
7547 return TargetInfo::convertConstraint(Constraint);
7548 }
7549
Craig Topper3164f332014-03-11 03:39:26 +00007550 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007551 // In GCC, $1 is not widely used in generated code (it's used only in a few
7552 // specific situations), so there is no real need for users to add it to
7553 // the clobbers list if they want to use it in their inline assembly code.
7554 //
7555 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7556 // code generation, so using it in inline assembly without adding it to the
7557 // clobbers list can cause conflicts between the inline assembly code and
7558 // the surrounding generated code.
7559 //
7560 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7561 // operands, which will conflict with the ".set at" assembler option (which
7562 // we use only for inline assembly, in order to maintain compatibility with
7563 // GCC) and will also conflict with the user's usage of $1.
7564 //
7565 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7566 // register for generated code is to automatically clobber $1 for all inline
7567 // assembly code.
7568 //
7569 // FIXME: We should automatically clobber $1 only for inline assembly code
7570 // which actually uses it. This would allow LLVM to use $1 for inline
7571 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007572 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007573 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007574
Craig Topper3164f332014-03-11 03:39:26 +00007575 bool handleTargetFeatures(std::vector<std::string> &Features,
7576 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007577 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007578 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007579 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007580 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007581 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007582 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007583 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007584
Eric Christopher610fe112015-08-26 08:21:55 +00007585 for (const auto &Feature : Features) {
7586 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007587 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007588 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007589 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007590 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007591 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007592 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007593 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007594 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007595 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007596 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007597 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007598 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007599 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007600 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007601 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007602 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007603 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007604 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007605 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007606 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007607 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007608 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007609
James Y Knightb214cbc2016-03-04 19:00:41 +00007610 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007611
Rafael Espindolaeb265472013-08-21 21:59:03 +00007612 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007613 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007614
Craig Topper3164f332014-03-11 03:39:26 +00007615 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007616 if (RegNo == 0) return 4;
7617 if (RegNo == 1) return 5;
7618 return -1;
7619 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007620
7621 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007622
7623 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7624 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7625 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7626 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7627 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7628 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7629 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7630 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7631 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7632 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7633 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7634 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7635 {{"ra"}, "$31"}};
7636 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7637 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7638 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7639 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7640 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7641 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7642 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7643 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7644 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7645 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7646 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7647 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007648 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007649 return llvm::makeArrayRef(O32RegAliases);
7650 return llvm::makeArrayRef(NewABIRegAliases);
7651 }
7652
7653 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007654 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007655 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007656
7657 bool validateTarget(DiagnosticsEngine &Diags) const override {
7658 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7659 // this yet. It's better to fail here than on the backend assertion.
7660 if (processorSupportsGPR64() && ABI == "o32") {
7661 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7662 return false;
7663 }
7664
7665 // 64-bit ABI's require 64-bit CPU's.
7666 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7667 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7668 return false;
7669 }
7670
7671 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7672 // can't handle this yet. It's better to fail here than on the
7673 // backend assertion.
7674 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7675 getTriple().getArch() == llvm::Triple::mips64el) &&
7676 ABI == "o32") {
7677 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7678 << ABI << getTriple().str();
7679 return false;
7680 }
7681
7682 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7683 // can't handle this yet. It's better to fail here than on the
7684 // backend assertion.
7685 if ((getTriple().getArch() == llvm::Triple::mips ||
7686 getTriple().getArch() == llvm::Triple::mipsel) &&
7687 (ABI == "n32" || ABI == "n64")) {
7688 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7689 << ABI << getTriple().str();
7690 return false;
7691 }
7692
7693 return true;
7694 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007695};
7696
Daniel Sanders4672af62016-05-27 11:51:02 +00007697const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007698#define BUILTIN(ID, TYPE, ATTRS) \
7699 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7700#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7701 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007702#include "clang/Basic/BuiltinsMips.def"
7703};
7704
Ivan Krasindd7403e2011-08-24 20:22:22 +00007705class PNaClTargetInfo : public TargetInfo {
7706public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007707 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7708 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007709 this->LongAlign = 32;
7710 this->LongWidth = 32;
7711 this->PointerAlign = 32;
7712 this->PointerWidth = 32;
7713 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007714 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007715 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007716 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007717 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007718 this->SizeType = TargetInfo::UnsignedInt;
7719 this->PtrDiffType = TargetInfo::SignedInt;
7720 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007721 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007722 }
7723
Craig Toppere6f17d02014-03-11 04:07:52 +00007724 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007725 Builder.defineMacro("__le32__");
7726 Builder.defineMacro("__pnacl__");
7727 }
Craig Topper3164f332014-03-11 03:39:26 +00007728 void getTargetDefines(const LangOptions &Opts,
7729 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007730 getArchDefines(Opts, Builder);
7731 }
Craig Topper3164f332014-03-11 03:39:26 +00007732 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007733 return Feature == "pnacl";
7734 }
Craig Topper6c03a542015-10-19 04:51:35 +00007735 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007736 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007737 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007738 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007739 ArrayRef<const char *> getGCCRegNames() const override;
7740 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007741 bool validateAsmConstraint(const char *&Name,
7742 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007743 return false;
7744 }
7745
Craig Topper3164f332014-03-11 03:39:26 +00007746 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007747 return "";
7748 }
7749};
7750
Craig Topperf054e3a2015-10-19 03:52:27 +00007751ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7752 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007753}
7754
Craig Topperf054e3a2015-10-19 03:52:27 +00007755ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7756 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007757}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007758
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007759// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007760class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007761public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007762 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7763 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007764
7765 BuiltinVaListKind getBuiltinVaListKind() const override {
7766 return TargetInfo::PNaClABIBuiltinVaList;
7767 }
7768};
7769
JF Bastien643817d2014-09-12 17:52:47 +00007770class Le64TargetInfo : public TargetInfo {
7771 static const Builtin::Info BuiltinInfo[];
7772
7773public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007774 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7775 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007776 NoAsmVariants = true;
7777 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7778 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007779 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007780 }
7781
7782 void getTargetDefines(const LangOptions &Opts,
7783 MacroBuilder &Builder) const override {
7784 DefineStd(Builder, "unix", Opts);
7785 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7786 Builder.defineMacro("__ELF__");
7787 }
Craig Topper6c03a542015-10-19 04:51:35 +00007788 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7789 return llvm::makeArrayRef(BuiltinInfo,
7790 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007791 }
7792 BuiltinVaListKind getBuiltinVaListKind() const override {
7793 return TargetInfo::PNaClABIBuiltinVaList;
7794 }
7795 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007796 ArrayRef<const char *> getGCCRegNames() const override {
7797 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007798 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007799 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7800 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007801 }
7802 bool validateAsmConstraint(const char *&Name,
7803 TargetInfo::ConstraintInfo &Info) const override {
7804 return false;
7805 }
7806
7807 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007808};
Dan Gohmanc2853072015-09-03 22:51:53 +00007809
7810class WebAssemblyTargetInfo : public TargetInfo {
7811 static const Builtin::Info BuiltinInfo[];
7812
7813 enum SIMDEnum {
7814 NoSIMD,
7815 SIMD128,
7816 } SIMDLevel;
7817
7818public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007819 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007820 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007821 NoAsmVariants = true;
7822 SuitableAlign = 128;
7823 LargeArrayMinWidth = 128;
7824 LargeArrayAlign = 128;
7825 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007826 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007827 LongDoubleWidth = LongDoubleAlign = 128;
7828 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007829 SizeType = UnsignedInt;
7830 PtrDiffType = SignedInt;
7831 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007832 }
7833
7834protected:
7835 void getTargetDefines(const LangOptions &Opts,
7836 MacroBuilder &Builder) const override {
7837 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7838 if (SIMDLevel >= SIMD128)
7839 Builder.defineMacro("__wasm_simd128__");
7840 }
7841
7842private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007843 bool
7844 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7845 StringRef CPU,
7846 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007847 if (CPU == "bleeding-edge")
7848 Features["simd128"] = true;
7849 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7850 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007851 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007852 return llvm::StringSwitch<bool>(Feature)
7853 .Case("simd128", SIMDLevel >= SIMD128)
7854 .Default(false);
7855 }
7856 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007857 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007858 for (const auto &Feature : Features) {
7859 if (Feature == "+simd128") {
7860 SIMDLevel = std::max(SIMDLevel, SIMD128);
7861 continue;
7862 }
7863 if (Feature == "-simd128") {
7864 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7865 continue;
7866 }
7867
7868 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7869 << "-target-feature";
7870 return false;
7871 }
7872 return true;
7873 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007874 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007875 return llvm::StringSwitch<bool>(Name)
7876 .Case("mvp", true)
7877 .Case("bleeding-edge", true)
7878 .Case("generic", true)
7879 .Default(false);
7880 }
Craig Topper6c03a542015-10-19 04:51:35 +00007881 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7882 return llvm::makeArrayRef(BuiltinInfo,
7883 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007884 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007885 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007886 return VoidPtrBuiltinVaList;
7887 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007888 ArrayRef<const char *> getGCCRegNames() const final {
7889 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007890 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007891 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7892 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007893 }
7894 bool
7895 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007896 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007897 return false;
7898 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007899 const char *getClobbers() const final { return ""; }
7900 bool isCLZForZeroUndef() const final { return false; }
7901 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007902 IntType getIntTypeByWidth(unsigned BitWidth,
7903 bool IsSigned) const final {
7904 // WebAssembly prefers long long for explicitly 64-bit integers.
7905 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7906 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7907 }
7908 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7909 bool IsSigned) const final {
7910 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7911 return BitWidth == 64
7912 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7913 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7914 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007915};
7916
7917const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7918#define BUILTIN(ID, TYPE, ATTRS) \
7919 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7920#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7921 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7922#include "clang/Basic/BuiltinsWebAssembly.def"
7923};
7924
7925class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7926public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007927 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7928 const TargetOptions &Opts)
7929 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007930 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007931 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007932 }
7933
7934protected:
7935 void getTargetDefines(const LangOptions &Opts,
7936 MacroBuilder &Builder) const override {
7937 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7938 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7939 }
7940};
7941
7942class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7943public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007944 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7945 const TargetOptions &Opts)
7946 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007947 LongAlign = LongWidth = 64;
7948 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007949 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007950 SizeType = UnsignedLong;
7951 PtrDiffType = SignedLong;
7952 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007953 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007954 }
7955
7956protected:
7957 void getTargetDefines(const LangOptions &Opts,
7958 MacroBuilder &Builder) const override {
7959 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7960 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7961 }
7962};
7963
JF Bastien643817d2014-09-12 17:52:47 +00007964const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7965#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007966 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007967#include "clang/Basic/BuiltinsLe64.def"
7968};
7969
Eric Christopherc48497a2015-09-18 21:26:24 +00007970static const unsigned SPIRAddrSpaceMap[] = {
7971 1, // opencl_global
7972 3, // opencl_local
7973 2, // opencl_constant
7974 4, // opencl_generic
7975 0, // cuda_device
7976 0, // cuda_constant
7977 0 // cuda_shared
7978};
7979class SPIRTargetInfo : public TargetInfo {
7980public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007981 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7982 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007983 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7984 "SPIR target must use unknown OS");
7985 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7986 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00007987 TLSSupported = false;
7988 LongWidth = LongAlign = 64;
7989 AddrSpaceMap = &SPIRAddrSpaceMap;
7990 UseAddrSpaceMapMangling = true;
7991 // Define available target features
7992 // These must be defined in sorted order!
7993 NoAsmVariants = true;
7994 }
7995 void getTargetDefines(const LangOptions &Opts,
7996 MacroBuilder &Builder) const override {
7997 DefineStd(Builder, "SPIR", Opts);
7998 }
7999 bool hasFeature(StringRef Feature) const override {
8000 return Feature == "spir";
8001 }
Craig Topper3164f332014-03-11 03:39:26 +00008002
Craig Topper6c03a542015-10-19 04:51:35 +00008003 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008004 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008005 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008006 bool validateAsmConstraint(const char *&Name,
8007 TargetInfo::ConstraintInfo &info) const override {
8008 return true;
8009 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008010 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8011 return None;
8012 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008013 BuiltinVaListKind getBuiltinVaListKind() const override {
8014 return TargetInfo::VoidPtrBuiltinVaList;
8015 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008016
Eric Christopherc48497a2015-09-18 21:26:24 +00008017 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008018 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8019 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008020 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008021
Eric Christopherc48497a2015-09-18 21:26:24 +00008022 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8023 return CC_SpirFunction;
8024 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008025
8026 void setSupportedOpenCLOpts() override {
8027 // Assume all OpenCL extensions and optional core features are supported
8028 // for SPIR since it is a generic target.
8029 getSupportedOpenCLOpts().setAll();
8030 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008031};
Guy Benyeib798fc92012-12-11 21:38:14 +00008032
Eric Christopherc48497a2015-09-18 21:26:24 +00008033class SPIR32TargetInfo : public SPIRTargetInfo {
8034public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008035 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8036 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008037 PointerWidth = PointerAlign = 32;
8038 SizeType = TargetInfo::UnsignedInt;
8039 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008040 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8041 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008042 }
8043 void getTargetDefines(const LangOptions &Opts,
8044 MacroBuilder &Builder) const override {
8045 DefineStd(Builder, "SPIR32", Opts);
8046 }
8047};
Guy Benyeib798fc92012-12-11 21:38:14 +00008048
Eric Christopherc48497a2015-09-18 21:26:24 +00008049class SPIR64TargetInfo : public SPIRTargetInfo {
8050public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008051 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8052 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008053 PointerWidth = PointerAlign = 64;
8054 SizeType = TargetInfo::UnsignedLong;
8055 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008056 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8057 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008058 }
8059 void getTargetDefines(const LangOptions &Opts,
8060 MacroBuilder &Builder) const override {
8061 DefineStd(Builder, "SPIR64", Opts);
8062 }
8063};
Guy Benyeib798fc92012-12-11 21:38:14 +00008064
Robert Lytton0e076492013-08-13 09:43:10 +00008065class XCoreTargetInfo : public TargetInfo {
8066 static const Builtin::Info BuiltinInfo[];
8067public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008068 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8069 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008070 NoAsmVariants = true;
8071 LongLongAlign = 32;
8072 SuitableAlign = 32;
8073 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008074 SizeType = UnsignedInt;
8075 PtrDiffType = SignedInt;
8076 IntPtrType = SignedInt;
8077 WCharType = UnsignedChar;
8078 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008079 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008080 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8081 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008082 }
Craig Topper3164f332014-03-11 03:39:26 +00008083 void getTargetDefines(const LangOptions &Opts,
8084 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008085 Builder.defineMacro("__XS1B__");
8086 }
Craig Topper6c03a542015-10-19 04:51:35 +00008087 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8088 return llvm::makeArrayRef(BuiltinInfo,
8089 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008090 }
Craig Topper3164f332014-03-11 03:39:26 +00008091 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008092 return TargetInfo::VoidPtrBuiltinVaList;
8093 }
Craig Topper3164f332014-03-11 03:39:26 +00008094 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008095 return "";
8096 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008097 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008098 static const char * const GCCRegNames[] = {
8099 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8100 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8101 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008102 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008103 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008104 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8105 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008106 }
Craig Topper3164f332014-03-11 03:39:26 +00008107 bool validateAsmConstraint(const char *&Name,
8108 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008109 return false;
8110 }
Craig Topper3164f332014-03-11 03:39:26 +00008111 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008112 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8113 return (RegNo < 2)? RegNo : -1;
8114 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008115 bool allowsLargerPreferedTypeAlignment() const override {
8116 return false;
8117 }
Robert Lytton0e076492013-08-13 09:43:10 +00008118};
8119
8120const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008121#define BUILTIN(ID, TYPE, ATTRS) \
8122 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8123#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8124 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008125#include "clang/Basic/BuiltinsXCore.def"
8126};
Robert Lytton0e076492013-08-13 09:43:10 +00008127
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008128// x86_32 Android target
8129class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8130public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008131 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8132 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008133 SuitableAlign = 32;
8134 LongDoubleWidth = 64;
8135 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8136 }
8137};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008138
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008139// x86_64 Android target
8140class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8141public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008142 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8143 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008144 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8145 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008146
8147 bool useFloat128ManglingForLongDouble() const override {
8148 return true;
8149 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008150};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008151
8152// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8153class RenderScript32TargetInfo : public ARMleTargetInfo {
8154public:
8155 RenderScript32TargetInfo(const llvm::Triple &Triple,
8156 const TargetOptions &Opts)
8157 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8158 Triple.getOSName(),
8159 Triple.getEnvironmentName()),
8160 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008161 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008162 LongWidth = LongAlign = 64;
8163 }
8164 void getTargetDefines(const LangOptions &Opts,
8165 MacroBuilder &Builder) const override {
8166 Builder.defineMacro("__RENDERSCRIPT__");
8167 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8168 }
8169};
8170
8171// 64-bit RenderScript is aarch64
8172class RenderScript64TargetInfo : public AArch64leTargetInfo {
8173public:
8174 RenderScript64TargetInfo(const llvm::Triple &Triple,
8175 const TargetOptions &Opts)
8176 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8177 Triple.getOSName(),
8178 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008179 Opts) {
8180 IsRenderScriptTarget = true;
8181 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008182
8183 void getTargetDefines(const LangOptions &Opts,
8184 MacroBuilder &Builder) const override {
8185 Builder.defineMacro("__RENDERSCRIPT__");
8186 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8187 }
8188};
8189
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008190} // end anonymous namespace
8191
Chris Lattner5ba61f02006-10-14 07:39:34 +00008192//===----------------------------------------------------------------------===//
8193// Driver code
8194//===----------------------------------------------------------------------===//
8195
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008196static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8197 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008198 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008199
Daniel Dunbar52322032009-08-18 05:47:58 +00008200 switch (Triple.getArch()) {
8201 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008202 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008203
Tim Northover2a0783d2014-05-30 14:14:07 +00008204 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008205 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008206
8207 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008208 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008209
Jacques Pienaard964cc22016-03-28 21:02:54 +00008210 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008211 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008212
Tim Northover2a0783d2014-05-30 14:14:07 +00008213 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008214 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008215 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008216
8217 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008218 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008219 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008220 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008221 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008222 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008224 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008226 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008227 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008228 }
8229
Christian Pirker9b019ae2014-02-25 13:51:00 +00008230 case llvm::Triple::aarch64_be:
8231 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008232 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008233 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008234 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008236 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008238 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008239 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008240 }
8241
Daniel Dunbar52322032009-08-18 05:47:58 +00008242 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008243 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008244 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008245 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008246
Daniel Dunbar52322032009-08-18 05:47:58 +00008247 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008248 case llvm::Triple::CloudABI:
8249 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008250 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008251 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008252 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008253 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008254 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008256 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008257 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008258 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008260 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008262 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008264 case llvm::Triple::Win32:
8265 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008266 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008267 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008268 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008269 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008270 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008271 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008272 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008273 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008274 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008275 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008276 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008277 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008278 }
8279
8280 case llvm::Triple::armeb:
8281 case llvm::Triple::thumbeb:
8282 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008283 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008284
8285 switch (os) {
8286 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008287 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008288 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008289 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008290 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008291 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008292 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008293 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008294 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008295 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008296 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008297 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008298 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008299 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008300 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008302 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008303
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008304 case llvm::Triple::bpfeb:
8305 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008306 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008307
Daniel Dunbar52322032009-08-18 05:47:58 +00008308 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008309 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008310
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008311 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008312 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008313 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008314 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008315 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008316 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008317 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008318 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008319 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008320 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008321 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008322 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008323 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008324
8325 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008326 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008327 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008328 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008329 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008330 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008331 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008332 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008333 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008334 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008335 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008336 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008337 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008338 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008339 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008340
Akira Hatanakabef17452011-09-20 19:21:49 +00008341 case llvm::Triple::mips64:
8342 switch (os) {
8343 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008344 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008345 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008346 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008347 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008348 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008349 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008350 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008351 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008352 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008353 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008354 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008355 }
8356
8357 case llvm::Triple::mips64el:
8358 switch (os) {
8359 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008360 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008361 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008362 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008363 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008364 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008365 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008366 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008367 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008368 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008369 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008370 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008371 }
8372
Ivan Krasindd7403e2011-08-24 20:22:22 +00008373 case llvm::Triple::le32:
8374 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008375 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008376 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008377 default:
8378 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008379 }
8380
JF Bastien643817d2014-09-12 17:52:47 +00008381 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008383
Daniel Dunbar52322032009-08-18 05:47:58 +00008384 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008385 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008386 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008387 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008388 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008389 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008390 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008391 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008392 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008394 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008395 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008396 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008397 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008398 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008399 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008400 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008401
8402 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008403 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008404 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008405 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008406 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008407 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008408 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008409 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008410 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008411 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008412 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008413 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008414 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008415 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008416 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008417
Bill Schmidt778d3872013-07-26 01:36:11 +00008418 case llvm::Triple::ppc64le:
8419 switch (os) {
8420 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008421 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008422 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008423 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008424 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008425 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008426 }
8427
Peter Collingbournec947aae2012-05-20 23:28:41 +00008428 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008430 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008431 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008432
Tom Stellardd8e38a32015-01-06 20:34:47 +00008433 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008434 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008436
Daniel Dunbar52322032009-08-18 05:47:58 +00008437 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008438 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008439 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008440 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008441 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008442 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008443 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008444 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008445 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008446 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008447 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008448 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008449 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008450 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008451 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008452
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008453 // The 'sparcel' architecture copies all the above cases except for Solaris.
8454 case llvm::Triple::sparcel:
8455 switch (os) {
8456 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008457 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008458 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008459 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008460 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008461 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008462 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008464 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008466 }
8467
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008468 case llvm::Triple::sparcv9:
8469 switch (os) {
8470 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008471 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008472 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008473 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008474 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008475 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008476 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008477 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008478 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008479 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008480 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008481 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008482 }
8483
Ulrich Weigand47445072013-05-06 16:26:41 +00008484 case llvm::Triple::systemz:
8485 switch (os) {
8486 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008487 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008488 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008489 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008490 }
8491
Eli Friedmana9c3d712009-08-19 20:47:07 +00008492 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008493 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008494
Daniel Dunbar52322032009-08-18 05:47:58 +00008495 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008496 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008497 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008498
Daniel Dunbar52322032009-08-18 05:47:58 +00008499 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008500 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008501 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008502 case llvm::Triple::Linux: {
8503 switch (Triple.getEnvironment()) {
8504 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008505 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008506 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008507 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008508 }
8509 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008510 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008511 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008512 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008513 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008514 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008515 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008516 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008517 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008518 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008520 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008521 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008522 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008523 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008524 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008525 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008526 case llvm::Triple::Win32: {
8527 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008528 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008529 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008530 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008531 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008532 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008533 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008534 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008535 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008536 }
8537 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008538 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008539 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008540 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008541 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008542 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008543 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008544 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008545 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008546 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008547 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008548 }
8549
8550 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008551 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008552 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008553
Daniel Dunbar52322032009-08-18 05:47:58 +00008554 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008555 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008556 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008557 case llvm::Triple::Linux: {
8558 switch (Triple.getEnvironment()) {
8559 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008560 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008561 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008562 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008563 }
8564 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008565 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008566 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008567 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008568 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008569 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008570 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008571 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008572 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008573 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008574 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008575 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008576 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008577 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008578 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008579 case llvm::Triple::Win32: {
8580 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008581 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008582 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008583 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008584 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008585 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008586 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008587 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008588 }
8589 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008590 case llvm::Triple::Haiku:
8591 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008592 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008593 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008594 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008595 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008596 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008597 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008598 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008599
Douglas Katzman78d7c542015-05-12 21:18:10 +00008600 case llvm::Triple::spir: {
8601 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8602 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8603 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008604 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008605 }
8606 case llvm::Triple::spir64: {
8607 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8608 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8609 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008610 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008611 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008612 case llvm::Triple::wasm32:
8613 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8614 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008615 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008616 case llvm::Triple::wasm64:
8617 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8618 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008619 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008620
8621 case llvm::Triple::renderscript32:
8622 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8623 case llvm::Triple::renderscript64:
8624 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008625 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008626}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008627
8628/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008629/// options.
Alp Toker80758082014-07-06 05:26:44 +00008630TargetInfo *
8631TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008632 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008633 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008634
8635 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008636 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008637 if (!Target) {
8638 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008639 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008640 }
Alp Toker80758082014-07-06 05:26:44 +00008641 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008642
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008643 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008644 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8645 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008646 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008647 }
8648
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008649 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008650 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8651 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008652 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008653 }
8654
Rafael Espindolaeb265472013-08-21 21:59:03 +00008655 // Set the fp math unit.
8656 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8657 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008658 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008659 }
8660
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008661 // Compute the default target features, we need the target to handle this
8662 // because features may have dependencies on one another.
8663 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008664 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8665 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008666 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008667
8668 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008669 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008670 for (const auto &F : Features)
8671 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8672
Eric Christopher3ff21b32013-10-16 21:26:26 +00008673 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008674 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008675
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008676 Target->setSupportedOpenCLOpts();
8677
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008678 if (!Target->validateTarget(Diags))
8679 return nullptr;
8680
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008681 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008682}