blob: 909c7dd00ac520e065200dd5c04464ace87ff2ec [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"
Eli Friedman7cef49e2008-05-20 14:27:34 +000024#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000025#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000026#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000027#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000028#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000029#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000030#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000031#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000032#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000033#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000034#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000035
Chris Lattner5ba61f02006-10-14 07:39:34 +000036using namespace clang;
37
Chris Lattner5ba61f02006-10-14 07:39:34 +000038//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000039// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000040//===----------------------------------------------------------------------===//
41
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042/// DefineStd - Define a macro name and standard variants. For example if
43/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
44/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000045static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 const LangOptions &Opts) {
47 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000048
Chris Lattner1e1c0b92009-03-20 16:06:38 +000049 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
50 // in the user's namespace.
51 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000052 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000056
Chris Lattner1e1c0b92009-03-20 16:06:38 +000057 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000058 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000059}
60
Benjamin Kramere3b442d2012-01-10 11:50:09 +000061static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
62 bool Tuning = true) {
63 Builder.defineMacro("__" + CPUName);
64 Builder.defineMacro("__" + CPUName + "__");
65 if (Tuning)
66 Builder.defineMacro("__tune_" + CPUName + "__");
67}
68
Justin Lebar76945b22016-04-29 23:05:19 +000069static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
70 const TargetOptions &Opts);
71
Chris Lattner09d98f52008-10-05 21:50:58 +000072//===----------------------------------------------------------------------===//
73// Defines specific to certain operating systems.
74//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000075
Torok Edwinb2b37c62009-06-30 17:10:35 +000076namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000077template<typename TgtInfo>
78class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000079protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000080 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000081 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000082public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000083 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
84 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000085 void getTargetDefines(const LangOptions &Opts,
86 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000087 TgtInfo::getTargetDefines(Opts, Builder);
88 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000089 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000090
91};
Chris Lattner30ba6742009-08-10 19:03:04 +000092
Eric Christopher7d0c7252015-09-24 21:17:04 +000093// CloudABI Target
94template <typename Target>
95class CloudABITargetInfo : public OSTargetInfo<Target> {
96protected:
97 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
98 MacroBuilder &Builder) const override {
99 Builder.defineMacro("__CloudABI__");
100 Builder.defineMacro("__ELF__");
101
102 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
103 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
104 Builder.defineMacro("__STDC_UTF_16__");
105 Builder.defineMacro("__STDC_UTF_32__");
106 }
107
108public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000109 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
110 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000111};
112
Daniel Dunbard86666f2010-01-26 01:44:04 +0000113static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000114 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000115 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000116 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000117 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000120 // AddressSanitizer doesn't play well with source fortification, which is on
121 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000122 if (Opts.Sanitize.has(SanitizerKind::Address))
123 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000124
John McCall460ce582015-10-22 18:38:17 +0000125 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
126 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000127 // __weak is always defined, for use in blocks and with objc pointers.
128 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000129 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000130 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000131 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000132
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000133 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000134 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000135 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000136 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000137
138 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000139 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000140
Daniel Dunbarecf13562011-04-19 21:40:34 +0000141 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000142 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000143 if (Triple.isMacOSX()) {
144 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000145 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000146 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000147 Triple.getOSVersion(Maj, Min, Rev);
148 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000149 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000150
Sebastian Pop422377c2012-01-20 22:01:23 +0000151 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000152 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000153 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
154 if (PlatformName == "win32") {
155 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
156 return;
157 }
158
Evan Cheng31dd9a62014-01-26 23:12:43 +0000159 // Set the appropriate OS version define.
160 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000161 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
162 char Str[7];
163 if (Maj < 10) {
164 Str[0] = '0' + Maj;
165 Str[1] = '0' + (Min / 10);
166 Str[2] = '0' + (Min % 10);
167 Str[3] = '0' + (Rev / 10);
168 Str[4] = '0' + (Rev % 10);
169 Str[5] = '\0';
170 } else {
171 // Handle versions >= 10.
172 Str[0] = '0' + (Maj / 10);
173 Str[1] = '0' + (Maj % 10);
174 Str[2] = '0' + (Min / 10);
175 Str[3] = '0' + (Min % 10);
176 Str[4] = '0' + (Rev / 10);
177 Str[5] = '0' + (Rev % 10);
178 Str[6] = '\0';
179 }
Tim Northover67465f82015-10-30 16:30:30 +0000180 if (Triple.isTvOS())
181 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
182 else
183 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
184 Str);
185
186 } else if (Triple.isWatchOS()) {
187 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
188 char Str[6];
189 Str[0] = '0' + Maj;
190 Str[1] = '0' + (Min / 10);
191 Str[2] = '0' + (Min % 10);
192 Str[3] = '0' + (Rev / 10);
193 Str[4] = '0' + (Rev % 10);
194 Str[5] = '\0';
195 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000196 } else if (Triple.isMacOSX()) {
197 // Note that the Driver allows versions which aren't representable in the
198 // define (because we only get a single digit for the minor and micro
199 // revision numbers). So, we limit them to the maximum representable
200 // version.
201 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000202 char Str[7];
203 if (Maj < 10 || (Maj == 10 && Min < 10)) {
204 Str[0] = '0' + (Maj / 10);
205 Str[1] = '0' + (Maj % 10);
206 Str[2] = '0' + std::min(Min, 9U);
207 Str[3] = '0' + std::min(Rev, 9U);
208 Str[4] = '\0';
209 } else {
210 // Handle versions > 10.9.
211 Str[0] = '0' + (Maj / 10);
212 Str[1] = '0' + (Maj % 10);
213 Str[2] = '0' + (Min / 10);
214 Str[3] = '0' + (Min % 10);
215 Str[4] = '0' + (Rev / 10);
216 Str[5] = '0' + (Rev % 10);
217 Str[6] = '\0';
218 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000219 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000220 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000221
Tim Northover157d9112014-01-16 08:48:16 +0000222 // Tell users about the kernel if there is one.
223 if (Triple.isOSDarwin())
224 Builder.defineMacro("__MACH__");
225
Chris Bieneman46977b62016-04-29 17:53:00 +0000226 // The Watch ABI uses Dwarf EH.
227 if(Triple.isWatchABI())
228 Builder.defineMacro("__ARM_DWARF_EH__");
229
Daniel Dunbarecf13562011-04-19 21:40:34 +0000230 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000231}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000232
Torok Edwinb2b37c62009-06-30 17:10:35 +0000233template<typename Target>
234class DarwinTargetInfo : public OSTargetInfo<Target> {
235protected:
Craig Topper3164f332014-03-11 03:39:26 +0000236 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
237 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000238 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000239 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000240 }
Mike Stump11289f42009-09-09 15:08:12 +0000241
Torok Edwinb2b37c62009-06-30 17:10:35 +0000242public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000243 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
244 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000245 // By default, no TLS, and we whitelist permitted architecture/OS
246 // combinations.
247 this->TLSSupported = false;
248
249 if (Triple.isMacOSX())
250 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
251 else if (Triple.isiOS()) {
252 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
253 if (Triple.getArch() == llvm::Triple::x86_64 ||
254 Triple.getArch() == llvm::Triple::aarch64)
255 this->TLSSupported = !Triple.isOSVersionLT(8);
256 else if (Triple.getArch() == llvm::Triple::x86 ||
257 Triple.getArch() == llvm::Triple::arm ||
258 Triple.getArch() == llvm::Triple::thumb)
259 this->TLSSupported = !Triple.isOSVersionLT(9);
260 } else if (Triple.isWatchOS())
261 this->TLSSupported = !Triple.isOSVersionLT(2);
262
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000263 this->MCountName = "\01mcount";
264 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000265
Craig Topper3164f332014-03-11 03:39:26 +0000266 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000267 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000268 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000269 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000270 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000271 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000272 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000273 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000274
Craig Topper3164f332014-03-11 03:39:26 +0000275 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000276 // FIXME: We should return 0 when building kexts.
277 return "__TEXT,__StaticInit,regular,pure_instructions";
278 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000279
John McCalleed64c72012-01-29 01:20:30 +0000280 /// Darwin does not support protected visibility. Darwin's "default"
281 /// is very similar to ELF's "protected"; Darwin requires a "weak"
282 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000283 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000284 return false;
285 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000286
287 unsigned getExnObjectAlignment() const override {
288 // The alignment of an exception object is 8-bytes for darwin since
289 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
290 // and therefore doesn't guarantee 16-byte alignment.
291 return 64;
292 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000293};
294
Chris Lattner30ba6742009-08-10 19:03:04 +0000295
Torok Edwinb2b37c62009-06-30 17:10:35 +0000296// DragonFlyBSD Target
297template<typename Target>
298class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
299protected:
Craig Topper3164f332014-03-11 03:39:26 +0000300 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
301 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000302 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000303 Builder.defineMacro("__DragonFly__");
304 Builder.defineMacro("__DragonFly_cc_version", "100001");
305 Builder.defineMacro("__ELF__");
306 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
307 Builder.defineMacro("__tune_i386__");
308 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000309 }
310public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000311 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
312 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000313 switch (Triple.getArch()) {
314 default:
315 case llvm::Triple::x86:
316 case llvm::Triple::x86_64:
317 this->MCountName = ".mcount";
318 break;
319 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000320 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000321};
322
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000323#ifndef FREEBSD_CC_VERSION
324#define FREEBSD_CC_VERSION 0U
325#endif
326
Torok Edwinb2b37c62009-06-30 17:10:35 +0000327// FreeBSD Target
328template<typename Target>
329class FreeBSDTargetInfo : public OSTargetInfo<Target> {
330protected:
Craig Topper3164f332014-03-11 03:39:26 +0000331 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
332 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000333 // FreeBSD defines; list based off of gcc output
334
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000335 unsigned Release = Triple.getOSMajorVersion();
336 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000337 Release = 8U;
338 unsigned CCVersion = FREEBSD_CC_VERSION;
339 if (CCVersion == 0U)
340 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000341
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000342 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000343 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000344 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
345 DefineStd(Builder, "unix", Opts);
346 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000347
348 // On FreeBSD, wchar_t contains the number of the code point as
349 // used by the character set of the locale. These character sets are
350 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000351 //
352 // FIXME: This is wrong; the macro refers to the numerical values
353 // of wchar_t *literals*, which are not locale-dependent. However,
354 // FreeBSD systems apparently depend on us getting this wrong, and
355 // setting this to 1 is conforming even if all the basic source
356 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000357 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000358 }
359public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000360 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
361 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000362 switch (Triple.getArch()) {
363 default:
364 case llvm::Triple::x86:
365 case llvm::Triple::x86_64:
366 this->MCountName = ".mcount";
367 break;
368 case llvm::Triple::mips:
369 case llvm::Triple::mipsel:
370 case llvm::Triple::ppc:
371 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000372 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000373 this->MCountName = "_mcount";
374 break;
375 case llvm::Triple::arm:
376 this->MCountName = "__mcount";
377 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000378 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000379 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000380};
381
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000382// GNU/kFreeBSD Target
383template<typename Target>
384class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
385protected:
Craig Topper3164f332014-03-11 03:39:26 +0000386 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
387 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000388 // GNU/kFreeBSD defines; list based off of gcc output
389
390 DefineStd(Builder, "unix", Opts);
391 Builder.defineMacro("__FreeBSD_kernel__");
392 Builder.defineMacro("__GLIBC__");
393 Builder.defineMacro("__ELF__");
394 if (Opts.POSIXThreads)
395 Builder.defineMacro("_REENTRANT");
396 if (Opts.CPlusPlus)
397 Builder.defineMacro("_GNU_SOURCE");
398 }
399public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000400 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
401 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000402};
403
Reid Kleckner330fb172016-05-11 16:19:05 +0000404// Haiku Target
405template<typename Target>
406class HaikuTargetInfo : public OSTargetInfo<Target> {
407protected:
408 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
409 MacroBuilder &Builder) const override {
410 // Haiku defines; list based off of gcc output
411 Builder.defineMacro("__HAIKU__");
412 Builder.defineMacro("__ELF__");
413 DefineStd(Builder, "unix", Opts);
414 }
415public:
416 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
417 : OSTargetInfo<Target>(Triple, Opts) {
418 this->SizeType = TargetInfo::UnsignedLong;
419 this->IntPtrType = TargetInfo::SignedLong;
420 this->PtrDiffType = TargetInfo::SignedLong;
421 this->ProcessIDType = TargetInfo::SignedLong;
422 this->TLSSupported = false;
423
424 }
425};
426
Chris Lattner3e2ee142010-07-07 16:01:42 +0000427// Minix Target
428template<typename Target>
429class MinixTargetInfo : public OSTargetInfo<Target> {
430protected:
Craig Topper3164f332014-03-11 03:39:26 +0000431 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
432 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000433 // Minix defines
434
435 Builder.defineMacro("__minix", "3");
436 Builder.defineMacro("_EM_WSIZE", "4");
437 Builder.defineMacro("_EM_PSIZE", "4");
438 Builder.defineMacro("_EM_SSIZE", "2");
439 Builder.defineMacro("_EM_LSIZE", "4");
440 Builder.defineMacro("_EM_FSIZE", "4");
441 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000442 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000443 DefineStd(Builder, "unix", Opts);
444 }
445public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000446 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
447 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000448};
449
Torok Edwinb2b37c62009-06-30 17:10:35 +0000450// Linux target
451template<typename Target>
452class LinuxTargetInfo : public OSTargetInfo<Target> {
453protected:
Craig Topper3164f332014-03-11 03:39:26 +0000454 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
455 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000456 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000457 DefineStd(Builder, "unix", Opts);
458 DefineStd(Builder, "linux", Opts);
459 Builder.defineMacro("__gnu_linux__");
460 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000461 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000462 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000463 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000464 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000465 this->PlatformName = "android";
466 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
467 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000468 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000469 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000470 if (Opts.CPlusPlus)
471 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000472 if (this->HasFloat128)
473 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000474 }
475public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000476 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
477 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000478 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000479
480 switch (Triple.getArch()) {
481 default:
482 break;
483 case llvm::Triple::ppc:
484 case llvm::Triple::ppc64:
485 case llvm::Triple::ppc64le:
486 this->MCountName = "_mcount";
487 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000488 case llvm::Triple::x86:
489 case llvm::Triple::x86_64:
490 case llvm::Triple::systemz:
491 this->HasFloat128 = true;
492 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000493 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000494 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000495
Craig Topper3164f332014-03-11 03:39:26 +0000496 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000497 return ".text.startup";
498 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000499};
500
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000501// NetBSD Target
502template<typename Target>
503class NetBSDTargetInfo : public OSTargetInfo<Target> {
504protected:
Craig Topper3164f332014-03-11 03:39:26 +0000505 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
506 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000507 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000508 Builder.defineMacro("__NetBSD__");
509 Builder.defineMacro("__unix__");
510 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000511 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000512 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000513
514 switch (Triple.getArch()) {
515 default:
516 break;
517 case llvm::Triple::arm:
518 case llvm::Triple::armeb:
519 case llvm::Triple::thumb:
520 case llvm::Triple::thumbeb:
521 Builder.defineMacro("__ARM_DWARF_EH__");
522 break;
523 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000524 }
525public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000526 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
527 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000528 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000529 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000530};
531
Torok Edwinb2b37c62009-06-30 17:10:35 +0000532// OpenBSD Target
533template<typename Target>
534class OpenBSDTargetInfo : public OSTargetInfo<Target> {
535protected:
Craig Topper3164f332014-03-11 03:39:26 +0000536 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
537 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000538 // OpenBSD defines; list based off of gcc output
539
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000540 Builder.defineMacro("__OpenBSD__");
541 DefineStd(Builder, "unix", Opts);
542 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000543 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000544 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000545 }
546public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000547 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
548 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000549 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000550
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551 switch (Triple.getArch()) {
552 default:
553 case llvm::Triple::x86:
554 case llvm::Triple::x86_64:
555 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000556 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000557 this->MCountName = "__mcount";
558 break;
559 case llvm::Triple::mips64:
560 case llvm::Triple::mips64el:
561 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000562 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000563 this->MCountName = "_mcount";
564 break;
565 }
566 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000567};
568
Eli Friedman9fa28852012-08-08 23:57:20 +0000569// Bitrig Target
570template<typename Target>
571class BitrigTargetInfo : public OSTargetInfo<Target> {
572protected:
Craig Topper3164f332014-03-11 03:39:26 +0000573 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
574 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000575 // Bitrig defines; list based off of gcc output
576
577 Builder.defineMacro("__Bitrig__");
578 DefineStd(Builder, "unix", Opts);
579 Builder.defineMacro("__ELF__");
580 if (Opts.POSIXThreads)
581 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000582
583 switch (Triple.getArch()) {
584 default:
585 break;
586 case llvm::Triple::arm:
587 case llvm::Triple::armeb:
588 case llvm::Triple::thumb:
589 case llvm::Triple::thumbeb:
590 Builder.defineMacro("__ARM_DWARF_EH__");
591 break;
592 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000593 }
594public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000595 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
596 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000597 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000598 }
599};
600
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000601// PSP Target
602template<typename Target>
603class PSPTargetInfo : public OSTargetInfo<Target> {
604protected:
Craig Topper3164f332014-03-11 03:39:26 +0000605 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
606 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000607 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000608 Builder.defineMacro("PSP");
609 Builder.defineMacro("_PSP");
610 Builder.defineMacro("__psp__");
611 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000612 }
613public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000614 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000615};
616
John Thompsone467e192009-11-19 17:18:50 +0000617// PS3 PPU Target
618template<typename Target>
619class PS3PPUTargetInfo : public OSTargetInfo<Target> {
620protected:
Craig Topper3164f332014-03-11 03:39:26 +0000621 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
622 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000623 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000624 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000625 Builder.defineMacro("__PPU__");
626 Builder.defineMacro("__CELLOS_LV2__");
627 Builder.defineMacro("__ELF__");
628 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000629 Builder.defineMacro("_ARCH_PPC64");
630 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000631 }
632public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000633 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
634 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000635 this->LongWidth = this->LongAlign = 32;
636 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000637 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000639 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000640 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000641 }
642};
643
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000644template <typename Target>
645class PS4OSTargetInfo : public OSTargetInfo<Target> {
646protected:
647 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
648 MacroBuilder &Builder) const override {
649 Builder.defineMacro("__FreeBSD__", "9");
650 Builder.defineMacro("__FreeBSD_cc_version", "900001");
651 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
652 DefineStd(Builder, "unix", Opts);
653 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000654 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000655 }
656public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000657 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
658 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000659 this->WCharType = this->UnsignedShort;
660
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000661 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
662 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000663
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000664 // On PS4, do not honor explicit bit field alignment,
665 // as in "__attribute__((aligned(2))) int b : 1;".
666 this->UseExplicitBitFieldAlignment = false;
667
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000668 switch (Triple.getArch()) {
669 default:
670 case llvm::Triple::x86_64:
671 this->MCountName = ".mcount";
672 break;
673 }
674 }
675};
676
Torok Edwinb2b37c62009-06-30 17:10:35 +0000677// Solaris target
678template<typename Target>
679class SolarisTargetInfo : public OSTargetInfo<Target> {
680protected:
Craig Topper3164f332014-03-11 03:39:26 +0000681 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
682 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000683 DefineStd(Builder, "sun", Opts);
684 DefineStd(Builder, "unix", Opts);
685 Builder.defineMacro("__ELF__");
686 Builder.defineMacro("__svr4__");
687 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000688 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
689 // newer, but to 500 for everything else. feature_test.h has a check to
690 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000691 // with a new version.
692 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000693 Builder.defineMacro("_XOPEN_SOURCE", "600");
694 else
695 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000696 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000697 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000698 Builder.defineMacro("_LARGEFILE_SOURCE");
699 Builder.defineMacro("_LARGEFILE64_SOURCE");
700 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000701 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000702 }
703public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000704 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
705 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000706 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000707 // FIXME: WIntType should be SignedLong
708 }
709};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000710
711// Windows target
712template<typename Target>
713class WindowsTargetInfo : public OSTargetInfo<Target> {
714protected:
Craig Topper3164f332014-03-11 03:39:26 +0000715 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
716 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000717 Builder.defineMacro("_WIN32");
718 }
719 void getVisualStudioDefines(const LangOptions &Opts,
720 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000721 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000722 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000723 Builder.defineMacro("_CPPRTTI");
724
Reid Kleckner16514352015-01-30 21:42:55 +0000725 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000726 Builder.defineMacro("_CPPUNWIND");
727 }
728
David Majnemer6a658902015-07-22 22:36:26 +0000729 if (Opts.Bool)
730 Builder.defineMacro("__BOOL_DEFINED");
731
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000732 if (!Opts.CharIsSigned)
733 Builder.defineMacro("_CHAR_UNSIGNED");
734
735 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
736 // but it works for now.
737 if (Opts.POSIXThreads)
738 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000739
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000740 if (Opts.MSCompatibilityVersion) {
741 Builder.defineMacro("_MSC_VER",
742 Twine(Opts.MSCompatibilityVersion / 100000));
743 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000744 // FIXME We cannot encode the revision information into 32-bits
745 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000746
David Majnemerb710a932015-05-11 03:57:49 +0000747 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000748 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000749
750 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
751 if (Opts.CPlusPlus1z)
752 Builder.defineMacro("_MSVC_LANG", "201403L");
753 else if (Opts.CPlusPlus14)
754 Builder.defineMacro("_MSVC_LANG", "201402L");
755 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000756 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000757
758 if (Opts.MicrosoftExt) {
759 Builder.defineMacro("_MSC_EXTENSIONS");
760
761 if (Opts.CPlusPlus11) {
762 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
763 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
764 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
765 }
766 }
767
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000768 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 }
770
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000771public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000772 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
773 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000774};
775
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000776template <typename Target>
777class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000778protected:
Craig Topper3164f332014-03-11 03:39:26 +0000779 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
780 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000781 if (Opts.POSIXThreads)
782 Builder.defineMacro("_REENTRANT");
783 if (Opts.CPlusPlus)
784 Builder.defineMacro("_GNU_SOURCE");
785
786 DefineStd(Builder, "unix", Opts);
787 Builder.defineMacro("__ELF__");
788 Builder.defineMacro("__native_client__");
789 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000790
791public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000792 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
793 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000794 this->LongAlign = 32;
795 this->LongWidth = 32;
796 this->PointerAlign = 32;
797 this->PointerWidth = 32;
798 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000799 this->Int64Type = TargetInfo::SignedLongLong;
800 this->DoubleAlign = 64;
801 this->LongDoubleWidth = 64;
802 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000803 this->LongLongWidth = 64;
804 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000805 this->SizeType = TargetInfo::UnsignedInt;
806 this->PtrDiffType = TargetInfo::SignedInt;
807 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000808 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000809 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000810 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000811 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000812 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000813 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000814 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000815 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000816 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000817 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000818 } else {
819 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000820 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000821 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000822 }
823};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000824
Dan Gohmanc2853072015-09-03 22:51:53 +0000825// WebAssembly target
826template <typename Target>
827class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
828 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000829 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000830 // A common platform macro.
831 if (Opts.POSIXThreads)
832 Builder.defineMacro("_REENTRANT");
833 // Follow g++ convention and predefine _GNU_SOURCE for C++.
834 if (Opts.CPlusPlus)
835 Builder.defineMacro("_GNU_SOURCE");
836 }
837
838 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000839 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000840 return ".text.__startup";
841 }
842
843public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000844 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
845 const TargetOptions &Opts)
846 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000847 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000848 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
849 }
850};
Dan Gohmanc2853072015-09-03 22:51:53 +0000851
Chris Lattner09d98f52008-10-05 21:50:58 +0000852//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000853// Specific target implementations.
854//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000855
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000856// PPC abstract base class
857class PPCTargetInfo : public TargetInfo {
858 static const Builtin::Info BuiltinInfo[];
859 static const char * const GCCRegNames[];
860 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000861 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000862
863 // Target cpu features.
864 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000865 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000866 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000867 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000868 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000869 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000870 bool HasBPERMD;
871 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000872
Ulrich Weigand8afad612014-07-28 13:17:52 +0000873protected:
874 std::string ABI;
875
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000876public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000877 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000878 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
879 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000880 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000881 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
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 BigEndian = false;
1715 TLSSupported = false;
1716 LongWidth = LongAlign = 64;
1717 AddrSpaceMap = &NVPTXAddrSpaceMap;
1718 UseAddrSpaceMapMangling = true;
1719 // Define available target features
1720 // These must be defined in sorted order!
1721 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001722 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001723
1724 // If possible, get a TargetInfo for our host triple, so we can match its
1725 // types.
1726 llvm::Triple HostTriple(Opts.HostTriple);
1727 if (HostTriple.isNVPTX())
1728 return;
1729 std::unique_ptr<TargetInfo> HostTarget(
1730 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1731 if (!HostTarget) {
1732 return;
1733 }
1734
1735 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1736 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1737 BoolWidth = HostTarget->getBoolWidth();
1738 BoolAlign = HostTarget->getBoolAlign();
1739 IntWidth = HostTarget->getIntWidth();
1740 IntAlign = HostTarget->getIntAlign();
1741 HalfWidth = HostTarget->getHalfWidth();
1742 HalfAlign = HostTarget->getHalfAlign();
1743 FloatWidth = HostTarget->getFloatWidth();
1744 FloatAlign = HostTarget->getFloatAlign();
1745 DoubleWidth = HostTarget->getDoubleWidth();
1746 DoubleAlign = HostTarget->getDoubleAlign();
1747 LongWidth = HostTarget->getLongWidth();
1748 LongAlign = HostTarget->getLongAlign();
1749 LongLongWidth = HostTarget->getLongLongWidth();
1750 LongLongAlign = HostTarget->getLongLongAlign();
1751 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1752 DefaultAlignForAttributeAligned =
1753 HostTarget->getDefaultAlignForAttributeAligned();
1754 SizeType = HostTarget->getSizeType();
1755 IntMaxType = HostTarget->getIntMaxType();
1756 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1757 IntPtrType = HostTarget->getIntPtrType();
1758 WCharType = HostTarget->getWCharType();
1759 WIntType = HostTarget->getWIntType();
1760 Char16Type = HostTarget->getChar16Type();
1761 Char32Type = HostTarget->getChar32Type();
1762 Int64Type = HostTarget->getInt64Type();
1763 SigAtomicType = HostTarget->getSigAtomicType();
1764 ProcessIDType = HostTarget->getProcessIDType();
1765
1766 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1767 UseZeroLengthBitfieldAlignment =
1768 HostTarget->useZeroLengthBitfieldAlignment();
1769 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1770 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1771
1772 // Properties intentionally not copied from host:
1773 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1774 // host/device boundary.
1775 // - SuitableAlign: Not visible across the host/device boundary, and may
1776 // correctly be different on host/device, e.g. if host has wider vector
1777 // types than device.
1778 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1779 // as its double type, but that's not necessarily true on the host.
1780 // TODO: nvcc emits a warning when using long double on device; we should
1781 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001782 }
1783 void getTargetDefines(const LangOptions &Opts,
1784 MacroBuilder &Builder) const override {
1785 Builder.defineMacro("__PTX__");
1786 Builder.defineMacro("__NVPTX__");
1787 if (Opts.CUDAIsDevice) {
1788 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001789 std::string CUDAArchCode = [this] {
1790 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001791 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001792 assert(false && "No GPU arch when compiling CUDA device code.");
1793 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001794 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001795 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001796 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001797 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001798 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001799 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001800 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001801 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001802 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001803 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001804 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001805 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001806 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001807 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001808 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001809 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001810 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001811 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001812 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001813 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001814 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001815 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001816 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001817 return "620";
1818 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001819 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001820 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001821 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001822 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001823 }
Craig Topper6c03a542015-10-19 04:51:35 +00001824 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1825 return llvm::makeArrayRef(BuiltinInfo,
1826 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001827 }
1828 bool hasFeature(StringRef Feature) const override {
1829 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001830 }
1831
Craig Topperf054e3a2015-10-19 03:52:27 +00001832 ArrayRef<const char *> getGCCRegNames() const override;
1833 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001834 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001835 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001836 }
1837 bool validateAsmConstraint(const char *&Name,
1838 TargetInfo::ConstraintInfo &Info) const override {
1839 switch (*Name) {
1840 default:
1841 return false;
1842 case 'c':
1843 case 'h':
1844 case 'r':
1845 case 'l':
1846 case 'f':
1847 case 'd':
1848 Info.setAllowsRegister();
1849 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001850 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001851 }
1852 const char *getClobbers() const override {
1853 // FIXME: Is this really right?
1854 return "";
1855 }
1856 BuiltinVaListKind getBuiltinVaListKind() const override {
1857 // FIXME: implement
1858 return TargetInfo::CharPtrBuiltinVaList;
1859 }
1860 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001861 GPU = StringToCudaArch(Name);
1862 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001863 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001864 void setSupportedOpenCLOpts() override {
1865 auto &Opts = getSupportedOpenCLOpts();
1866 Opts.cl_clang_storage_class_specifiers = 1;
1867 Opts.cl_khr_gl_sharing = 1;
1868 Opts.cl_khr_icd = 1;
1869
1870 Opts.cl_khr_fp64 = 1;
1871 Opts.cl_khr_byte_addressable_store = 1;
1872 Opts.cl_khr_global_int32_base_atomics = 1;
1873 Opts.cl_khr_global_int32_extended_atomics = 1;
1874 Opts.cl_khr_local_int32_base_atomics = 1;
1875 Opts.cl_khr_local_int32_extended_atomics = 1;
1876 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001877};
1878
1879const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1880#define BUILTIN(ID, TYPE, ATTRS) \
1881 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1882#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1883 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1884#include "clang/Basic/BuiltinsNVPTX.def"
1885};
1886
1887const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1888
Craig Topperf054e3a2015-10-19 03:52:27 +00001889ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1890 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001891}
1892
1893class NVPTX32TargetInfo : public NVPTXTargetInfo {
1894public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001895 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1896 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001897 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001898 PointerWidth = PointerAlign = 32;
1899 SizeType = TargetInfo::UnsignedInt;
1900 PtrDiffType = TargetInfo::SignedInt;
1901 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001902 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001903 }
1904};
1905
1906class NVPTX64TargetInfo : public NVPTXTargetInfo {
1907public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001908 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1909 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001910 PointerWidth = PointerAlign = 64;
1911 SizeType = TargetInfo::UnsignedLong;
1912 PtrDiffType = TargetInfo::SignedLong;
1913 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001914 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001915 }
1916};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001917
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001918static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001919 1, // opencl_global
1920 3, // opencl_local
1921 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001922 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001923 1, // cuda_device
1924 2, // cuda_constant
1925 3 // cuda_shared
1926};
1927
Tom Stellarda96344b2014-08-21 13:58:40 +00001928// If you edit the description strings, make sure you update
1929// getPointerWidthV().
1930
Craig Topper273dbc62015-10-18 05:29:26 +00001931static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001932 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1933 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001934
Craig Topper273dbc62015-10-18 05:29:26 +00001935static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001936 "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 +00001937 "-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
Matt Arsenault250024f2016-06-08 01:56:42 +00001940class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001941 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001942 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001943
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001944 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001945 enum GPUKind {
1946 GK_NONE,
1947 GK_R600,
1948 GK_R600_DOUBLE_OPS,
1949 GK_R700,
1950 GK_R700_DOUBLE_OPS,
1951 GK_EVERGREEN,
1952 GK_EVERGREEN_DOUBLE_OPS,
1953 GK_NORTHERN_ISLANDS,
1954 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001955 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001956 GK_SEA_ISLANDS,
1957 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001958 } GPU;
1959
Jan Veselyeebeaea2015-05-04 19:53:36 +00001960 bool hasFP64:1;
1961 bool hasFMAF:1;
1962 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001963
Matt Arsenault250024f2016-06-08 01:56:42 +00001964 static bool isAMDGCN(const llvm::Triple &TT) {
1965 return TT.getArch() == llvm::Triple::amdgcn;
1966 }
1967
Eli Friedmand13b41e2012-10-12 23:32:00 +00001968public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001969 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Matt Arsenault250024f2016-06-08 01:56:42 +00001970 : TargetInfo(Triple) ,
1971 GPU(isAMDGCN(Triple) ? GK_SOUTHERN_ISLANDS : GK_R600),
1972 hasFP64(false),
1973 hasFMAF(false),
1974 hasLDEXPF(false) {
1975 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001976 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001977 hasFMAF = true;
1978 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001979 }
Matt Arsenault250024f2016-06-08 01:56:42 +00001980
1981 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1982 DataLayoutStringSI : DataLayoutStringR600);
1983
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001984 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001985 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001986 }
1987
Tom Stellarda96344b2014-08-21 13:58:40 +00001988 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1989 if (GPU <= GK_CAYMAN)
1990 return 32;
1991
1992 switch(AddrSpace) {
1993 default:
1994 return 64;
1995 case 0:
1996 case 3:
1997 case 5:
1998 return 32;
1999 }
2000 }
2001
Craig Topper3164f332014-03-11 03:39:26 +00002002 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002003 return "";
2004 }
2005
Craig Topperf054e3a2015-10-19 03:52:27 +00002006 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002007
Craig Topperf054e3a2015-10-19 03:52:27 +00002008 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2009 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002010 }
2011
Craig Topper3164f332014-03-11 03:39:26 +00002012 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002013 TargetInfo::ConstraintInfo &Info) const override {
2014 switch (*Name) {
2015 default: break;
2016 case 'v': // vgpr
2017 case 's': // sgpr
2018 Info.setAllowsRegister();
2019 return true;
2020 }
2021 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002022 }
2023
Matt Arsenault250024f2016-06-08 01:56:42 +00002024 bool initFeatureMap(llvm::StringMap<bool> &Features,
2025 DiagnosticsEngine &Diags, StringRef CPU,
2026 const std::vector<std::string> &FeatureVec) const override;
2027
Craig Topper6c03a542015-10-19 04:51:35 +00002028 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2029 return llvm::makeArrayRef(BuiltinInfo,
2030 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002031 }
2032
Craig Topper3164f332014-03-11 03:39:26 +00002033 void getTargetDefines(const LangOptions &Opts,
2034 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002035 if (getTriple().getArch() == llvm::Triple::amdgcn)
2036 Builder.defineMacro("__AMDGCN__");
2037 else
2038 Builder.defineMacro("__R600__");
2039
Jan Veselyeebeaea2015-05-04 19:53:36 +00002040 if (hasFMAF)
2041 Builder.defineMacro("__HAS_FMAF__");
2042 if (hasLDEXPF)
2043 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002044 if (hasFP64)
2045 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002046 }
2047
Craig Topper3164f332014-03-11 03:39:26 +00002048 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002049 return TargetInfo::CharPtrBuiltinVaList;
2050 }
2051
Matt Arsenault250024f2016-06-08 01:56:42 +00002052 static GPUKind parseR600Name(StringRef Name) {
2053 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002054 .Case("r600" , GK_R600)
2055 .Case("rv610", GK_R600)
2056 .Case("rv620", GK_R600)
2057 .Case("rv630", GK_R600)
2058 .Case("rv635", GK_R600)
2059 .Case("rs780", GK_R600)
2060 .Case("rs880", GK_R600)
2061 .Case("rv670", GK_R600_DOUBLE_OPS)
2062 .Case("rv710", GK_R700)
2063 .Case("rv730", GK_R700)
2064 .Case("rv740", GK_R700_DOUBLE_OPS)
2065 .Case("rv770", GK_R700_DOUBLE_OPS)
2066 .Case("palm", GK_EVERGREEN)
2067 .Case("cedar", GK_EVERGREEN)
2068 .Case("sumo", GK_EVERGREEN)
2069 .Case("sumo2", GK_EVERGREEN)
2070 .Case("redwood", GK_EVERGREEN)
2071 .Case("juniper", GK_EVERGREEN)
2072 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2073 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2074 .Case("barts", GK_NORTHERN_ISLANDS)
2075 .Case("turks", GK_NORTHERN_ISLANDS)
2076 .Case("caicos", GK_NORTHERN_ISLANDS)
2077 .Case("cayman", GK_CAYMAN)
2078 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002079 .Default(GK_NONE);
2080 }
2081
2082 static GPUKind parseAMDGCNName(StringRef Name) {
2083 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellard785699322013-04-01 20:56:49 +00002084 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002085 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2086 .Case("verde", GK_SOUTHERN_ISLANDS)
2087 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002088 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002089 .Case("bonaire", GK_SEA_ISLANDS)
2090 .Case("kabini", GK_SEA_ISLANDS)
2091 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002092 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002093 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002094 .Case("tonga", GK_VOLCANIC_ISLANDS)
2095 .Case("iceland", GK_VOLCANIC_ISLANDS)
2096 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002097 .Case("fiji", GK_VOLCANIC_ISLANDS)
2098 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002099 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002100 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002101
Matt Arsenault250024f2016-06-08 01:56:42 +00002102 bool setCPU(const std::string &Name) override {
2103 if (getTriple().getArch() == llvm::Triple::amdgcn)
2104 GPU = parseAMDGCNName(Name);
2105 else
2106 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002107
Matt Arsenault250024f2016-06-08 01:56:42 +00002108 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002109 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002110
Jan Vesely211ba782016-06-17 02:25:03 +00002111 void setSupportedOpenCLOpts() override {
2112 auto &Opts = getSupportedOpenCLOpts();
2113 Opts.cl_clang_storage_class_specifiers = 1;
2114 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002115
Jan Vesely211ba782016-06-17 02:25:03 +00002116 if (hasFP64)
2117 Opts.cl_khr_fp64 = 1;
2118 if (GPU >= GK_EVERGREEN) {
2119 Opts.cl_khr_byte_addressable_store = 1;
2120 Opts.cl_khr_global_int32_base_atomics = 1;
2121 Opts.cl_khr_global_int32_extended_atomics = 1;
2122 Opts.cl_khr_local_int32_base_atomics = 1;
2123 Opts.cl_khr_local_int32_extended_atomics = 1;
2124 }
2125 if (GPU >= GK_SOUTHERN_ISLANDS) {
2126 Opts.cl_khr_fp16 = 1;
2127 Opts.cl_khr_int64_base_atomics = 1;
2128 Opts.cl_khr_int64_extended_atomics = 1;
2129 Opts.cl_khr_3d_image_writes = 1;
2130 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002131 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002132
2133 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2134 switch (CC) {
2135 default:
2136 return CCCR_Warning;
2137 case CC_C:
2138 case CC_OpenCLKernel:
2139 return CCCR_OK;
2140 }
2141 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002142};
2143
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002144const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002145#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002146 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002147#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2148 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002149#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002150};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002151const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002152 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2153 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2154 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2155 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2156 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2157 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2158 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2159 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2160 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2161 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2162 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2163 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2164 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2165 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2166 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2167 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2168 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2169 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2170 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2171 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2172 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2173 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2174 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2175 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2176 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2177 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2178 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2179 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2180 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2181 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2182 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2183 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2184 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2185 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2186 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2187 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2188 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2189 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2190 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2191 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2192 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2193 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2194 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2195 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2196 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2197 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2198 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002199 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002200 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2201 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002202};
2203
Craig Topperf054e3a2015-10-19 03:52:27 +00002204ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2205 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002206}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002207
Matt Arsenault250024f2016-06-08 01:56:42 +00002208bool AMDGPUTargetInfo::initFeatureMap(
2209 llvm::StringMap<bool> &Features,
2210 DiagnosticsEngine &Diags, StringRef CPU,
2211 const std::vector<std::string> &FeatureVec) const {
2212
2213 // XXX - What does the member GPU mean if device name string passed here?
2214 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2215 if (CPU.empty())
2216 CPU = "tahiti";
2217
2218 switch (parseAMDGCNName(CPU)) {
2219 case GK_SOUTHERN_ISLANDS:
2220 case GK_SEA_ISLANDS:
2221 break;
2222
2223 case GK_VOLCANIC_ISLANDS:
2224 Features["s-memrealtime"] = true;
2225 Features["16-bit-insts"] = true;
2226 break;
2227
2228 case GK_NONE:
2229 return false;
2230 default:
2231 llvm_unreachable("unhandled subtarget");
2232 }
2233 } else {
2234 if (CPU.empty())
2235 CPU = "r600";
2236
2237 switch (parseR600Name(CPU)) {
2238 case GK_R600:
2239 case GK_R700:
2240 case GK_EVERGREEN:
2241 case GK_NORTHERN_ISLANDS:
2242 break;
2243 case GK_R600_DOUBLE_OPS:
2244 case GK_R700_DOUBLE_OPS:
2245 case GK_EVERGREEN_DOUBLE_OPS:
2246 case GK_CAYMAN:
2247 Features["fp64"] = true;
2248 break;
2249 case GK_NONE:
2250 return false;
2251 default:
2252 llvm_unreachable("unhandled subtarget");
2253 }
2254 }
2255
2256 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2257}
2258
Eli Friedman3fd920a2008-08-20 02:34:37 +00002259// Namespace for x86 abstract base class
2260const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002261#define BUILTIN(ID, TYPE, ATTRS) \
2262 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002263#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002264 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002265#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002266 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002267#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002268};
Eli Friedmanb5366062008-05-20 14:21:01 +00002269
Nuno Lopescfca1f02009-12-23 17:49:57 +00002270static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002271 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2272 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002273 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002274 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2275 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2276 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002277 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002278 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2279 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002280 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2281 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2282 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2283 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2284 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2285 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2286 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2287 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002288};
2289
Eric Christophercdd36352011-06-21 00:05:20 +00002290const TargetInfo::AddlRegName AddlRegNames[] = {
2291 { { "al", "ah", "eax", "rax" }, 0 },
2292 { { "bl", "bh", "ebx", "rbx" }, 3 },
2293 { { "cl", "ch", "ecx", "rcx" }, 2 },
2294 { { "dl", "dh", "edx", "rdx" }, 1 },
2295 { { "esi", "rsi" }, 4 },
2296 { { "edi", "rdi" }, 5 },
2297 { { "esp", "rsp" }, 7 },
2298 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002299 { { "r8d", "r8w", "r8b" }, 38 },
2300 { { "r9d", "r9w", "r9b" }, 39 },
2301 { { "r10d", "r10w", "r10b" }, 40 },
2302 { { "r11d", "r11w", "r11b" }, 41 },
2303 { { "r12d", "r12w", "r12b" }, 42 },
2304 { { "r13d", "r13w", "r13b" }, 43 },
2305 { { "r14d", "r14w", "r14b" }, 44 },
2306 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002307};
2308
2309// X86 target abstract base class; x86-32 and x86-64 are very close, so
2310// most of the implementation can be shared.
2311class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002312 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002313 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002314 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002315 enum MMX3DNowEnum {
2316 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002317 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002318 enum XOPEnum {
2319 NoXOP,
2320 SSE4A,
2321 FMA4,
2322 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002323 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002324
Craig Topper543f3bd2015-10-14 23:47:57 +00002325 bool HasAES = false;
2326 bool HasPCLMUL = false;
2327 bool HasLZCNT = false;
2328 bool HasRDRND = false;
2329 bool HasFSGSBASE = false;
2330 bool HasBMI = false;
2331 bool HasBMI2 = false;
2332 bool HasPOPCNT = false;
2333 bool HasRTM = false;
2334 bool HasPRFCHW = false;
2335 bool HasRDSEED = false;
2336 bool HasADX = false;
2337 bool HasTBM = false;
2338 bool HasFMA = false;
2339 bool HasF16C = false;
2340 bool HasAVX512CD = false;
2341 bool HasAVX512ER = false;
2342 bool HasAVX512PF = false;
2343 bool HasAVX512DQ = false;
2344 bool HasAVX512BW = false;
2345 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002346 bool HasAVX512VBMI = false;
2347 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002348 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002349 bool HasMPX = false;
2350 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002351 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002352 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002353 bool HasXSAVE = false;
2354 bool HasXSAVEOPT = false;
2355 bool HasXSAVEC = false;
2356 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002357 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002358 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002359 bool HasCLFLUSHOPT = false;
2360 bool HasPCOMMIT = false;
2361 bool HasCLWB = false;
2362 bool HasUMIP = false;
2363 bool HasMOVBE = false;
2364 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002365
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002366 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2367 ///
2368 /// Each enumeration represents a particular CPU supported by Clang. These
2369 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2370 enum CPUKind {
2371 CK_Generic,
2372
2373 /// \name i386
2374 /// i386-generation processors.
2375 //@{
2376 CK_i386,
2377 //@}
2378
2379 /// \name i486
2380 /// i486-generation processors.
2381 //@{
2382 CK_i486,
2383 CK_WinChipC6,
2384 CK_WinChip2,
2385 CK_C3,
2386 //@}
2387
2388 /// \name i586
2389 /// i586-generation processors, P5 microarchitecture based.
2390 //@{
2391 CK_i586,
2392 CK_Pentium,
2393 CK_PentiumMMX,
2394 //@}
2395
2396 /// \name i686
2397 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2398 //@{
2399 CK_i686,
2400 CK_PentiumPro,
2401 CK_Pentium2,
2402 CK_Pentium3,
2403 CK_Pentium3M,
2404 CK_PentiumM,
2405 CK_C3_2,
2406
2407 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2408 /// Clang however has some logic to suport this.
2409 // FIXME: Warn, deprecate, and potentially remove this.
2410 CK_Yonah,
2411 //@}
2412
2413 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002414 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002415 //@{
2416 CK_Pentium4,
2417 CK_Pentium4M,
2418 CK_Prescott,
2419 CK_Nocona,
2420 //@}
2421
2422 /// \name Core
2423 /// Core microarchitecture based processors.
2424 //@{
2425 CK_Core2,
2426
2427 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2428 /// codename which GCC no longer accepts as an option to -march, but Clang
2429 /// has some logic for recognizing it.
2430 // FIXME: Warn, deprecate, and potentially remove this.
2431 CK_Penryn,
2432 //@}
2433
2434 /// \name Atom
2435 /// Atom processors
2436 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002437 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002438 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002439 //@}
2440
2441 /// \name Nehalem
2442 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002443 CK_Nehalem,
2444
2445 /// \name Westmere
2446 /// Westmere microarchitecture based processors.
2447 CK_Westmere,
2448
2449 /// \name Sandy Bridge
2450 /// Sandy Bridge microarchitecture based processors.
2451 CK_SandyBridge,
2452
2453 /// \name Ivy Bridge
2454 /// Ivy Bridge microarchitecture based processors.
2455 CK_IvyBridge,
2456
2457 /// \name Haswell
2458 /// Haswell microarchitecture based processors.
2459 CK_Haswell,
2460
2461 /// \name Broadwell
2462 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002463 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002464
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002465 /// \name Skylake Client
2466 /// Skylake client microarchitecture based processors.
2467 CK_SkylakeClient,
2468
2469 /// \name Skylake Server
2470 /// Skylake server microarchitecture based processors.
2471 CK_SkylakeServer,
2472
2473 /// \name Cannonlake Client
2474 /// Cannonlake client microarchitecture based processors.
2475 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002476
Craig Topper449314e2013-08-20 07:09:39 +00002477 /// \name Knights Landing
2478 /// Knights Landing processor.
2479 CK_KNL,
2480
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002481 /// \name Lakemont
2482 /// Lakemont microarchitecture based processors.
2483 CK_Lakemont,
2484
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002485 /// \name K6
2486 /// K6 architecture processors.
2487 //@{
2488 CK_K6,
2489 CK_K6_2,
2490 CK_K6_3,
2491 //@}
2492
2493 /// \name K7
2494 /// K7 architecture processors.
2495 //@{
2496 CK_Athlon,
2497 CK_AthlonThunderbird,
2498 CK_Athlon4,
2499 CK_AthlonXP,
2500 CK_AthlonMP,
2501 //@}
2502
2503 /// \name K8
2504 /// K8 architecture processors.
2505 //@{
2506 CK_Athlon64,
2507 CK_Athlon64SSE3,
2508 CK_AthlonFX,
2509 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002510 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002511 CK_Opteron,
2512 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002513 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002514 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002515
Benjamin Kramer569f2152012-01-10 11:50:18 +00002516 /// \name Bobcat
2517 /// Bobcat architecture processors.
2518 //@{
2519 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002520 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002521 //@}
2522
2523 /// \name Bulldozer
2524 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002525 //@{
2526 CK_BDVER1,
2527 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002528 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002529 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002530 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002531
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002532 /// This specification is deprecated and will be removed in the future.
2533 /// Users should prefer \see CK_K8.
2534 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002535 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002536 CK_x86_64,
2537 //@}
2538
2539 /// \name Geode
2540 /// Geode processors.
2541 //@{
2542 CK_Geode
2543 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002544 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002545
Eric Christopherc50738f2015-08-27 00:05:50 +00002546 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002547 return llvm::StringSwitch<CPUKind>(CPU)
2548 .Case("i386", CK_i386)
2549 .Case("i486", CK_i486)
2550 .Case("winchip-c6", CK_WinChipC6)
2551 .Case("winchip2", CK_WinChip2)
2552 .Case("c3", CK_C3)
2553 .Case("i586", CK_i586)
2554 .Case("pentium", CK_Pentium)
2555 .Case("pentium-mmx", CK_PentiumMMX)
2556 .Case("i686", CK_i686)
2557 .Case("pentiumpro", CK_PentiumPro)
2558 .Case("pentium2", CK_Pentium2)
2559 .Case("pentium3", CK_Pentium3)
2560 .Case("pentium3m", CK_Pentium3M)
2561 .Case("pentium-m", CK_PentiumM)
2562 .Case("c3-2", CK_C3_2)
2563 .Case("yonah", CK_Yonah)
2564 .Case("pentium4", CK_Pentium4)
2565 .Case("pentium4m", CK_Pentium4M)
2566 .Case("prescott", CK_Prescott)
2567 .Case("nocona", CK_Nocona)
2568 .Case("core2", CK_Core2)
2569 .Case("penryn", CK_Penryn)
2570 .Case("bonnell", CK_Bonnell)
2571 .Case("atom", CK_Bonnell) // Legacy name.
2572 .Case("silvermont", CK_Silvermont)
2573 .Case("slm", CK_Silvermont) // Legacy name.
2574 .Case("nehalem", CK_Nehalem)
2575 .Case("corei7", CK_Nehalem) // Legacy name.
2576 .Case("westmere", CK_Westmere)
2577 .Case("sandybridge", CK_SandyBridge)
2578 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2579 .Case("ivybridge", CK_IvyBridge)
2580 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2581 .Case("haswell", CK_Haswell)
2582 .Case("core-avx2", CK_Haswell) // Legacy name.
2583 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002584 .Case("skylake", CK_SkylakeClient)
2585 .Case("skylake-avx512", CK_SkylakeServer)
2586 .Case("skx", CK_SkylakeServer) // Legacy name.
2587 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002588 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002589 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002590 .Case("k6", CK_K6)
2591 .Case("k6-2", CK_K6_2)
2592 .Case("k6-3", CK_K6_3)
2593 .Case("athlon", CK_Athlon)
2594 .Case("athlon-tbird", CK_AthlonThunderbird)
2595 .Case("athlon-4", CK_Athlon4)
2596 .Case("athlon-xp", CK_AthlonXP)
2597 .Case("athlon-mp", CK_AthlonMP)
2598 .Case("athlon64", CK_Athlon64)
2599 .Case("athlon64-sse3", CK_Athlon64SSE3)
2600 .Case("athlon-fx", CK_AthlonFX)
2601 .Case("k8", CK_K8)
2602 .Case("k8-sse3", CK_K8SSE3)
2603 .Case("opteron", CK_Opteron)
2604 .Case("opteron-sse3", CK_OpteronSSE3)
2605 .Case("barcelona", CK_AMDFAM10)
2606 .Case("amdfam10", CK_AMDFAM10)
2607 .Case("btver1", CK_BTVER1)
2608 .Case("btver2", CK_BTVER2)
2609 .Case("bdver1", CK_BDVER1)
2610 .Case("bdver2", CK_BDVER2)
2611 .Case("bdver3", CK_BDVER3)
2612 .Case("bdver4", CK_BDVER4)
2613 .Case("x86-64", CK_x86_64)
2614 .Case("geode", CK_Geode)
2615 .Default(CK_Generic);
2616 }
2617
Rafael Espindolaeb265472013-08-21 21:59:03 +00002618 enum FPMathKind {
2619 FP_Default,
2620 FP_SSE,
2621 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002622 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002623
Eli Friedman3fd920a2008-08-20 02:34:37 +00002624public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002625 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2626 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002627 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002628 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002629 }
Craig Topper3164f332014-03-11 03:39:26 +00002630 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002631 // X87 evaluates with 80 bits "long double" precision.
2632 return SSELevel == NoSSE ? 2 : 0;
2633 }
Craig Topper6c03a542015-10-19 04:51:35 +00002634 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2635 return llvm::makeArrayRef(BuiltinInfo,
2636 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002637 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002638 ArrayRef<const char *> getGCCRegNames() const override {
2639 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002640 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002641 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2642 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002643 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002644 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2645 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002646 }
Eric Christopherd9832702015-06-29 21:00:05 +00002647 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002648 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002649 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002650
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002651 bool validateGlobalRegisterVariable(StringRef RegName,
2652 unsigned RegSize,
2653 bool &HasSizeMismatch) const override {
2654 // esp and ebp are the only 32-bit registers the x86 backend can currently
2655 // handle.
2656 if (RegName.equals("esp") || RegName.equals("ebp")) {
2657 // Check that the register size is 32-bit.
2658 HasSizeMismatch = RegSize != 32;
2659 return true;
2660 }
2661
2662 return false;
2663 }
2664
Akira Hatanaka974131e2014-09-18 18:17:18 +00002665 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2666
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002667 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2668
Akira Hatanaka974131e2014-09-18 18:17:18 +00002669 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2670
Craig Topper3164f332014-03-11 03:39:26 +00002671 std::string convertConstraint(const char *&Constraint) const override;
2672 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002673 return "~{dirflag},~{fpsr},~{flags}";
2674 }
Craig Topper3164f332014-03-11 03:39:26 +00002675 void getTargetDefines(const LangOptions &Opts,
2676 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002677 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2678 bool Enabled);
2679 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2680 bool Enabled);
2681 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2682 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002683 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2684 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002685 setFeatureEnabledImpl(Features, Name, Enabled);
2686 }
2687 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002688 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002689 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2690 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002691 bool
2692 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2693 StringRef CPU,
2694 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002695 bool hasFeature(StringRef Feature) const override;
2696 bool handleTargetFeatures(std::vector<std::string> &Features,
2697 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002698 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002699 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2700 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002701 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002702 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002703 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002704 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002705 return "no-mmx";
2706 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002707 }
Craig Topper3164f332014-03-11 03:39:26 +00002708 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002709 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002710
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002711 // Perform any per-CPU checks necessary to determine if this CPU is
2712 // acceptable.
2713 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2714 // invalid without explaining *why*.
2715 switch (CPU) {
2716 case CK_Generic:
2717 // No processor selected!
2718 return false;
2719
2720 case CK_i386:
2721 case CK_i486:
2722 case CK_WinChipC6:
2723 case CK_WinChip2:
2724 case CK_C3:
2725 case CK_i586:
2726 case CK_Pentium:
2727 case CK_PentiumMMX:
2728 case CK_i686:
2729 case CK_PentiumPro:
2730 case CK_Pentium2:
2731 case CK_Pentium3:
2732 case CK_Pentium3M:
2733 case CK_PentiumM:
2734 case CK_Yonah:
2735 case CK_C3_2:
2736 case CK_Pentium4:
2737 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002738 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002739 case CK_Prescott:
2740 case CK_K6:
2741 case CK_K6_2:
2742 case CK_K6_3:
2743 case CK_Athlon:
2744 case CK_AthlonThunderbird:
2745 case CK_Athlon4:
2746 case CK_AthlonXP:
2747 case CK_AthlonMP:
2748 case CK_Geode:
2749 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002750 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002751 return false;
2752
2753 // Fallthrough
2754 case CK_Nocona:
2755 case CK_Core2:
2756 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002757 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002758 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002759 case CK_Nehalem:
2760 case CK_Westmere:
2761 case CK_SandyBridge:
2762 case CK_IvyBridge:
2763 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002764 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002765 case CK_SkylakeClient:
2766 case CK_SkylakeServer:
2767 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002768 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002769 case CK_Athlon64:
2770 case CK_Athlon64SSE3:
2771 case CK_AthlonFX:
2772 case CK_K8:
2773 case CK_K8SSE3:
2774 case CK_Opteron:
2775 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002776 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002777 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002778 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002779 case CK_BDVER1:
2780 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002781 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002782 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002783 case CK_x86_64:
2784 return true;
2785 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002786 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002787 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002788
Craig Topper3164f332014-03-11 03:39:26 +00002789 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002790
Craig Topper3164f332014-03-11 03:39:26 +00002791 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002792 // Most of the non-ARM calling conventions are i386 conventions.
2793 switch (CC) {
2794 case CC_X86ThisCall:
2795 case CC_X86FastCall:
2796 case CC_X86StdCall:
2797 case CC_X86VectorCall:
2798 case CC_C:
2799 case CC_Swift:
2800 case CC_X86Pascal:
2801 case CC_IntelOclBicc:
2802 return CCCR_OK;
2803 default:
2804 return CCCR_Warning;
2805 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002806 }
2807
Craig Topper3164f332014-03-11 03:39:26 +00002808 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002809 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002810 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002811
2812 bool hasSjLjLowering() const override {
2813 return true;
2814 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002815
2816 void setSupportedOpenCLOpts() override {
2817 getSupportedOpenCLOpts().setAll();
2818 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002819};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002820
Rafael Espindolaeb265472013-08-21 21:59:03 +00002821bool X86TargetInfo::setFPMath(StringRef Name) {
2822 if (Name == "387") {
2823 FPMath = FP_387;
2824 return true;
2825 }
2826 if (Name == "sse") {
2827 FPMath = FP_SSE;
2828 return true;
2829 }
2830 return false;
2831}
2832
Eric Christopher007b0a02015-08-28 22:32:01 +00002833bool X86TargetInfo::initFeatureMap(
2834 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002835 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002836 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002837 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002838 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002839 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002840
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002841 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002842
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002843 // Enable X87 for all X86 processors but Lakemont.
2844 if (Kind != CK_Lakemont)
2845 setFeatureEnabledImpl(Features, "x87", true);
2846
2847 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002848 case CK_Generic:
2849 case CK_i386:
2850 case CK_i486:
2851 case CK_i586:
2852 case CK_Pentium:
2853 case CK_i686:
2854 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002855 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002856 break;
2857 case CK_PentiumMMX:
2858 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002859 case CK_K6:
2860 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002861 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002862 break;
2863 case CK_Pentium3:
2864 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002865 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002866 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002867 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002868 break;
2869 case CK_PentiumM:
2870 case CK_Pentium4:
2871 case CK_Pentium4M:
2872 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002873 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002874 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002875 break;
2876 case CK_Yonah:
2877 case CK_Prescott:
2878 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002879 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002880 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002881 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002882 break;
2883 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002884 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002885 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002886 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002887 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002888 break;
2889 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002890 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002891 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002892 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002893 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002894 case CK_Cannonlake:
2895 setFeatureEnabledImpl(Features, "avx512ifma", true);
2896 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2897 setFeatureEnabledImpl(Features, "sha", true);
2898 setFeatureEnabledImpl(Features, "umip", true);
2899 // FALLTHROUGH
2900 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002901 setFeatureEnabledImpl(Features, "avx512f", true);
2902 setFeatureEnabledImpl(Features, "avx512cd", true);
2903 setFeatureEnabledImpl(Features, "avx512dq", true);
2904 setFeatureEnabledImpl(Features, "avx512bw", true);
2905 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002906 setFeatureEnabledImpl(Features, "pku", true);
2907 setFeatureEnabledImpl(Features, "pcommit", true);
2908 setFeatureEnabledImpl(Features, "clwb", true);
2909 // FALLTHROUGH
2910 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002911 setFeatureEnabledImpl(Features, "xsavec", true);
2912 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002913 setFeatureEnabledImpl(Features, "mpx", true);
2914 setFeatureEnabledImpl(Features, "sgx", true);
2915 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002916 // FALLTHROUGH
2917 case CK_Broadwell:
2918 setFeatureEnabledImpl(Features, "rdseed", true);
2919 setFeatureEnabledImpl(Features, "adx", true);
2920 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002921 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002922 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002923 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002924 setFeatureEnabledImpl(Features, "bmi", true);
2925 setFeatureEnabledImpl(Features, "bmi2", true);
2926 setFeatureEnabledImpl(Features, "rtm", true);
2927 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002928 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002929 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002930 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002931 setFeatureEnabledImpl(Features, "rdrnd", true);
2932 setFeatureEnabledImpl(Features, "f16c", true);
2933 setFeatureEnabledImpl(Features, "fsgsbase", true);
2934 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002935 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002936 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002937 setFeatureEnabledImpl(Features, "xsave", true);
2938 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002939 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002940 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002941 case CK_Silvermont:
2942 setFeatureEnabledImpl(Features, "aes", true);
2943 setFeatureEnabledImpl(Features, "pclmul", true);
2944 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002945 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002946 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002947 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002948 setFeatureEnabledImpl(Features, "cx16", true);
2949 break;
2950 case CK_KNL:
2951 setFeatureEnabledImpl(Features, "avx512f", true);
2952 setFeatureEnabledImpl(Features, "avx512cd", true);
2953 setFeatureEnabledImpl(Features, "avx512er", true);
2954 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002955 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002956 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002957 setFeatureEnabledImpl(Features, "rdseed", true);
2958 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002959 setFeatureEnabledImpl(Features, "lzcnt", true);
2960 setFeatureEnabledImpl(Features, "bmi", true);
2961 setFeatureEnabledImpl(Features, "bmi2", true);
2962 setFeatureEnabledImpl(Features, "rtm", true);
2963 setFeatureEnabledImpl(Features, "fma", true);
2964 setFeatureEnabledImpl(Features, "rdrnd", true);
2965 setFeatureEnabledImpl(Features, "f16c", true);
2966 setFeatureEnabledImpl(Features, "fsgsbase", true);
2967 setFeatureEnabledImpl(Features, "aes", true);
2968 setFeatureEnabledImpl(Features, "pclmul", true);
2969 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002970 setFeatureEnabledImpl(Features, "xsaveopt", true);
2971 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002972 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002973 break;
2974 case CK_K6_2:
2975 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002976 case CK_WinChip2:
2977 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002978 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002979 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002980 case CK_Athlon:
2981 case CK_AthlonThunderbird:
2982 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002983 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002984 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002985 case CK_Athlon4:
2986 case CK_AthlonXP:
2987 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002988 setFeatureEnabledImpl(Features, "sse", true);
2989 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002990 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002991 break;
2992 case CK_K8:
2993 case CK_Opteron:
2994 case CK_Athlon64:
2995 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002996 setFeatureEnabledImpl(Features, "sse2", true);
2997 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002998 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002999 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003000 case CK_AMDFAM10:
3001 setFeatureEnabledImpl(Features, "sse4a", true);
3002 setFeatureEnabledImpl(Features, "lzcnt", true);
3003 setFeatureEnabledImpl(Features, "popcnt", true);
3004 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003005 case CK_K8SSE3:
3006 case CK_OpteronSSE3:
3007 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003008 setFeatureEnabledImpl(Features, "sse3", true);
3009 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003010 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003011 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003012 case CK_BTVER2:
3013 setFeatureEnabledImpl(Features, "avx", true);
3014 setFeatureEnabledImpl(Features, "aes", true);
3015 setFeatureEnabledImpl(Features, "pclmul", true);
3016 setFeatureEnabledImpl(Features, "bmi", true);
3017 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003018 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003019 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003020 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003021 setFeatureEnabledImpl(Features, "ssse3", true);
3022 setFeatureEnabledImpl(Features, "sse4a", true);
3023 setFeatureEnabledImpl(Features, "lzcnt", true);
3024 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003025 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003026 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003027 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003028 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003029 case CK_BDVER4:
3030 setFeatureEnabledImpl(Features, "avx2", true);
3031 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003032 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003033 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003034 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003035 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003036 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003037 // FALLTHROUGH
3038 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003039 setFeatureEnabledImpl(Features, "bmi", true);
3040 setFeatureEnabledImpl(Features, "fma", true);
3041 setFeatureEnabledImpl(Features, "f16c", true);
3042 setFeatureEnabledImpl(Features, "tbm", true);
3043 // FALLTHROUGH
3044 case CK_BDVER1:
3045 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003046 setFeatureEnabledImpl(Features, "xop", true);
3047 setFeatureEnabledImpl(Features, "lzcnt", true);
3048 setFeatureEnabledImpl(Features, "aes", true);
3049 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003050 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003051 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003052 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003053 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003054 break;
Eli Friedman33465822011-07-08 23:31:17 +00003055 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003056 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3057 return false;
3058
3059 // Can't do this earlier because we need to be able to explicitly enable
3060 // or disable these features and the things that they depend upon.
3061
3062 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3063 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003064 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003065 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3066 FeaturesVec.end())
3067 Features["popcnt"] = true;
3068
3069 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3070 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003071 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003072 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3073 FeaturesVec.end())
3074 Features["prfchw"] = true;
3075
Eric Christophera7260af2015-10-08 20:10:18 +00003076 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3077 // then enable MMX.
3078 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003079 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003080 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3081 FeaturesVec.end())
3082 Features["mmx"] = true;
3083
Eric Christopherbbd746d2015-10-08 20:10:14 +00003084 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003085}
3086
Rafael Espindolae62e2792013-08-20 13:44:29 +00003087void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003088 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003089 if (Enabled) {
3090 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003091 case AVX512F:
3092 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003093 case AVX2:
3094 Features["avx2"] = true;
3095 case AVX:
3096 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003097 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003098 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003099 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003100 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003101 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003102 case SSSE3:
3103 Features["ssse3"] = true;
3104 case SSE3:
3105 Features["sse3"] = true;
3106 case SSE2:
3107 Features["sse2"] = true;
3108 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003109 Features["sse"] = true;
3110 case NoSSE:
3111 break;
3112 }
3113 return;
3114 }
3115
3116 switch (Level) {
3117 case NoSSE:
3118 case SSE1:
3119 Features["sse"] = false;
3120 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003121 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3122 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003123 case SSE3:
3124 Features["sse3"] = false;
3125 setXOPLevel(Features, NoXOP, false);
3126 case SSSE3:
3127 Features["ssse3"] = false;
3128 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003129 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003130 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003131 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003132 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003133 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3134 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003135 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003136 case AVX2:
3137 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003138 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003139 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003140 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003141 Features["avx512vl"] = Features["avx512vbmi"] =
3142 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003143 }
3144}
3145
3146void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003147 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003148 if (Enabled) {
3149 switch (Level) {
3150 case AMD3DNowAthlon:
3151 Features["3dnowa"] = true;
3152 case AMD3DNow:
3153 Features["3dnow"] = true;
3154 case MMX:
3155 Features["mmx"] = true;
3156 case NoMMX3DNow:
3157 break;
3158 }
3159 return;
3160 }
3161
3162 switch (Level) {
3163 case NoMMX3DNow:
3164 case MMX:
3165 Features["mmx"] = false;
3166 case AMD3DNow:
3167 Features["3dnow"] = false;
3168 case AMD3DNowAthlon:
3169 Features["3dnowa"] = false;
3170 }
3171}
3172
3173void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003174 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003175 if (Enabled) {
3176 switch (Level) {
3177 case XOP:
3178 Features["xop"] = true;
3179 case FMA4:
3180 Features["fma4"] = true;
3181 setSSELevel(Features, AVX, true);
3182 case SSE4A:
3183 Features["sse4a"] = true;
3184 setSSELevel(Features, SSE3, true);
3185 case NoXOP:
3186 break;
3187 }
3188 return;
3189 }
3190
3191 switch (Level) {
3192 case NoXOP:
3193 case SSE4A:
3194 Features["sse4a"] = false;
3195 case FMA4:
3196 Features["fma4"] = false;
3197 case XOP:
3198 Features["xop"] = false;
3199 }
3200}
3201
Craig Topper86d79ef2013-09-17 04:51:29 +00003202void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3203 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003204 // This is a bit of a hack to deal with the sse4 target feature when used
3205 // as part of the target attribute. We handle sse4 correctly everywhere
3206 // else. See below for more information on how we handle the sse4 options.
3207 if (Name != "sse4")
3208 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003209
Craig Topper29561122013-09-19 01:13:07 +00003210 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003211 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003212 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003213 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003214 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003215 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003216 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003217 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003218 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003219 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003220 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003221 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003222 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003223 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003224 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003225 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003226 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003227 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003228 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003229 if (Enabled)
3230 setSSELevel(Features, SSE2, Enabled);
3231 } else if (Name == "pclmul") {
3232 if (Enabled)
3233 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003234 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003235 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003236 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003237 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003238 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003239 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003240 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3241 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3242 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003243 if (Enabled)
3244 setSSELevel(Features, AVX512F, Enabled);
3245 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003246 if (Enabled)
3247 setSSELevel(Features, AVX, Enabled);
3248 } else if (Name == "fma4") {
3249 setXOPLevel(Features, FMA4, Enabled);
3250 } else if (Name == "xop") {
3251 setXOPLevel(Features, XOP, Enabled);
3252 } else if (Name == "sse4a") {
3253 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003254 } else if (Name == "f16c") {
3255 if (Enabled)
3256 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003257 } else if (Name == "sha") {
3258 if (Enabled)
3259 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003260 } else if (Name == "sse4") {
3261 // We can get here via the __target__ attribute since that's not controlled
3262 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3263 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3264 // disabled.
3265 if (Enabled)
3266 setSSELevel(Features, SSE42, Enabled);
3267 else
3268 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003269 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003270 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003271 Features["xsaveopt"] = false;
3272 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003273 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003274 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003275 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003276}
3277
Eric Christopher3ff21b32013-10-16 21:26:26 +00003278/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003279/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003280bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003281 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003282 for (const auto &Feature : Features) {
3283 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003284 continue;
3285
Eric Christopher610fe112015-08-26 08:21:55 +00003286 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003287 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003288 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003289 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003290 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003291 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003292 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003293 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003294 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003295 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003296 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003297 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003298 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003299 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003300 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003301 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003302 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003303 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003304 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003305 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003306 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003307 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003308 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003309 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003310 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003311 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003312 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003313 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003314 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003315 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003316 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003317 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003318 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003319 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003320 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003321 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003322 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003323 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003324 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003325 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003326 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003327 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003328 } else if (Feature == "+avx512vbmi") {
3329 HasAVX512VBMI = true;
3330 } else if (Feature == "+avx512ifma") {
3331 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003332 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003333 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003334 } else if (Feature == "+mpx") {
3335 HasMPX = true;
3336 } else if (Feature == "+movbe") {
3337 HasMOVBE = true;
3338 } else if (Feature == "+sgx") {
3339 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003340 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003341 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003342 } else if (Feature == "+fxsr") {
3343 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003344 } else if (Feature == "+xsave") {
3345 HasXSAVE = true;
3346 } else if (Feature == "+xsaveopt") {
3347 HasXSAVEOPT = true;
3348 } else if (Feature == "+xsavec") {
3349 HasXSAVEC = true;
3350 } else if (Feature == "+xsaves") {
3351 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003352 } else if (Feature == "+mwaitx") {
3353 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003354 } else if (Feature == "+pku") {
3355 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003356 } else if (Feature == "+clflushopt") {
3357 HasCLFLUSHOPT = true;
3358 } else if (Feature == "+pcommit") {
3359 HasPCOMMIT = true;
3360 } else if (Feature == "+clwb") {
3361 HasCLWB = true;
3362 } else if (Feature == "+umip") {
3363 HasUMIP = true;
3364 } else if (Feature == "+prefetchwt1") {
3365 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003366 }
3367
Benjamin Kramer27402c62012-03-05 15:10:44 +00003368 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003369 .Case("+avx512f", AVX512F)
3370 .Case("+avx2", AVX2)
3371 .Case("+avx", AVX)
3372 .Case("+sse4.2", SSE42)
3373 .Case("+sse4.1", SSE41)
3374 .Case("+ssse3", SSSE3)
3375 .Case("+sse3", SSE3)
3376 .Case("+sse2", SSE2)
3377 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003378 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003379 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003380
Eli Friedman33465822011-07-08 23:31:17 +00003381 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003382 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003383 .Case("+3dnowa", AMD3DNowAthlon)
3384 .Case("+3dnow", AMD3DNow)
3385 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003386 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003387 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003388
3389 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003390 .Case("+xop", XOP)
3391 .Case("+fma4", FMA4)
3392 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003393 .Default(NoXOP);
3394 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003395 }
Eli Friedman33465822011-07-08 23:31:17 +00003396
Rafael Espindolaeb265472013-08-21 21:59:03 +00003397 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3398 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003399 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3400 (FPMath == FP_387 && SSELevel >= SSE1)) {
3401 Diags.Report(diag::err_target_unsupported_fpmath) <<
3402 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003403 return false;
3404 }
3405
Alexey Bataev00396512015-07-02 03:40:19 +00003406 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003407 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003408 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003409}
Chris Lattnerecd49032009-03-02 22:27:17 +00003410
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003411/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3412/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003413void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003414 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003415 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003416 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003417 Builder.defineMacro("__amd64__");
3418 Builder.defineMacro("__amd64");
3419 Builder.defineMacro("__x86_64");
3420 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003421 if (getTriple().getArchName() == "x86_64h") {
3422 Builder.defineMacro("__x86_64h");
3423 Builder.defineMacro("__x86_64h__");
3424 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003425 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003426 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003427 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003428
Chris Lattnerecd49032009-03-02 22:27:17 +00003429 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003430 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3431 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003432 switch (CPU) {
3433 case CK_Generic:
3434 break;
3435 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003436 // The rest are coming from the i386 define above.
3437 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003438 break;
3439 case CK_i486:
3440 case CK_WinChipC6:
3441 case CK_WinChip2:
3442 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003443 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003444 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003445 case CK_PentiumMMX:
3446 Builder.defineMacro("__pentium_mmx__");
3447 Builder.defineMacro("__tune_pentium_mmx__");
3448 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003449 case CK_i586:
3450 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003451 defineCPUMacros(Builder, "i586");
3452 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003453 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003454 case CK_Pentium3:
3455 case CK_Pentium3M:
3456 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003457 Builder.defineMacro("__tune_pentium3__");
3458 // Fallthrough
3459 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003460 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003461 Builder.defineMacro("__tune_pentium2__");
3462 // Fallthrough
3463 case CK_PentiumPro:
3464 Builder.defineMacro("__tune_i686__");
3465 Builder.defineMacro("__tune_pentiumpro__");
3466 // Fallthrough
3467 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003468 Builder.defineMacro("__i686");
3469 Builder.defineMacro("__i686__");
3470 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3471 Builder.defineMacro("__pentiumpro");
3472 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003473 break;
3474 case CK_Pentium4:
3475 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003476 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003477 break;
3478 case CK_Yonah:
3479 case CK_Prescott:
3480 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003481 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003482 break;
3483 case CK_Core2:
3484 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003485 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003486 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003487 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003488 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003489 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003490 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003491 defineCPUMacros(Builder, "slm");
3492 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003493 case CK_Nehalem:
3494 case CK_Westmere:
3495 case CK_SandyBridge:
3496 case CK_IvyBridge:
3497 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003498 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003499 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003500 // FIXME: Historically, we defined this legacy name, it would be nice to
3501 // remove it at some point. We've never exposed fine-grained names for
3502 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003503 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003504 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003505 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003506 defineCPUMacros(Builder, "skx");
3507 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003508 case CK_Cannonlake:
3509 break;
Craig Topper449314e2013-08-20 07:09:39 +00003510 case CK_KNL:
3511 defineCPUMacros(Builder, "knl");
3512 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003513 case CK_Lakemont:
3514 Builder.defineMacro("__tune_lakemont__");
3515 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003516 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003517 Builder.defineMacro("__k6_2__");
3518 Builder.defineMacro("__tune_k6_2__");
3519 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003520 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003521 if (CPU != CK_K6_2) { // In case of fallthrough
3522 // FIXME: GCC may be enabling these in cases where some other k6
3523 // architecture is specified but -m3dnow is explicitly provided. The
3524 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003525 Builder.defineMacro("__k6_3__");
3526 Builder.defineMacro("__tune_k6_3__");
3527 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003528 // Fallthrough
3529 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003530 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003531 break;
3532 case CK_Athlon:
3533 case CK_AthlonThunderbird:
3534 case CK_Athlon4:
3535 case CK_AthlonXP:
3536 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003537 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003538 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003539 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003540 Builder.defineMacro("__tune_athlon_sse__");
3541 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003542 break;
3543 case CK_K8:
3544 case CK_K8SSE3:
3545 case CK_x86_64:
3546 case CK_Opteron:
3547 case CK_OpteronSSE3:
3548 case CK_Athlon64:
3549 case CK_Athlon64SSE3:
3550 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003551 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003552 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003553 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003554 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003555 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003556 case CK_BTVER1:
3557 defineCPUMacros(Builder, "btver1");
3558 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003559 case CK_BTVER2:
3560 defineCPUMacros(Builder, "btver2");
3561 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003562 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003563 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003564 break;
3565 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003566 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003567 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003568 case CK_BDVER3:
3569 defineCPUMacros(Builder, "bdver3");
3570 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003571 case CK_BDVER4:
3572 defineCPUMacros(Builder, "bdver4");
3573 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003574 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003575 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003576 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003577 }
Chris Lattner96e43572009-03-02 22:40:39 +00003578
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003579 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003580 Builder.defineMacro("__REGISTER_PREFIX__", "");
3581
Chris Lattner6df41af2009-04-19 17:32:33 +00003582 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3583 // functions in glibc header files that use FP Stack inline asm which the
3584 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003585 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003586
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003587 if (HasAES)
3588 Builder.defineMacro("__AES__");
3589
Craig Topper3f122a72012-05-31 05:18:48 +00003590 if (HasPCLMUL)
3591 Builder.defineMacro("__PCLMUL__");
3592
Craig Topper22967d42011-12-25 05:06:45 +00003593 if (HasLZCNT)
3594 Builder.defineMacro("__LZCNT__");
3595
Benjamin Kramer1e250392012-07-07 09:39:18 +00003596 if (HasRDRND)
3597 Builder.defineMacro("__RDRND__");
3598
Craig Topper8c7f2512014-11-03 06:51:41 +00003599 if (HasFSGSBASE)
3600 Builder.defineMacro("__FSGSBASE__");
3601
Craig Topper22967d42011-12-25 05:06:45 +00003602 if (HasBMI)
3603 Builder.defineMacro("__BMI__");
3604
3605 if (HasBMI2)
3606 Builder.defineMacro("__BMI2__");
3607
Craig Topper1de83482011-12-29 16:10:46 +00003608 if (HasPOPCNT)
3609 Builder.defineMacro("__POPCNT__");
3610
Michael Liao625a8752012-11-10 05:17:46 +00003611 if (HasRTM)
3612 Builder.defineMacro("__RTM__");
3613
Michael Liao74f4eaf2013-03-26 17:52:08 +00003614 if (HasPRFCHW)
3615 Builder.defineMacro("__PRFCHW__");
3616
Michael Liaoffaae352013-03-29 05:17:55 +00003617 if (HasRDSEED)
3618 Builder.defineMacro("__RDSEED__");
3619
Robert Khasanov50e6f582014-09-19 09:53:48 +00003620 if (HasADX)
3621 Builder.defineMacro("__ADX__");
3622
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003623 if (HasTBM)
3624 Builder.defineMacro("__TBM__");
3625
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003626 if (HasMWAITX)
3627 Builder.defineMacro("__MWAITX__");
3628
Rafael Espindolae62e2792013-08-20 13:44:29 +00003629 switch (XOPLevel) {
3630 case XOP:
3631 Builder.defineMacro("__XOP__");
3632 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003633 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003634 case SSE4A:
3635 Builder.defineMacro("__SSE4A__");
3636 case NoXOP:
3637 break;
3638 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003639
Craig Topperbba778b2012-06-03 21:46:30 +00003640 if (HasFMA)
3641 Builder.defineMacro("__FMA__");
3642
Manman Rena45358c2012-10-11 00:59:55 +00003643 if (HasF16C)
3644 Builder.defineMacro("__F16C__");
3645
Craig Topper679b53a2013-08-21 05:29:10 +00003646 if (HasAVX512CD)
3647 Builder.defineMacro("__AVX512CD__");
3648 if (HasAVX512ER)
3649 Builder.defineMacro("__AVX512ER__");
3650 if (HasAVX512PF)
3651 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003652 if (HasAVX512DQ)
3653 Builder.defineMacro("__AVX512DQ__");
3654 if (HasAVX512BW)
3655 Builder.defineMacro("__AVX512BW__");
3656 if (HasAVX512VL)
3657 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003658 if (HasAVX512VBMI)
3659 Builder.defineMacro("__AVX512VBMI__");
3660 if (HasAVX512IFMA)
3661 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003662
Ben Langmuir58078d02013-09-19 13:22:04 +00003663 if (HasSHA)
3664 Builder.defineMacro("__SHA__");
3665
Craig Toppere33f51f2015-10-16 06:22:36 +00003666 if (HasFXSR)
3667 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003668 if (HasXSAVE)
3669 Builder.defineMacro("__XSAVE__");
3670 if (HasXSAVEOPT)
3671 Builder.defineMacro("__XSAVEOPT__");
3672 if (HasXSAVEC)
3673 Builder.defineMacro("__XSAVEC__");
3674 if (HasXSAVES)
3675 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003676 if (HasPKU)
3677 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003678 if (HasCX16)
3679 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3680
Chris Lattner96e43572009-03-02 22:40:39 +00003681 // Each case falls through to the previous one here.
3682 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003683 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003684 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003685 case AVX2:
3686 Builder.defineMacro("__AVX2__");
3687 case AVX:
3688 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003689 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003690 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003691 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003692 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003693 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003694 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003695 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003696 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003697 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003698 Builder.defineMacro("__SSE2__");
3699 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003700 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003701 Builder.defineMacro("__SSE__");
3702 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003703 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003704 break;
3705 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003706
Derek Schuffc7dd7222012-10-11 15:52:22 +00003707 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003708 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003709 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003710 case AVX2:
3711 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003712 case SSE42:
3713 case SSE41:
3714 case SSSE3:
3715 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003716 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003717 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003718 break;
3719 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003720 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003721 break;
3722 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003723 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003724 }
3725 }
3726
Anders Carlssone437c682010-01-27 03:47:49 +00003727 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003728 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003729 case AMD3DNowAthlon:
3730 Builder.defineMacro("__3dNOW_A__");
3731 case AMD3DNow:
3732 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003733 case MMX:
3734 Builder.defineMacro("__MMX__");
3735 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003736 break;
3737 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003738
3739 if (CPU >= CK_i486) {
3740 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3741 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3742 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3743 }
3744 if (CPU >= CK_i586)
3745 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003746}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003747
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003748bool X86TargetInfo::hasFeature(StringRef Feature) const {
3749 return llvm::StringSwitch<bool>(Feature)
3750 .Case("aes", HasAES)
3751 .Case("avx", SSELevel >= AVX)
3752 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003753 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003754 .Case("avx512cd", HasAVX512CD)
3755 .Case("avx512er", HasAVX512ER)
3756 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003757 .Case("avx512dq", HasAVX512DQ)
3758 .Case("avx512bw", HasAVX512BW)
3759 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003760 .Case("avx512vbmi", HasAVX512VBMI)
3761 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003762 .Case("bmi", HasBMI)
3763 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003764 .Case("clflushopt", HasCLFLUSHOPT)
3765 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003766 .Case("cx16", HasCX16)
3767 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003768 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003769 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003770 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003771 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003772 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003773 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3774 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3775 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003776 .Case("movbe", HasMOVBE)
3777 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003778 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003779 .Case("pcommit", HasPCOMMIT)
3780 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003781 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003782 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003783 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003784 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003785 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003786 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003787 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003788 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003789 .Case("sse", SSELevel >= SSE1)
3790 .Case("sse2", SSELevel >= SSE2)
3791 .Case("sse3", SSELevel >= SSE3)
3792 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003793 .Case("sse4.1", SSELevel >= SSE41)
3794 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003795 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003796 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003797 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003798 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003799 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3800 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003801 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003802 .Case("xsave", HasXSAVE)
3803 .Case("xsavec", HasXSAVEC)
3804 .Case("xsaves", HasXSAVES)
3805 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003806 .Default(false);
3807}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003808
Eric Christopherd9832702015-06-29 21:00:05 +00003809// We can't use a generic validation scheme for the features accepted here
3810// versus subtarget features accepted in the target attribute because the
3811// bitfield structure that's initialized in the runtime only supports the
3812// below currently rather than the full range of subtarget features. (See
3813// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3814bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3815 return llvm::StringSwitch<bool>(FeatureStr)
3816 .Case("cmov", true)
3817 .Case("mmx", true)
3818 .Case("popcnt", true)
3819 .Case("sse", true)
3820 .Case("sse2", true)
3821 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003822 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003823 .Case("sse4.1", true)
3824 .Case("sse4.2", true)
3825 .Case("avx", true)
3826 .Case("avx2", true)
3827 .Case("sse4a", true)
3828 .Case("fma4", true)
3829 .Case("xop", true)
3830 .Case("fma", true)
3831 .Case("avx512f", true)
3832 .Case("bmi", true)
3833 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003834 .Case("aes", true)
3835 .Case("pclmul", true)
3836 .Case("avx512vl", true)
3837 .Case("avx512bw", true)
3838 .Case("avx512dq", true)
3839 .Case("avx512cd", true)
3840 .Case("avx512er", true)
3841 .Case("avx512pf", true)
3842 .Case("avx512vbmi", true)
3843 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003844 .Default(false);
3845}
3846
Eli Friedman3fd920a2008-08-20 02:34:37 +00003847bool
Anders Carlsson58436352009-02-28 17:11:49 +00003848X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003849 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003850 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003851 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003852 // Constant constraints.
3853 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3854 // instructions.
3855 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3856 // x86_64 instructions.
3857 case 's':
3858 Info.setRequiresImmediate();
3859 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003860 case 'I':
3861 Info.setRequiresImmediate(0, 31);
3862 return true;
3863 case 'J':
3864 Info.setRequiresImmediate(0, 63);
3865 return true;
3866 case 'K':
3867 Info.setRequiresImmediate(-128, 127);
3868 return true;
3869 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003870 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003871 return true;
3872 case 'M':
3873 Info.setRequiresImmediate(0, 3);
3874 return true;
3875 case 'N':
3876 Info.setRequiresImmediate(0, 255);
3877 return true;
3878 case 'O':
3879 Info.setRequiresImmediate(0, 127);
3880 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003881 // Register constraints.
3882 case 'Y': // 'Y' is the first character for several 2-character constraints.
3883 // Shift the pointer to the second character of the constraint.
3884 Name++;
3885 switch (*Name) {
3886 default:
3887 return false;
3888 case '0': // First SSE register.
3889 case 't': // Any SSE register, when SSE2 is enabled.
3890 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3891 case 'm': // Any MMX register, when inter-unit moves enabled.
3892 Info.setAllowsRegister();
3893 return true;
3894 }
3895 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003896 // Constraint 'f' cannot be used for output operands.
3897 if (Info.ConstraintStr[0] == '=')
3898 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003899 Info.setAllowsRegister();
3900 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003901 case 'a': // eax.
3902 case 'b': // ebx.
3903 case 'c': // ecx.
3904 case 'd': // edx.
3905 case 'S': // esi.
3906 case 'D': // edi.
3907 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003908 case 't': // Top of floating point stack.
3909 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003910 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003911 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003912 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003913 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003914 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3915 case 'l': // "Index" registers: any general register that can be used as an
3916 // index in a base+index memory access.
3917 Info.setAllowsRegister();
3918 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003919 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003920 case 'C': // SSE floating point constant.
3921 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003922 return true;
3923 }
3924}
3925
Akira Hatanaka974131e2014-09-18 18:17:18 +00003926bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3927 unsigned Size) const {
3928 // Strip off constraint modifiers.
3929 while (Constraint[0] == '=' ||
3930 Constraint[0] == '+' ||
3931 Constraint[0] == '&')
3932 Constraint = Constraint.substr(1);
3933
3934 return validateOperandSize(Constraint, Size);
3935}
3936
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003937bool X86TargetInfo::validateInputSize(StringRef Constraint,
3938 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003939 return validateOperandSize(Constraint, Size);
3940}
3941
3942bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3943 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003944 switch (Constraint[0]) {
3945 default: break;
3946 case 'y':
3947 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003948 case 'f':
3949 case 't':
3950 case 'u':
3951 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003952 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003953 if (SSELevel >= AVX512F)
3954 // 512-bit zmm registers can be used if target supports AVX512F.
3955 return Size <= 512U;
3956 else if (SSELevel >= AVX)
3957 // 256-bit ymm registers can be used if target supports AVX.
3958 return Size <= 256U;
3959 return Size <= 128U;
3960 case 'Y':
3961 // 'Y' is the first character for several 2-character constraints.
3962 switch (Constraint[1]) {
3963 default: break;
3964 case 'm':
3965 // 'Ym' is synonymous with 'y'.
3966 return Size <= 64;
3967 case 'i':
3968 case 't':
3969 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3970 if (SSELevel >= AVX512F)
3971 return Size <= 512U;
3972 else if (SSELevel >= AVX)
3973 return Size <= 256U;
3974 return SSELevel >= SSE2 && Size <= 128U;
3975 }
3976
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003977 }
3978
3979 return true;
3980}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003981
Eli Friedman3fd920a2008-08-20 02:34:37 +00003982std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003983X86TargetInfo::convertConstraint(const char *&Constraint) const {
3984 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003985 case 'a': return std::string("{ax}");
3986 case 'b': return std::string("{bx}");
3987 case 'c': return std::string("{cx}");
3988 case 'd': return std::string("{dx}");
3989 case 'S': return std::string("{si}");
3990 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003991 case 'p': // address
3992 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003993 case 't': // top of floating point stack.
3994 return std::string("{st}");
3995 case 'u': // second from top of floating point stack.
3996 return std::string("{st(1)}"); // second from top of floating point stack.
3997 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003998 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003999 }
4000}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004001
Eli Friedman3fd920a2008-08-20 02:34:37 +00004002// X86-32 generic target
4003class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004004public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004005 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4006 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004007 DoubleAlign = LongLongAlign = 32;
4008 LongDoubleWidth = 96;
4009 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004010 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004011 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004012 SizeType = UnsignedInt;
4013 PtrDiffType = SignedInt;
4014 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004015 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004016
4017 // Use fpret for all types.
4018 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4019 (1 << TargetInfo::Double) |
4020 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004021
4022 // x86-32 has atomics up to 8 bytes
4023 // FIXME: Check that we actually have cmpxchg8b before setting
4024 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4025 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004026 }
Craig Topper3164f332014-03-11 03:39:26 +00004027 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004028 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004029 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004030
Craig Topper3164f332014-03-11 03:39:26 +00004031 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004032 if (RegNo == 0) return 0;
4033 if (RegNo == 1) return 2;
4034 return -1;
4035 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004036 bool validateOperandSize(StringRef Constraint,
4037 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004038 switch (Constraint[0]) {
4039 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004040 case 'R':
4041 case 'q':
4042 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004043 case 'a':
4044 case 'b':
4045 case 'c':
4046 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004047 case 'S':
4048 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004049 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004050 case 'A':
4051 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004052 }
4053
Akira Hatanaka974131e2014-09-18 18:17:18 +00004054 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004055 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004056};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004057
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004058class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4059public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004060 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4061 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004062
Craig Topper3164f332014-03-11 03:39:26 +00004063 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004064 unsigned Major, Minor, Micro;
4065 getTriple().getOSVersion(Major, Minor, Micro);
4066 // New NetBSD uses the default rounding mode.
4067 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4068 return X86_32TargetInfo::getFloatEvalMethod();
4069 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004070 return 1;
4071 }
4072};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004073
Eli Friedmane3aa4542009-07-05 18:47:56 +00004074class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4075public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004076 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4077 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004078 SizeType = UnsignedLong;
4079 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004080 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004081 }
4082};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004083
Eli Friedman9fa28852012-08-08 23:57:20 +00004084class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4085public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004086 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4087 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004088 SizeType = UnsignedLong;
4089 IntPtrType = SignedLong;
4090 PtrDiffType = SignedLong;
4091 }
4092};
Eli Friedman9fa28852012-08-08 23:57:20 +00004093
Torok Edwinb2b37c62009-06-30 17:10:35 +00004094class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004095public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004096 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4097 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004098 LongDoubleWidth = 128;
4099 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004100 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004101 MaxVectorAlign = 256;
4102 // The watchOS simulator uses the builtin bool type for Objective-C.
4103 llvm::Triple T = llvm::Triple(Triple);
4104 if (T.isWatchOS())
4105 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004106 SizeType = UnsignedLong;
4107 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004108 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004109 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004110 }
4111
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004112 bool handleTargetFeatures(std::vector<std::string> &Features,
4113 DiagnosticsEngine &Diags) override {
4114 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4115 Diags))
4116 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004117 // We now know the features we have: we can decide how to align vectors.
4118 MaxVectorAlign =
4119 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004120 return true;
4121 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004122};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004123
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004124// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004125class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004126public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004127 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4128 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004129 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004130 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004131 bool IsWinCOFF =
4132 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004133 resetDataLayout(IsWinCOFF
4134 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4135 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004136 }
Craig Topper3164f332014-03-11 03:39:26 +00004137 void getTargetDefines(const LangOptions &Opts,
4138 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004139 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4140 }
4141};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004142
4143// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004144class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004145public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004146 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4147 const TargetOptions &Opts)
4148 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004149 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004150 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4151 }
Craig Topper3164f332014-03-11 03:39:26 +00004152 void getTargetDefines(const LangOptions &Opts,
4153 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004154 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4155 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4156 // The value of the following reflects processor type.
4157 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4158 // We lost the original triple, so we use the default.
4159 Builder.defineMacro("_M_IX86", "600");
4160 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004161};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004162
David Majnemerae1ed0e2015-05-28 04:36:18 +00004163static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004164 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4165 // supports __declspec natively under -fms-extensions, but we define a no-op
4166 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004167 if (Opts.MicrosoftExt)
4168 Builder.defineMacro("__declspec", "__declspec");
4169 else
4170 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4171
4172 if (!Opts.MicrosoftExt) {
4173 // Provide macros for all the calling convention keywords. Provide both
4174 // single and double underscore prefixed variants. These are available on
4175 // x64 as well as x86, even though they have no effect.
4176 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4177 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004178 std::string GCCSpelling = "__attribute__((__";
4179 GCCSpelling += CC;
4180 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004181 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4182 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4183 }
4184 }
4185}
4186
David Majnemerae1ed0e2015-05-28 04:36:18 +00004187static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4188 Builder.defineMacro("__MSVCRT__");
4189 Builder.defineMacro("__MINGW32__");
4190 addCygMingDefines(Opts, Builder);
4191}
4192
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004193// x86-32 MinGW target
4194class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4195public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004196 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4197 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004198 void getTargetDefines(const LangOptions &Opts,
4199 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004200 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004201 DefineStd(Builder, "WIN32", Opts);
4202 DefineStd(Builder, "WINNT", Opts);
4203 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004204 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004205 }
4206};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004207
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004208// x86-32 Cygwin target
4209class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4210public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004211 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4212 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004213 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004214 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004215 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 +00004216 }
Craig Topper3164f332014-03-11 03:39:26 +00004217 void getTargetDefines(const LangOptions &Opts,
4218 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004219 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004220 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004221 Builder.defineMacro("__CYGWIN__");
4222 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004223 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004224 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004225 if (Opts.CPlusPlus)
4226 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004227 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004228};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004229
Chris Lattnerb986aba2010-04-11 19:29:39 +00004230// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004231class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004232public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004233 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004234 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004235 }
Craig Topper3164f332014-03-11 03:39:26 +00004236 void getTargetDefines(const LangOptions &Opts,
4237 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004238 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004239 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004240 }
4241};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004242
Alexey Bataevc99b0492015-11-25 09:24:26 +00004243// X86-32 MCU target
4244class MCUX86_32TargetInfo : public X86_32TargetInfo {
4245public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004246 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4247 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004248 LongDoubleWidth = 64;
4249 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004250 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 +00004251 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004252 }
4253
4254 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4255 // On MCU we support only C calling convention.
4256 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4257 }
4258
4259 void getTargetDefines(const LangOptions &Opts,
4260 MacroBuilder &Builder) const override {
4261 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4262 Builder.defineMacro("__iamcu");
4263 Builder.defineMacro("__iamcu__");
4264 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004265
4266 bool allowsLargerPreferedTypeAlignment() const override {
4267 return false;
4268 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004269};
4270
Douglas Gregor9fabd852011-07-01 22:41:14 +00004271// RTEMS Target
4272template<typename Target>
4273class RTEMSTargetInfo : public OSTargetInfo<Target> {
4274protected:
Craig Topper3164f332014-03-11 03:39:26 +00004275 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4276 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004277 // RTEMS defines; list based off of gcc output
4278
Douglas Gregor9fabd852011-07-01 22:41:14 +00004279 Builder.defineMacro("__rtems__");
4280 Builder.defineMacro("__ELF__");
4281 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004282
Douglas Gregor9fabd852011-07-01 22:41:14 +00004283public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004284 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4285 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004286 switch (Triple.getArch()) {
4287 default:
4288 case llvm::Triple::x86:
4289 // this->MCountName = ".mcount";
4290 break;
4291 case llvm::Triple::mips:
4292 case llvm::Triple::mipsel:
4293 case llvm::Triple::ppc:
4294 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004295 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004296 // this->MCountName = "_mcount";
4297 break;
4298 case llvm::Triple::arm:
4299 // this->MCountName = "__mcount";
4300 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004301 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004302 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004303};
4304
Douglas Gregor9fabd852011-07-01 22:41:14 +00004305// x86-32 RTEMS target
4306class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4307public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004308 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4309 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004310 SizeType = UnsignedLong;
4311 IntPtrType = SignedLong;
4312 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004313 }
Craig Topper3164f332014-03-11 03:39:26 +00004314 void getTargetDefines(const LangOptions &Opts,
4315 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004316 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4317 Builder.defineMacro("__INTEL__");
4318 Builder.defineMacro("__rtems__");
4319 }
4320};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004321
Eli Friedman3fd920a2008-08-20 02:34:37 +00004322// x86-64 generic target
4323class X86_64TargetInfo : public X86TargetInfo {
4324public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004325 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4326 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004327 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004328 bool IsWinCOFF =
4329 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004330 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004331 LongDoubleWidth = 128;
4332 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004333 LargeArrayMinWidth = 128;
4334 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004335 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004336 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4337 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4338 IntPtrType = IsX32 ? SignedInt : SignedLong;
4339 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004340 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004341 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004342
Eric Christopher917e9522014-11-18 22:36:15 +00004343 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004344 resetDataLayout(IsX32
4345 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4346 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4347 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004348
4349 // Use fpret only for long double.
4350 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004351
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004352 // Use fp2ret for _Complex long double.
4353 ComplexLongDoubleUsesFP2Ret = true;
4354
Charles Davisc7d5c942015-09-17 20:55:33 +00004355 // Make __builtin_ms_va_list available.
4356 HasBuiltinMSVaList = true;
4357
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004358 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004359 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004360 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004361 }
Craig Topper3164f332014-03-11 03:39:26 +00004362 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004363 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004364 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004365
Craig Topper3164f332014-03-11 03:39:26 +00004366 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004367 if (RegNo == 0) return 0;
4368 if (RegNo == 1) return 1;
4369 return -1;
4370 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004371
Craig Topper3164f332014-03-11 03:39:26 +00004372 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004373 switch (CC) {
4374 case CC_C:
4375 case CC_Swift:
4376 case CC_X86VectorCall:
4377 case CC_IntelOclBicc:
4378 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004379 case CC_PreserveMost:
4380 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004381 return CCCR_OK;
4382 default:
4383 return CCCR_Warning;
4384 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004385 }
4386
Craig Topper3164f332014-03-11 03:39:26 +00004387 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004388 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004389 }
4390
Pavel Chupinfd223e12014-08-04 12:39:43 +00004391 // for x32 we need it here explicitly
4392 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004393 unsigned getUnwindWordWidth() const override { return 64; }
4394 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004395
4396 bool validateGlobalRegisterVariable(StringRef RegName,
4397 unsigned RegSize,
4398 bool &HasSizeMismatch) const override {
4399 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4400 // handle.
4401 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4402 // Check that the register size is 64-bit.
4403 HasSizeMismatch = RegSize != 64;
4404 return true;
4405 }
4406
4407 // Check if the register is a 32-bit register the backend can handle.
4408 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4409 HasSizeMismatch);
4410 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004411};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004412
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004413// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004414class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004415public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004416 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4417 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004418 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004419 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004420 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004421 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004422 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004423 SizeType = UnsignedLongLong;
4424 PtrDiffType = SignedLongLong;
4425 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004426 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004427
Craig Topper3164f332014-03-11 03:39:26 +00004428 void getTargetDefines(const LangOptions &Opts,
4429 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004430 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004431 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004432 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004433
Craig Topper3164f332014-03-11 03:39:26 +00004434 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004435 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004436 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004437
Craig Topper3164f332014-03-11 03:39:26 +00004438 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004439 switch (CC) {
4440 case CC_X86StdCall:
4441 case CC_X86ThisCall:
4442 case CC_X86FastCall:
4443 return CCCR_Ignore;
4444 case CC_C:
4445 case CC_X86VectorCall:
4446 case CC_IntelOclBicc:
4447 case CC_X86_64SysV:
4448 return CCCR_OK;
4449 default:
4450 return CCCR_Warning;
4451 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004452 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004453};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004454
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004455// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004456class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004457public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004458 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4459 const TargetOptions &Opts)
4460 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004461 LongDoubleWidth = LongDoubleAlign = 64;
4462 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004463 }
Craig Topper3164f332014-03-11 03:39:26 +00004464 void getTargetDefines(const LangOptions &Opts,
4465 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004466 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4467 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004468 Builder.defineMacro("_M_X64", "100");
4469 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004470 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004471};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004472
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004473// x86-64 MinGW target
4474class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4475public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004476 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4477 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004478 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4479 // with x86 FP ops. Weird.
4480 LongDoubleWidth = LongDoubleAlign = 128;
4481 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4482 }
4483
Craig Topper3164f332014-03-11 03:39:26 +00004484 void getTargetDefines(const LangOptions &Opts,
4485 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004486 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004487 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004488 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004489 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004490
4491 // GCC defines this macro when it is using __gxx_personality_seh0.
4492 if (!Opts.SjLjExceptions)
4493 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004494 }
4495};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004496
Yaron Kerend030d112015-07-22 17:38:19 +00004497// x86-64 Cygwin target
4498class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4499public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004500 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4501 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004502 TLSSupported = false;
4503 WCharType = UnsignedShort;
4504 }
4505 void getTargetDefines(const LangOptions &Opts,
4506 MacroBuilder &Builder) const override {
4507 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4508 Builder.defineMacro("__x86_64__");
4509 Builder.defineMacro("__CYGWIN__");
4510 Builder.defineMacro("__CYGWIN64__");
4511 addCygMingDefines(Opts, Builder);
4512 DefineStd(Builder, "unix", Opts);
4513 if (Opts.CPlusPlus)
4514 Builder.defineMacro("_GNU_SOURCE");
4515
4516 // GCC defines this macro when it is using __gxx_personality_seh0.
4517 if (!Opts.SjLjExceptions)
4518 Builder.defineMacro("__SEH__");
4519 }
4520};
4521
Eli Friedman2857ccb2009-07-01 03:36:11 +00004522class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4523public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004524 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4525 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004526 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004527 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4528 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004529 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004530 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004531 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004532 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004533
4534 bool handleTargetFeatures(std::vector<std::string> &Features,
4535 DiagnosticsEngine &Diags) override {
4536 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4537 Diags))
4538 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004539 // We now know the features we have: we can decide how to align vectors.
4540 MaxVectorAlign =
4541 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004542 return true;
4543 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004544};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004545
Eli Friedman245f2292009-07-05 22:31:18 +00004546class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004548 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4549 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004550 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004551 Int64Type = SignedLongLong;
4552 }
4553};
Eli Friedman245f2292009-07-05 22:31:18 +00004554
Eli Friedman9fa28852012-08-08 23:57:20 +00004555class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4556public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004557 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4558 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004559 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004560 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004561 }
4562};
Tim Northover9bb857a2013-01-31 12:13:10 +00004563
Eli Friedmanf05b7722008-08-20 07:44:10 +00004564class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004565 // Possible FPU choices.
4566 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004567 VFP2FPU = (1 << 0),
4568 VFP3FPU = (1 << 1),
4569 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004570 NeonFPU = (1 << 3),
4571 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004572 };
4573
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004574 // Possible HWDiv features.
4575 enum HWDivMode {
4576 HWDivThumb = (1 << 0),
4577 HWDivARM = (1 << 1)
4578 };
4579
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004580 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004581 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004582 }
4583
4584 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4585 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004586
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004587 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004588
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004589 StringRef CPUProfile;
4590 StringRef CPUAttr;
4591
Rafael Espindolaeb265472013-08-21 21:59:03 +00004592 enum {
4593 FP_Default,
4594 FP_VFP,
4595 FP_Neon
4596 } FPMath;
4597
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004598 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004599 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004600 unsigned ArchProfile;
4601 unsigned ArchVersion;
4602
Bernard Ogdenda13af32013-10-24 18:32:51 +00004603 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004604
Logan Chien57086ce2012-10-10 06:56:20 +00004605 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004606 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004607
4608 // Initialized via features.
4609 unsigned SoftFloat : 1;
4610 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004611
Bernard Ogden18b57012013-10-29 09:47:51 +00004612 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004613 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004614 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004615 unsigned Unaligned : 1;
4616
4617 enum {
4618 LDREX_B = (1 << 0), /// byte (8-bit)
4619 LDREX_H = (1 << 1), /// half (16-bit)
4620 LDREX_W = (1 << 2), /// word (32-bit)
4621 LDREX_D = (1 << 3), /// double (64-bit)
4622 };
4623
4624 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004625
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004626 // ACLE 6.5.1 Hardware floating point
4627 enum {
4628 HW_FP_HP = (1 << 1), /// half (16-bit)
4629 HW_FP_SP = (1 << 2), /// single (32-bit)
4630 HW_FP_DP = (1 << 3), /// double (64-bit)
4631 };
4632 uint32_t HW_FP;
4633
Chris Lattner5cc15e02010-03-03 19:03:45 +00004634 static const Builtin::Info BuiltinInfo[];
4635
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004636 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004637 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004638
4639 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004640 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004641
Renato Golin9ba39232015-02-27 16:35:48 +00004642 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4643 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4644 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004645 SizeType = UnsignedLong;
4646 else
4647 SizeType = UnsignedInt;
4648
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004649 switch (T.getOS()) {
4650 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004651 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004652 break;
4653 case llvm::Triple::Win32:
4654 WCharType = UnsignedShort;
4655 break;
4656 case llvm::Triple::Linux:
4657 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004658 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4659 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004660 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004661 }
4662
4663 UseBitFieldTypeAlignment = true;
4664
4665 ZeroLengthBitfieldBoundary = 0;
4666
Tim Northover147cd2f2014-10-14 22:12:21 +00004667 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4668 // so set preferred for small types to 32.
4669 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004670 resetDataLayout(BigEndian
4671 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4672 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004673 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004674 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004675 resetDataLayout("e"
4676 "-m:w"
4677 "-p:32:32"
4678 "-i64:64"
4679 "-v128:64:128"
4680 "-a:0:32"
4681 "-n32"
4682 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004683 } else if (T.isOSNaCl()) {
4684 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004685 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004686 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004687 resetDataLayout(BigEndian
4688 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4689 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004690 }
4691
4692 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004693 }
4694
Tim Northover5627d392015-10-30 16:30:45 +00004695 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004696 const llvm::Triple &T = getTriple();
4697
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004698 IsAAPCS = false;
4699
Tim Northover5627d392015-10-30 16:30:45 +00004700 if (IsAAPCS16)
4701 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4702 else
4703 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004704
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004705 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004706 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004707 SizeType = UnsignedInt;
4708 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004709 SizeType = UnsignedLong;
4710
4711 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4712 WCharType = SignedInt;
4713
4714 // Do not respect the alignment of bit-field types when laying out
4715 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4716 UseBitFieldTypeAlignment = false;
4717
4718 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4719 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4720 /// gcc.
4721 ZeroLengthBitfieldBoundary = 32;
4722
Tim Northover5627d392015-10-30 16:30:45 +00004723 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4724 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004725 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004726 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004727 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004728 BigEndian
4729 ? "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 +00004730 : "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 +00004731 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004732 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004733 BigEndian
4734 ? "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 +00004735 : "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 +00004736
4737 // FIXME: Override "preferred align" for double and long long.
4738 }
4739
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004740 void setArchInfo() {
4741 StringRef ArchName = getTriple().getArchName();
4742
Renato Goline84b0002015-10-08 16:43:26 +00004743 ArchISA = llvm::ARM::parseArchISA(ArchName);
4744 CPU = llvm::ARM::getDefaultCPU(ArchName);
4745 unsigned AK = llvm::ARM::parseArch(ArchName);
4746 if (AK != llvm::ARM::AK_INVALID)
4747 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004748 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004749 }
4750
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004751 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004752 StringRef SubArch;
4753
4754 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004755 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004756 SubArch = llvm::ARM::getSubArch(ArchKind);
4757 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4758 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004759
4760 // cache CPU related strings
4761 CPUAttr = getCPUAttr();
4762 CPUProfile = getCPUProfile();
4763 }
4764
4765 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004766 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004767 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004768 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004769 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4770 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004771 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004772 if (ArchProfile == llvm::ARM::PK_M) {
4773 MaxAtomicPromoteWidth = 32;
4774 if (ShouldUseInlineAtomic)
4775 MaxAtomicInlineWidth = 32;
4776 }
4777 else {
4778 MaxAtomicPromoteWidth = 64;
4779 if (ShouldUseInlineAtomic)
4780 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004781 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004782 }
4783
4784 bool isThumb() const {
4785 return (ArchISA == llvm::ARM::IK_THUMB);
4786 }
4787
4788 bool supportsThumb() const {
4789 return CPUAttr.count('T') || ArchVersion >= 6;
4790 }
4791
4792 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004793 return CPUAttr.equals("6T2") ||
4794 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004795 }
4796
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004797 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004798 // For most sub-arches, the build attribute CPU name is enough.
4799 // For Cortex variants, it's slightly different.
4800 switch(ArchKind) {
4801 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004802 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004803 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004804 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004805 case llvm::ARM::AK_ARMV7S:
4806 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004807 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004808 return "7A";
4809 case llvm::ARM::AK_ARMV7R:
4810 return "7R";
4811 case llvm::ARM::AK_ARMV7M:
4812 return "7M";
4813 case llvm::ARM::AK_ARMV7EM:
4814 return "7EM";
4815 case llvm::ARM::AK_ARMV8A:
4816 return "8A";
4817 case llvm::ARM::AK_ARMV8_1A:
4818 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004819 case llvm::ARM::AK_ARMV8_2A:
4820 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004821 case llvm::ARM::AK_ARMV8MBaseline:
4822 return "8M_BASE";
4823 case llvm::ARM::AK_ARMV8MMainline:
4824 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004825 }
4826 }
4827
4828 StringRef getCPUProfile() const {
4829 switch(ArchProfile) {
4830 case llvm::ARM::PK_A:
4831 return "A";
4832 case llvm::ARM::PK_R:
4833 return "R";
4834 case llvm::ARM::PK_M:
4835 return "M";
4836 default:
4837 return "";
4838 }
4839 }
4840
Chris Lattner17df24e2008-04-21 18:56:49 +00004841public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004842 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4843 bool IsBigEndian)
4844 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4845 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004846 BigEndian = IsBigEndian;
4847
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004848 switch (getTriple().getOS()) {
4849 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004850 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004851 break;
4852 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004853 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004854 break;
4855 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004856
Renato Goline84b0002015-10-08 16:43:26 +00004857 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004858 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004859
Chris Lattner1a8f3942010-04-23 16:29:58 +00004860 // {} in inline assembly are neon specifiers, not assembly variant
4861 // specifiers.
4862 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004863
Eric Christopher0e261882014-12-05 01:06:59 +00004864 // FIXME: This duplicates code from the driver that sets the -target-abi
4865 // option - this code is used if -target-abi isn't passed and should
4866 // be unified in some way.
4867 if (Triple.isOSBinFormatMachO()) {
4868 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4869 // the frontend matches that.
4870 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4871 Triple.getOS() == llvm::Triple::UnknownOS ||
4872 StringRef(CPU).startswith("cortex-m")) {
4873 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004874 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004875 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004876 } else {
4877 setABI("apcs-gnu");
4878 }
4879 } else if (Triple.isOSWindows()) {
4880 // FIXME: this is invalid for WindowsCE
4881 setABI("aapcs");
4882 } else {
4883 // Select the default based on the platform.
4884 switch (Triple.getEnvironment()) {
4885 case llvm::Triple::Android:
4886 case llvm::Triple::GNUEABI:
4887 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004888 case llvm::Triple::MuslEABI:
4889 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004890 setABI("aapcs-linux");
4891 break;
4892 case llvm::Triple::EABIHF:
4893 case llvm::Triple::EABI:
4894 setABI("aapcs");
4895 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004896 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004897 setABI("apcs-gnu");
4898 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004899 default:
4900 if (Triple.getOS() == llvm::Triple::NetBSD)
4901 setABI("apcs-gnu");
4902 else
4903 setABI("aapcs");
4904 break;
4905 }
4906 }
John McCall86353412010-08-21 22:46:04 +00004907
4908 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004909 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004910
Renato Golin15b86152015-07-03 16:41:13 +00004911 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004912 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004913
James Molloya7139222012-03-12 09:14:10 +00004914 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004915 // the alignment of the zero-length bitfield is greater than the member
4916 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004917 // zero length bitfield.
4918 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004919
4920 if (Triple.getOS() == llvm::Triple::Linux ||
4921 Triple.getOS() == llvm::Triple::UnknownOS)
4922 this->MCountName =
4923 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004924 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004925
Alp Toker4925ba72014-06-07 23:30:42 +00004926 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004927
Craig Topper3164f332014-03-11 03:39:26 +00004928 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004929 ABI = Name;
4930
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004931 // The defaults (above) are for AAPCS, check if we need to change them.
4932 //
4933 // FIXME: We need support for -meabi... we could just mangle it into the
4934 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004935 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004936 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004937 return true;
4938 }
4939 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4940 setABIAAPCS();
4941 return true;
4942 }
4943 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004944 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004945
Renato Golinf5c4dec2015-05-27 13:33:00 +00004946 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004947 bool
4948 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4949 StringRef CPU,
4950 const std::vector<std::string> &FeaturesVec) const override {
4951
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004952 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004953 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004954
4955 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004956 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004957 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4958
4959 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004960 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004961 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4962
4963 for (const char *Feature : TargetFeatures)
4964 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004965 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004966
Eric Christopher007b0a02015-08-28 22:32:01 +00004967 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004968 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004969
Craig Topper3164f332014-03-11 03:39:26 +00004970 bool handleTargetFeatures(std::vector<std::string> &Features,
4971 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004972 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004973 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004974 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004975 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004976 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004977 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004978 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004979
Ranjeet Singhac08e532015-06-24 23:39:25 +00004980 // This does not diagnose illegal cases like having both
4981 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4982 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004983 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004984 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004985 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004986 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004987 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004988 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004989 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004990 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004991 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004992 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004993 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004994 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004995 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004996 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004997 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004998 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004999 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005000 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005001 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005002 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005003 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005004 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005005 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005006 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005007 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005008 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005009 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005010 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005011 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005012 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005013 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005014 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005015 } else if (Feature == "+strict-align") {
5016 Unaligned = 0;
5017 } else if (Feature == "+fp16") {
5018 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005019 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005020 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005021 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005022
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005023 switch (ArchVersion) {
5024 case 6:
5025 if (ArchProfile == llvm::ARM::PK_M)
5026 LDREX = 0;
5027 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5028 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5029 else
5030 LDREX = LDREX_W;
5031 break;
5032 case 7:
5033 if (ArchProfile == llvm::ARM::PK_M)
5034 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5035 else
5036 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5037 break;
5038 case 8:
5039 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5040 }
5041
Rafael Espindolaeb265472013-08-21 21:59:03 +00005042 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5043 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5044 return false;
5045 }
5046
5047 if (FPMath == FP_Neon)
5048 Features.push_back("+neonfp");
5049 else if (FPMath == FP_VFP)
5050 Features.push_back("-neonfp");
5051
Daniel Dunbar893d4752009-12-19 04:15:38 +00005052 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005053 auto Feature =
5054 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5055 if (Feature != Features.end())
5056 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005057
Rafael Espindolaeb265472013-08-21 21:59:03 +00005058 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005059 }
5060
Craig Topper3164f332014-03-11 03:39:26 +00005061 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005062 return llvm::StringSwitch<bool>(Feature)
5063 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005064 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005065 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005066 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005067 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005068 .Case("hwdiv", HWDiv & HWDivThumb)
5069 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005070 .Default(false);
5071 }
Renato Golin15b86152015-07-03 16:41:13 +00005072
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005073 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005074 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005075 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005076
Renato Golin15b86152015-07-03 16:41:13 +00005077 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005078 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005079 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005080 CPU = Name;
5081 return true;
5082 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005083
Craig Topper3164f332014-03-11 03:39:26 +00005084 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005085
Craig Topper3164f332014-03-11 03:39:26 +00005086 void getTargetDefines(const LangOptions &Opts,
5087 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005088 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005089 Builder.defineMacro("__arm");
5090 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005091 // For bare-metal none-eabi.
5092 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5093 getTriple().getEnvironment() == llvm::Triple::EABI)
5094 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005095
Chris Lattnerecd49032009-03-02 22:27:17 +00005096 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005097 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005098
5099 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5100 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005101 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005102 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5103
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005104 if (!CPUAttr.empty())
5105 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005106
5107 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005108 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005109 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005110
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005111 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005112 // ACLE 6.5.7 Crypto Extension
5113 if (Crypto)
5114 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5115 // ACLE 6.5.8 CRC32 Extension
5116 if (CRC)
5117 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5118 // ACLE 6.5.10 Numeric Maximum and Minimum
5119 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5120 // ACLE 6.5.9 Directed Rounding
5121 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005122 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005123
5124 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5125 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005126 // NOTE that the default profile is assumed to be 'A'
5127 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005128 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5129
Bradley Smithf4affc12016-03-03 13:52:22 +00005130 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5131 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5132 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5133 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005134 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005135 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005136 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005137 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5138
5139 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5140 // instruction set such as ARM or Thumb.
5141 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5142
5143 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5144
5145 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005146 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005147 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005148
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005149 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005150 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005151 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005152
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005153 // ACLE 6.4.4 LDREX/STREX
5154 if (LDREX)
5155 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5156
5157 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005158 if (ArchVersion == 5 ||
5159 (ArchVersion == 6 && CPUProfile != "M") ||
5160 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005161 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5162
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005163 // ACLE 6.5.1 Hardware Floating Point
5164 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005165 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005166
Yi Konga44c4d72014-06-27 21:25:42 +00005167 // ACLE predefines.
5168 Builder.defineMacro("__ARM_ACLE", "200");
5169
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005170 // FP16 support (we currently only support IEEE format).
5171 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5172 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5173
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005174 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005175 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005176 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5177
Mike Stump9d54bd72009-04-08 02:07:04 +00005178 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005179
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005180 // FIXME: It's more complicated than this and we don't really support
5181 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005182 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005183 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005184 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005185
David Tweed8f676532012-10-25 13:33:01 +00005186 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005187 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005188 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005189 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005190 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005191 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005192 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005193
Tim Northover28fc0e12016-04-28 13:59:55 +00005194 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5195 ABI == "aapcs16")
5196 Builder.defineMacro("__ARM_PCS_VFP", "1");
5197
Daniel Dunbar893d4752009-12-19 04:15:38 +00005198 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005199 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005200
5201 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005202 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005203
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005204 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005205 Builder.defineMacro("__THUMBEL__");
5206 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005207 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005208 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005209 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005210
5211 // ACLE 6.4.9 32-bit SIMD instructions
5212 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5213 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5214
5215 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005216 if (((HWDiv & HWDivThumb) && isThumb()) ||
5217 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005218 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005219 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005220 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005221
5222 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005223 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005224
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005225 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005226 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005227 if (FPU & VFP2FPU)
5228 Builder.defineMacro("__ARM_VFPV2__");
5229 if (FPU & VFP3FPU)
5230 Builder.defineMacro("__ARM_VFPV3__");
5231 if (FPU & VFP4FPU)
5232 Builder.defineMacro("__ARM_VFPV4__");
5233 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005234
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005235 // This only gets set when Neon instructions are actually available, unlike
5236 // the VFP define, hence the soft float and arch check. This is subtly
5237 // different from gcc, we follow the intent which was that it should be set
5238 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005239 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005240 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005241 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005242 // current AArch32 NEON implementations do not support double-precision
5243 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005244 Builder.defineMacro("__ARM_NEON_FP",
5245 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005246 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005247
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005248 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5249 Opts.ShortWChar ? "2" : "4");
5250
5251 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5252 Opts.ShortEnums ? "1" : "4");
5253
Bradley Smithf4affc12016-03-03 13:52:22 +00005254 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005255 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5256 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5257 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5258 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5259 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005260
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005261 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005262 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005263 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005264 }
5265
5266 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005267 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005268 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5269 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005270 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005271 }
5272
5273 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005274 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005275 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005276
5277 if (Opts.UnsafeFPMath)
5278 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005279
5280 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5281 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005282 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005283
Craig Topper6c03a542015-10-19 04:51:35 +00005284 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5285 return llvm::makeArrayRef(BuiltinInfo,
5286 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005287 }
Craig Topper3164f332014-03-11 03:39:26 +00005288 bool isCLZForZeroUndef() const override { return false; }
5289 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005290 return IsAAPCS
5291 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005292 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5293 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005294 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005295 ArrayRef<const char *> getGCCRegNames() const override;
5296 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005297 bool validateAsmConstraint(const char *&Name,
5298 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005299 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005300 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005301 case 'l': // r0-r7
5302 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005303 case 't': // VFP Floating point register single precision
5304 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005305 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005306 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005307 case 'I':
5308 case 'J':
5309 case 'K':
5310 case 'L':
5311 case 'M':
5312 // FIXME
5313 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005314 case 'Q': // A memory address that is a single base register.
5315 Info.setAllowsMemory();
5316 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005317 case 'U': // a memory reference...
5318 switch (Name[1]) {
5319 case 'q': // ...ARMV4 ldrsb
5320 case 'v': // ...VFP load/store (reg+constant offset)
5321 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005322 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005323 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005324 case 'n': // valid address for Neon doubleword vector load/store
5325 case 'm': // valid address for Neon element and structure load/store
5326 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005327 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005328 Info.setAllowsMemory();
5329 Name++;
5330 return true;
5331 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005332 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005333 return false;
5334 }
Craig Topper3164f332014-03-11 03:39:26 +00005335 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005336 std::string R;
5337 switch (*Constraint) {
5338 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005339 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005340 Constraint++;
5341 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005342 case 'p': // 'p' should be translated to 'r' by default.
5343 R = std::string("r");
5344 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005345 default:
5346 return std::string(1, *Constraint);
5347 }
5348 return R;
5349 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005350 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005351 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005352 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005353 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005354 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005355
Bill Wendling9d1ee112012-10-25 23:28:48 +00005356 // Strip off constraint modifiers.
5357 while (Constraint[0] == '=' ||
5358 Constraint[0] == '+' ||
5359 Constraint[0] == '&')
5360 Constraint = Constraint.substr(1);
5361
5362 switch (Constraint[0]) {
5363 default: break;
5364 case 'r': {
5365 switch (Modifier) {
5366 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005367 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005368 case 'q':
5369 // A register of size 32 cannot fit a vector type.
5370 return false;
5371 }
5372 }
5373 }
5374
5375 return true;
5376 }
Craig Topper3164f332014-03-11 03:39:26 +00005377 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005378 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005379 return "";
5380 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005381
Craig Topper3164f332014-03-11 03:39:26 +00005382 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005383 switch (CC) {
5384 case CC_AAPCS:
5385 case CC_AAPCS_VFP:
5386 case CC_Swift:
5387 return CCCR_OK;
5388 default:
5389 return CCCR_Warning;
5390 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005391 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005392
Craig Topper3164f332014-03-11 03:39:26 +00005393 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005394 if (RegNo == 0) return 0;
5395 if (RegNo == 1) return 1;
5396 return -1;
5397 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005398
5399 bool hasSjLjLowering() const override {
5400 return true;
5401 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005402};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005403
Rafael Espindolaeb265472013-08-21 21:59:03 +00005404bool ARMTargetInfo::setFPMath(StringRef Name) {
5405 if (Name == "neon") {
5406 FPMath = FP_Neon;
5407 return true;
5408 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5409 Name == "vfp4") {
5410 FPMath = FP_VFP;
5411 return true;
5412 }
5413 return false;
5414}
5415
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005416const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005417 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005418 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005419 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5420
5421 // Float registers
5422 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5423 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5424 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005425 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005426
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005427 // Double registers
5428 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5429 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005430 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5431 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005432
5433 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005434 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5435 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005436};
5437
Craig Topperf054e3a2015-10-19 03:52:27 +00005438ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5439 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005440}
5441
5442const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005443 { { "a1" }, "r0" },
5444 { { "a2" }, "r1" },
5445 { { "a3" }, "r2" },
5446 { { "a4" }, "r3" },
5447 { { "v1" }, "r4" },
5448 { { "v2" }, "r5" },
5449 { { "v3" }, "r6" },
5450 { { "v4" }, "r7" },
5451 { { "v5" }, "r8" },
5452 { { "v6", "rfp" }, "r9" },
5453 { { "sl" }, "r10" },
5454 { { "fp" }, "r11" },
5455 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005456 { { "r13" }, "sp" },
5457 { { "r14" }, "lr" },
5458 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005459 // The S, D and Q registers overlap, but aren't really aliases; we
5460 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005461};
5462
Craig Topperf054e3a2015-10-19 03:52:27 +00005463ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5464 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005465}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005466
5467const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005468#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005469 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005470#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5471 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005472#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005473
Craig Topper07d3b622015-08-07 05:14:44 +00005474#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005475 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005476#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005477 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005478#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5479 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005480#include "clang/Basic/BuiltinsARM.def"
5481};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005482
5483class ARMleTargetInfo : public ARMTargetInfo {
5484public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005485 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5486 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005487 void getTargetDefines(const LangOptions &Opts,
5488 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005489 Builder.defineMacro("__ARMEL__");
5490 ARMTargetInfo::getTargetDefines(Opts, Builder);
5491 }
5492};
5493
5494class ARMbeTargetInfo : public ARMTargetInfo {
5495public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005496 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5497 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005498 void getTargetDefines(const LangOptions &Opts,
5499 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005500 Builder.defineMacro("__ARMEB__");
5501 Builder.defineMacro("__ARM_BIG_ENDIAN");
5502 ARMTargetInfo::getTargetDefines(Opts, Builder);
5503 }
5504};
Chris Lattner17df24e2008-04-21 18:56:49 +00005505
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005506class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5507 const llvm::Triple Triple;
5508public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005509 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5510 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005511 WCharType = UnsignedShort;
5512 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005513 }
5514 void getVisualStudioDefines(const LangOptions &Opts,
5515 MacroBuilder &Builder) const {
5516 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5517
5518 // FIXME: this is invalid for WindowsCE
5519 Builder.defineMacro("_M_ARM_NT", "1");
5520 Builder.defineMacro("_M_ARMT", "_M_ARM");
5521 Builder.defineMacro("_M_THUMB", "_M_ARM");
5522
5523 assert((Triple.getArch() == llvm::Triple::arm ||
5524 Triple.getArch() == llvm::Triple::thumb) &&
5525 "invalid architecture for Windows ARM target info");
5526 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5527 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5528
5529 // TODO map the complete set of values
5530 // 31: VFPv3 40: VFPv4
5531 Builder.defineMacro("_M_ARM_FP", "31");
5532 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005533 BuiltinVaListKind getBuiltinVaListKind() const override {
5534 return TargetInfo::CharPtrBuiltinVaList;
5535 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005536 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5537 switch (CC) {
5538 case CC_X86StdCall:
5539 case CC_X86ThisCall:
5540 case CC_X86FastCall:
5541 case CC_X86VectorCall:
5542 return CCCR_Ignore;
5543 case CC_C:
5544 return CCCR_OK;
5545 default:
5546 return CCCR_Warning;
5547 }
5548 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005549};
5550
5551// Windows ARM + Itanium C++ ABI Target
5552class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5553public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005554 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5555 const TargetOptions &Opts)
5556 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005557 TheCXXABI.set(TargetCXXABI::GenericARM);
5558 }
5559
5560 void getTargetDefines(const LangOptions &Opts,
5561 MacroBuilder &Builder) const override {
5562 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5563
5564 if (Opts.MSVCCompat)
5565 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5566 }
5567};
5568
5569// Windows ARM, MS (C++) ABI
5570class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5571public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005572 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5573 const TargetOptions &Opts)
5574 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005575 TheCXXABI.set(TargetCXXABI::Microsoft);
5576 }
5577
5578 void getTargetDefines(const LangOptions &Opts,
5579 MacroBuilder &Builder) const override {
5580 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5581 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5582 }
5583};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005584
Yaron Keren321249c2015-07-15 13:32:23 +00005585// ARM MinGW target
5586class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5587public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005588 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5589 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005590 TheCXXABI.set(TargetCXXABI::GenericARM);
5591 }
5592
5593 void getTargetDefines(const LangOptions &Opts,
5594 MacroBuilder &Builder) const override {
5595 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5596 DefineStd(Builder, "WIN32", Opts);
5597 DefineStd(Builder, "WINNT", Opts);
5598 Builder.defineMacro("_ARM_");
5599 addMinGWDefines(Opts, Builder);
5600 }
5601};
5602
5603// ARM Cygwin target
5604class CygwinARMTargetInfo : public ARMleTargetInfo {
5605public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005606 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5607 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005608 TLSSupported = false;
5609 WCharType = UnsignedShort;
5610 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005611 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005612 }
5613 void getTargetDefines(const LangOptions &Opts,
5614 MacroBuilder &Builder) const override {
5615 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5616 Builder.defineMacro("_ARM_");
5617 Builder.defineMacro("__CYGWIN__");
5618 Builder.defineMacro("__CYGWIN32__");
5619 DefineStd(Builder, "unix", Opts);
5620 if (Opts.CPlusPlus)
5621 Builder.defineMacro("_GNU_SOURCE");
5622 }
5623};
5624
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005625class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005626protected:
Craig Topper3164f332014-03-11 03:39:26 +00005627 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5628 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005629 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005630 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005631
Torok Edwinb2b37c62009-06-30 17:10:35 +00005632public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005633 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5634 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005635 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005636 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005637 // FIXME: This should be based off of the target features in
5638 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005639 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005640
Tim Northoverd88ecb32016-01-27 19:32:40 +00005641 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005642 // Darwin on iOS uses a variant of the ARM C++ ABI.
5643 TheCXXABI.set(TargetCXXABI::WatchOS);
5644
5645 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5646 // size_t is long, it's a bit weird for it to be int.
5647 PtrDiffType = SignedLong;
5648
5649 // BOOL should be a real boolean on the new ABI
5650 UseSignedCharForObjCBool = false;
5651 } else
5652 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005653 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005654};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005655
Tim Northover573cbee2014-05-24 12:52:07 +00005656class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005657 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005658 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5659 static const char *const GCCRegNames[];
5660
James Molloy75f5f9e2014-04-16 15:33:48 +00005661 enum FPUModeEnum {
5662 FPUMode,
5663 NeonMode
5664 };
5665
5666 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005667 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005668 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005669 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005670 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005671
Tim Northovera2ee4332014-03-29 15:09:45 +00005672 static const Builtin::Info BuiltinInfo[];
5673
5674 std::string ABI;
5675
5676public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005677 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005678 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005679 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5680 WCharType = SignedInt;
5681
5682 // NetBSD apparently prefers consistency across ARM targets to consistency
5683 // across 64-bit targets.
5684 Int64Type = SignedLongLong;
5685 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005686 } else {
5687 WCharType = UnsignedInt;
5688 Int64Type = SignedLong;
5689 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005690 }
5691
Tim Northovera2ee4332014-03-29 15:09:45 +00005692 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005693 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005694 MaxAtomicInlineWidth = 128;
5695 MaxAtomicPromoteWidth = 128;
5696
Tim Northovera6a19f12015-02-06 01:25:07 +00005697 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005698 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5699
Tim Northovera2ee4332014-03-29 15:09:45 +00005700 // {} in inline assembly are neon specifiers, not assembly variant
5701 // specifiers.
5702 NoAsmVariants = true;
5703
Tim Northover7ad87af2015-01-16 18:44:04 +00005704 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5705 // contributes to the alignment of the containing aggregate in the same way
5706 // a plain (non bit-field) member of that type would, without exception for
5707 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005708 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005709 UseZeroLengthBitfieldAlignment = true;
5710
Tim Northover573cbee2014-05-24 12:52:07 +00005711 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005712 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005713
5714 if (Triple.getOS() == llvm::Triple::Linux ||
5715 Triple.getOS() == llvm::Triple::UnknownOS)
5716 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005717 }
5718
Alp Toker4925ba72014-06-07 23:30:42 +00005719 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005720 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005721 if (Name != "aapcs" && Name != "darwinpcs")
5722 return false;
5723
5724 ABI = Name;
5725 return true;
5726 }
5727
David Blaikie1cbb9712014-11-14 19:09:44 +00005728 bool setCPU(const std::string &Name) override {
Renato Golin3b8709c2016-05-25 12:36:31 +00005729 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5730 .Case("generic", true)
5731 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5732 "cortex-a35", "exynos-m1", true)
Sjoerd Meijer90df4a72016-06-02 10:48:37 +00005733 .Case("cortex-a73", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005734 .Case("cyclone", true)
5735 .Case("kryo", true)
Pankaj Gode3267e842016-06-29 10:00:31 +00005736 .Case("vulcan", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005737 .Default(false);
5738 return CPUKnown;
Tim Northovera2ee4332014-03-29 15:09:45 +00005739 }
5740
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005741 void getTargetDefines(const LangOptions &Opts,
5742 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005743 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005744 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005745
5746 // Target properties.
5747 Builder.defineMacro("_LP64");
5748 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005749
5750 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5751 Builder.defineMacro("__ARM_ACLE", "200");
5752 Builder.defineMacro("__ARM_ARCH", "8");
5753 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5754
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005755 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005756 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005757 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005758
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005759 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5760 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5761 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5762 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005763 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005764 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5765 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005766
5767 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5768
5769 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005770 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005771
5772 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5773 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005774 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5775 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005776
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005777 if (Opts.UnsafeFPMath)
5778 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005779
5780 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5781
5782 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5783 Opts.ShortEnums ? "1" : "4");
5784
James Molloy75f5f9e2014-04-16 15:33:48 +00005785 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005786 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005787 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005788 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005789 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005790
Bradley Smith418c5932014-05-02 15:17:51 +00005791 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005792 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005793
James Molloy75f5f9e2014-04-16 15:33:48 +00005794 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005795 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5796
5797 if (Unaligned)
5798 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005799
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005800 if (V8_1A)
5801 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5802
Reid Klecknerd167d422015-05-06 15:31:46 +00005803 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5804 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5805 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5806 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5807 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005808 }
5809
Craig Topper6c03a542015-10-19 04:51:35 +00005810 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5811 return llvm::makeArrayRef(BuiltinInfo,
5812 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005813 }
5814
David Blaikie1cbb9712014-11-14 19:09:44 +00005815 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005816 return Feature == "aarch64" ||
5817 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005818 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005819 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005820 }
5821
James Molloy5e73df52014-04-16 15:06:20 +00005822 bool handleTargetFeatures(std::vector<std::string> &Features,
5823 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005824 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005825 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005826 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005827 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005828 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005829
Eric Christopher610fe112015-08-26 08:21:55 +00005830 for (const auto &Feature : Features) {
5831 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005832 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005833 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005834 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005835 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005836 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005837 if (Feature == "+strict-align")
5838 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005839 if (Feature == "+v8.1a")
5840 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005841 }
5842
James Y Knightb214cbc2016-03-04 19:00:41 +00005843 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005844
5845 return true;
5846 }
5847
John McCall477f2bb2016-03-03 06:39:32 +00005848 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5849 switch (CC) {
5850 case CC_C:
5851 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005852 case CC_PreserveMost:
5853 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005854 return CCCR_OK;
5855 default:
5856 return CCCR_Warning;
5857 }
5858 }
5859
David Blaikie1cbb9712014-11-14 19:09:44 +00005860 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005861
David Blaikie1cbb9712014-11-14 19:09:44 +00005862 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005863 return TargetInfo::AArch64ABIBuiltinVaList;
5864 }
5865
Craig Topperf054e3a2015-10-19 03:52:27 +00005866 ArrayRef<const char *> getGCCRegNames() const override;
5867 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005868
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005869 bool validateAsmConstraint(const char *&Name,
5870 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005871 switch (*Name) {
5872 default:
5873 return false;
5874 case 'w': // Floating point and SIMD registers (V0-V31)
5875 Info.setAllowsRegister();
5876 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005877 case 'I': // Constant that can be used with an ADD instruction
5878 case 'J': // Constant that can be used with a SUB instruction
5879 case 'K': // Constant that can be used with a 32-bit logical instruction
5880 case 'L': // Constant that can be used with a 64-bit logical instruction
5881 case 'M': // Constant that can be used as a 32-bit MOV immediate
5882 case 'N': // Constant that can be used as a 64-bit MOV immediate
5883 case 'Y': // Floating point constant zero
5884 case 'Z': // Integer constant zero
5885 return true;
5886 case 'Q': // A memory reference with base register and no offset
5887 Info.setAllowsMemory();
5888 return true;
5889 case 'S': // A symbolic address
5890 Info.setAllowsRegister();
5891 return true;
5892 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005893 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5894 // Utf: A memory address suitable for ldp/stp in TF mode.
5895 // Usa: An absolute symbolic address.
5896 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5897 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005898 case 'z': // Zero register, wzr or xzr
5899 Info.setAllowsRegister();
5900 return true;
5901 case 'x': // Floating point and SIMD registers (V0-V15)
5902 Info.setAllowsRegister();
5903 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005904 }
5905 return false;
5906 }
5907
Akira Hatanaka987f1862014-08-22 06:05:21 +00005908 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005909 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005910 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005911 // Strip off constraint modifiers.
5912 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5913 Constraint = Constraint.substr(1);
5914
5915 switch (Constraint[0]) {
5916 default:
5917 return true;
5918 case 'z':
5919 case 'r': {
5920 switch (Modifier) {
5921 case 'x':
5922 case 'w':
5923 // For now assume that the person knows what they're
5924 // doing with the modifier.
5925 return true;
5926 default:
5927 // By default an 'r' constraint will be in the 'x'
5928 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005929 if (Size == 64)
5930 return true;
5931
5932 SuggestedModifier = "w";
5933 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005934 }
5935 }
5936 }
5937 }
5938
David Blaikie1cbb9712014-11-14 19:09:44 +00005939 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005940
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005941 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005942 if (RegNo == 0)
5943 return 0;
5944 if (RegNo == 1)
5945 return 1;
5946 return -1;
5947 }
5948};
5949
Tim Northover573cbee2014-05-24 12:52:07 +00005950const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005951 // 32-bit Integer registers
5952 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5953 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5954 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5955
5956 // 64-bit Integer registers
5957 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5958 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5959 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5960
5961 // 32-bit floating point regsisters
5962 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5963 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5964 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5965
5966 // 64-bit floating point regsisters
5967 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5968 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5969 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5970
5971 // Vector registers
5972 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5973 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5974 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5975};
5976
Craig Topperf054e3a2015-10-19 03:52:27 +00005977ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5978 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005979}
5980
Tim Northover573cbee2014-05-24 12:52:07 +00005981const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005982 { { "w31" }, "wsp" },
5983 { { "x29" }, "fp" },
5984 { { "x30" }, "lr" },
5985 { { "x31" }, "sp" },
5986 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5987 // don't want to substitute one of these for a different-sized one.
5988};
5989
Craig Topperf054e3a2015-10-19 03:52:27 +00005990ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5991 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005992}
5993
Tim Northover573cbee2014-05-24 12:52:07 +00005994const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005995#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005996 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005997#include "clang/Basic/BuiltinsNEON.def"
5998
5999#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006000 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006001#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006002};
James Molloy5e73df52014-04-16 15:06:20 +00006003
Tim Northover573cbee2014-05-24 12:52:07 +00006004class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006005 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006006 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006007 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006008 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006009 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006010 }
6011
6012public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006013 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6014 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00006015 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006016 }
James Molloy5e73df52014-04-16 15:06:20 +00006017 void getTargetDefines(const LangOptions &Opts,
6018 MacroBuilder &Builder) const override {
6019 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006020 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006021 }
6022};
6023
Tim Northover573cbee2014-05-24 12:52:07 +00006024class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006025 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006026 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006027 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006028 }
6029
6030public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006031 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6032 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006033 void getTargetDefines(const LangOptions &Opts,
6034 MacroBuilder &Builder) const override {
6035 Builder.defineMacro("__AARCH64EB__");
6036 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6037 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006038 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006039 }
6040};
Tim Northovera2ee4332014-03-29 15:09:45 +00006041
Tim Northover573cbee2014-05-24 12:52:07 +00006042class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006043protected:
6044 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6045 MacroBuilder &Builder) const override {
6046 Builder.defineMacro("__AARCH64_SIMD__");
6047 Builder.defineMacro("__ARM64_ARCH_8__");
6048 Builder.defineMacro("__ARM_NEON__");
6049 Builder.defineMacro("__LITTLE_ENDIAN__");
6050 Builder.defineMacro("__REGISTER_PREFIX__", "");
6051 Builder.defineMacro("__arm64", "1");
6052 Builder.defineMacro("__arm64__", "1");
6053
6054 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6055 }
6056
Tim Northovera2ee4332014-03-29 15:09:45 +00006057public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006058 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6059 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006060 Int64Type = SignedLongLong;
6061 WCharType = SignedInt;
6062 UseSignedCharForObjCBool = false;
6063
Tim Northovera6a19f12015-02-06 01:25:07 +00006064 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006065 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6066
6067 TheCXXABI.set(TargetCXXABI::iOS64);
6068 }
6069
David Blaikie1cbb9712014-11-14 19:09:44 +00006070 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006071 return TargetInfo::CharPtrBuiltinVaList;
6072 }
6073};
Tim Northovera2ee4332014-03-29 15:09:45 +00006074
Tony Linthicum76329bf2011-12-12 21:14:55 +00006075// Hexagon abstract base class
6076class HexagonTargetInfo : public TargetInfo {
6077 static const Builtin::Info BuiltinInfo[];
6078 static const char * const GCCRegNames[];
6079 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6080 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006081 bool HasHVX, HasHVXDouble;
6082
Tony Linthicum76329bf2011-12-12 21:14:55 +00006083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006084 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6085 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006086 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006087 // Specify the vector alignment explicitly. For v512x1, the calculated
6088 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6089 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006090 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006091 "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 +00006092 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006093 SizeType = UnsignedInt;
6094 PtrDiffType = SignedInt;
6095 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006096
6097 // {} in inline assembly are packet specifiers, not assembly variant
6098 // specifiers.
6099 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006100
6101 LargeArrayMinWidth = 64;
6102 LargeArrayAlign = 64;
6103 UseBitFieldTypeAlignment = true;
6104 ZeroLengthBitfieldBoundary = 32;
6105 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006106 }
6107
Craig Topper6c03a542015-10-19 04:51:35 +00006108 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6109 return llvm::makeArrayRef(BuiltinInfo,
6110 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006111 }
6112
Craig Topper3164f332014-03-11 03:39:26 +00006113 bool validateAsmConstraint(const char *&Name,
6114 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006115 switch (*Name) {
6116 case 'v':
6117 case 'q':
6118 if (HasHVX) {
6119 Info.setAllowsRegister();
6120 return true;
6121 }
6122 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006123 case 's':
6124 // Relocatable constant.
6125 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006126 }
6127 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006128 }
6129
Craig Topper3164f332014-03-11 03:39:26 +00006130 void getTargetDefines(const LangOptions &Opts,
6131 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006132
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006133 bool isCLZForZeroUndef() const override { return false; }
6134
Craig Topper3164f332014-03-11 03:39:26 +00006135 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006136 return llvm::StringSwitch<bool>(Feature)
6137 .Case("hexagon", true)
6138 .Case("hvx", HasHVX)
6139 .Case("hvx-double", HasHVXDouble)
6140 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006141 }
Craig Topper3164f332014-03-11 03:39:26 +00006142
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006143 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6144 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6145 const override;
6146
6147 bool handleTargetFeatures(std::vector<std::string> &Features,
6148 DiagnosticsEngine &Diags) override;
6149
Craig Topper3164f332014-03-11 03:39:26 +00006150 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006151 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006152 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006153 ArrayRef<const char *> getGCCRegNames() const override;
6154 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006155 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006156 return "";
6157 }
Sebastian Pop86500282012-01-13 20:37:10 +00006158
6159 static const char *getHexagonCPUSuffix(StringRef Name) {
6160 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006161 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006162 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006163 .Case("hexagonv55", "55")
6164 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006165 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006166 }
6167
Craig Topper3164f332014-03-11 03:39:26 +00006168 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006169 if (!getHexagonCPUSuffix(Name))
6170 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006171 CPU = Name;
6172 return true;
6173 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006174
6175 int getEHDataRegisterNumber(unsigned RegNo) const override {
6176 return RegNo < 2 ? RegNo : -1;
6177 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006178};
6179
6180void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006181 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006182 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006183 Builder.defineMacro("__hexagon__", "1");
6184
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006185 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006186 Builder.defineMacro("__HEXAGON_V4__");
6187 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006188 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006189 Builder.defineMacro("__QDSP6_V4__");
6190 Builder.defineMacro("__QDSP6_ARCH__", "4");
6191 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006192 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006193 Builder.defineMacro("__HEXAGON_V5__");
6194 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6195 if(Opts.HexagonQdsp6Compat) {
6196 Builder.defineMacro("__QDSP6_V5__");
6197 Builder.defineMacro("__QDSP6_ARCH__", "5");
6198 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006199 } else if (CPU == "hexagonv55") {
6200 Builder.defineMacro("__HEXAGON_V55__");
6201 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6202 Builder.defineMacro("__QDSP6_V55__");
6203 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006204 } else if (CPU == "hexagonv60") {
6205 Builder.defineMacro("__HEXAGON_V60__");
6206 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6207 Builder.defineMacro("__QDSP6_V60__");
6208 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006209 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006210
6211 if (hasFeature("hvx")) {
6212 Builder.defineMacro("__HVX__");
6213 if (hasFeature("hvx-double"))
6214 Builder.defineMacro("__HVXDBL__");
6215 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006216}
6217
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006218bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6219 DiagnosticsEngine &Diags) {
6220 for (auto &F : Features) {
6221 if (F == "+hvx")
6222 HasHVX = true;
6223 else if (F == "-hvx")
6224 HasHVX = HasHVXDouble = false;
6225 else if (F == "+hvx-double")
6226 HasHVX = HasHVXDouble = true;
6227 else if (F == "-hvx-double")
6228 HasHVXDouble = false;
6229 }
6230 return true;
6231}
6232
6233bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6234 DiagnosticsEngine &Diags, StringRef CPU,
6235 const std::vector<std::string> &FeaturesVec) const {
6236 // Default for v60: -hvx, -hvx-double.
6237 Features["hvx"] = false;
6238 Features["hvx-double"] = false;
6239
6240 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6241}
6242
6243
6244const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006245 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6246 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6247 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6248 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6249 "p0", "p1", "p2", "p3",
6250 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6251};
6252
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006253ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006254 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006255}
6256
Tony Linthicum76329bf2011-12-12 21:14:55 +00006257const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6258 { { "sp" }, "r29" },
6259 { { "fp" }, "r30" },
6260 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006261};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006262
Craig Topperf054e3a2015-10-19 03:52:27 +00006263ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6264 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006265}
6266
6267
6268const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006269#define BUILTIN(ID, TYPE, ATTRS) \
6270 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6271#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6272 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006273#include "clang/Basic/BuiltinsHexagon.def"
6274};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006275
Jacques Pienaard964cc22016-03-28 21:02:54 +00006276class LanaiTargetInfo : public TargetInfo {
6277 // Class for Lanai (32-bit).
6278 // The CPU profiles supported by the Lanai backend
6279 enum CPUKind {
6280 CK_NONE,
6281 CK_V11,
6282 } CPU;
6283
6284 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6285 static const char *const GCCRegNames[];
6286
6287public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006288 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6289 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006290 // Description string has to be kept in sync with backend.
6291 resetDataLayout("E" // Big endian
6292 "-m:e" // ELF name manging
6293 "-p:32:32" // 32 bit pointers, 32 bit aligned
6294 "-i64:64" // 64 bit integers, 64 bit aligned
6295 "-a:0:32" // 32 bit alignment of objects of aggregate type
6296 "-n32" // 32 bit native integer width
6297 "-S64" // 64 bit natural stack alignment
6298 );
6299
6300 // Setting RegParmMax equal to what mregparm was set to in the old
6301 // toolchain
6302 RegParmMax = 4;
6303
6304 // Set the default CPU to V11
6305 CPU = CK_V11;
6306
6307 // Temporary approach to make everything at least word-aligned and allow for
6308 // safely casting between pointers with different alignment requirements.
6309 // TODO: Remove this when there are no more cast align warnings on the
6310 // firmware.
6311 MinGlobalAlign = 32;
6312 }
6313
6314 void getTargetDefines(const LangOptions &Opts,
6315 MacroBuilder &Builder) const override {
6316 // Define __lanai__ when building for target lanai.
6317 Builder.defineMacro("__lanai__");
6318
6319 // Set define for the CPU specified.
6320 switch (CPU) {
6321 case CK_V11:
6322 Builder.defineMacro("__LANAI_V11__");
6323 break;
6324 case CK_NONE:
6325 llvm_unreachable("Unhandled target CPU");
6326 }
6327 }
6328
6329 bool setCPU(const std::string &Name) override {
6330 CPU = llvm::StringSwitch<CPUKind>(Name)
6331 .Case("v11", CK_V11)
6332 .Default(CK_NONE);
6333
6334 return CPU != CK_NONE;
6335 }
6336
6337 bool hasFeature(StringRef Feature) const override {
6338 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6339 }
6340
6341 ArrayRef<const char *> getGCCRegNames() const override;
6342
6343 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6344
6345 BuiltinVaListKind getBuiltinVaListKind() const override {
6346 return TargetInfo::VoidPtrBuiltinVaList;
6347 }
6348
6349 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6350
6351 bool validateAsmConstraint(const char *&Name,
6352 TargetInfo::ConstraintInfo &info) const override {
6353 return false;
6354 }
6355
6356 const char *getClobbers() const override { return ""; }
6357};
6358
6359const char *const LanaiTargetInfo::GCCRegNames[] = {
6360 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6361 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6362 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6363
6364ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6365 return llvm::makeArrayRef(GCCRegNames);
6366}
6367
6368const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6369 {{"pc"}, "r2"},
6370 {{"sp"}, "r4"},
6371 {{"fp"}, "r5"},
6372 {{"rv"}, "r8"},
6373 {{"rr1"}, "r10"},
6374 {{"rr2"}, "r11"},
6375 {{"rca"}, "r15"},
6376};
6377
6378ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6379 return llvm::makeArrayRef(GCCRegAliases);
6380}
6381
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006382// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6383class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006384 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6385 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006386 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006387public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006388 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006389 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006390
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006391 int getEHDataRegisterNumber(unsigned RegNo) const override {
6392 if (RegNo == 0) return 24;
6393 if (RegNo == 1) return 25;
6394 return -1;
6395 }
6396
Craig Topper3164f332014-03-11 03:39:26 +00006397 bool handleTargetFeatures(std::vector<std::string> &Features,
6398 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006399 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006400 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6401 if (Feature != Features.end()) {
6402 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006403 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006404 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006405 }
Craig Topper3164f332014-03-11 03:39:26 +00006406 void getTargetDefines(const LangOptions &Opts,
6407 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006408 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006409 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006410
6411 if (SoftFloat)
6412 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006413 }
Craig Topper3164f332014-03-11 03:39:26 +00006414
6415 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006416 return llvm::StringSwitch<bool>(Feature)
6417 .Case("softfloat", SoftFloat)
6418 .Case("sparc", true)
6419 .Default(false);
6420 }
Craig Topper3164f332014-03-11 03:39:26 +00006421
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006422 bool hasSjLjLowering() const override {
6423 return true;
6424 }
6425
Craig Topper6c03a542015-10-19 04:51:35 +00006426 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006427 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006428 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006429 }
Craig Topper3164f332014-03-11 03:39:26 +00006430 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006431 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006432 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006433 ArrayRef<const char *> getGCCRegNames() const override;
6434 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006435 bool validateAsmConstraint(const char *&Name,
6436 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006437 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006438 switch (*Name) {
6439 case 'I': // Signed 13-bit constant
6440 case 'J': // Zero
6441 case 'K': // 32-bit constant with the low 12 bits clear
6442 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6443 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6444 case 'N': // Same as 'K' but zext (required for SIMode)
6445 case 'O': // The constant 4096
6446 return true;
6447 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006448 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006449 }
Craig Topper3164f332014-03-11 03:39:26 +00006450 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006451 // FIXME: Implement!
6452 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006453 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006454
6455 // No Sparc V7 for now, the backend doesn't support it anyway.
6456 enum CPUKind {
6457 CK_GENERIC,
6458 CK_V8,
6459 CK_SUPERSPARC,
6460 CK_SPARCLITE,
6461 CK_F934,
6462 CK_HYPERSPARC,
6463 CK_SPARCLITE86X,
6464 CK_SPARCLET,
6465 CK_TSC701,
6466 CK_V9,
6467 CK_ULTRASPARC,
6468 CK_ULTRASPARC3,
6469 CK_NIAGARA,
6470 CK_NIAGARA2,
6471 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006472 CK_NIAGARA4,
6473 CK_MYRIAD2_1,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006474 CK_MYRIAD2_2,
6475 CK_LEON2,
6476 CK_LEON2_AT697E,
6477 CK_LEON2_AT697F,
6478 CK_LEON3,
6479 CK_LEON3_UT699,
6480 CK_LEON3_GR712RC,
6481 CK_LEON4,
6482 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006483 } CPU = CK_GENERIC;
6484
6485 enum CPUGeneration {
6486 CG_V8,
6487 CG_V9,
6488 };
6489
6490 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6491 switch (Kind) {
6492 case CK_GENERIC:
6493 case CK_V8:
6494 case CK_SUPERSPARC:
6495 case CK_SPARCLITE:
6496 case CK_F934:
6497 case CK_HYPERSPARC:
6498 case CK_SPARCLITE86X:
6499 case CK_SPARCLET:
6500 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006501 case CK_MYRIAD2_1:
6502 case CK_MYRIAD2_2:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006503 case CK_LEON2:
6504 case CK_LEON2_AT697E:
6505 case CK_LEON2_AT697F:
6506 case CK_LEON3:
6507 case CK_LEON3_UT699:
6508 case CK_LEON3_GR712RC:
6509 case CK_LEON4:
6510 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006511 return CG_V8;
6512 case CK_V9:
6513 case CK_ULTRASPARC:
6514 case CK_ULTRASPARC3:
6515 case CK_NIAGARA:
6516 case CK_NIAGARA2:
6517 case CK_NIAGARA3:
6518 case CK_NIAGARA4:
6519 return CG_V9;
6520 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006521 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006522 }
6523
6524 CPUKind getCPUKind(StringRef Name) const {
6525 return llvm::StringSwitch<CPUKind>(Name)
6526 .Case("v8", CK_V8)
6527 .Case("supersparc", CK_SUPERSPARC)
6528 .Case("sparclite", CK_SPARCLITE)
6529 .Case("f934", CK_F934)
6530 .Case("hypersparc", CK_HYPERSPARC)
6531 .Case("sparclite86x", CK_SPARCLITE86X)
6532 .Case("sparclet", CK_SPARCLET)
6533 .Case("tsc701", CK_TSC701)
6534 .Case("v9", CK_V9)
6535 .Case("ultrasparc", CK_ULTRASPARC)
6536 .Case("ultrasparc3", CK_ULTRASPARC3)
6537 .Case("niagara", CK_NIAGARA)
6538 .Case("niagara2", CK_NIAGARA2)
6539 .Case("niagara3", CK_NIAGARA3)
6540 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006541 .Case("myriad2", CK_MYRIAD2_1)
6542 .Case("myriad2.1", CK_MYRIAD2_1)
6543 .Case("myriad2.2", CK_MYRIAD2_2)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006544 .Case("leon2", CK_LEON2)
6545 .Case("at697e", CK_LEON2_AT697E)
6546 .Case("at697f", CK_LEON2_AT697F)
6547 .Case("leon3", CK_LEON3)
6548 .Case("ut699", CK_LEON3_UT699)
6549 .Case("gr712rc", CK_LEON3_GR712RC)
6550 .Case("leon4", CK_LEON4)
6551 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006552 .Default(CK_GENERIC);
6553 }
6554
6555 bool setCPU(const std::string &Name) override {
6556 CPU = getCPUKind(Name);
6557 return CPU != CK_GENERIC;
6558 }
Gabor Greif49991682008-02-21 16:29:08 +00006559};
6560
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006561const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006562 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6563 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6564 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6565 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6566};
6567
Craig Topperf054e3a2015-10-19 03:52:27 +00006568ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6569 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006570}
6571
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006572const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006573 { { "g0" }, "r0" },
6574 { { "g1" }, "r1" },
6575 { { "g2" }, "r2" },
6576 { { "g3" }, "r3" },
6577 { { "g4" }, "r4" },
6578 { { "g5" }, "r5" },
6579 { { "g6" }, "r6" },
6580 { { "g7" }, "r7" },
6581 { { "o0" }, "r8" },
6582 { { "o1" }, "r9" },
6583 { { "o2" }, "r10" },
6584 { { "o3" }, "r11" },
6585 { { "o4" }, "r12" },
6586 { { "o5" }, "r13" },
6587 { { "o6", "sp" }, "r14" },
6588 { { "o7" }, "r15" },
6589 { { "l0" }, "r16" },
6590 { { "l1" }, "r17" },
6591 { { "l2" }, "r18" },
6592 { { "l3" }, "r19" },
6593 { { "l4" }, "r20" },
6594 { { "l5" }, "r21" },
6595 { { "l6" }, "r22" },
6596 { { "l7" }, "r23" },
6597 { { "i0" }, "r24" },
6598 { { "i1" }, "r25" },
6599 { { "i2" }, "r26" },
6600 { { "i3" }, "r27" },
6601 { { "i4" }, "r28" },
6602 { { "i5" }, "r29" },
6603 { { "i6", "fp" }, "r30" },
6604 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006605};
6606
Craig Topperf054e3a2015-10-19 03:52:27 +00006607ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6608 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006609}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006610
6611// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6612class SparcV8TargetInfo : public SparcTargetInfo {
6613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006614 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6615 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006616 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006617 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6618 switch (getTriple().getOS()) {
6619 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006620 SizeType = UnsignedInt;
6621 IntPtrType = SignedInt;
6622 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006623 break;
6624 case llvm::Triple::NetBSD:
6625 case llvm::Triple::OpenBSD:
6626 SizeType = UnsignedLong;
6627 IntPtrType = SignedLong;
6628 PtrDiffType = SignedLong;
6629 break;
Brad Smith56495d52015-08-13 22:00:53 +00006630 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006631 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006632 }
6633
Craig Topper3164f332014-03-11 03:39:26 +00006634 void getTargetDefines(const LangOptions &Opts,
6635 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006636 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006637 switch (getCPUGeneration(CPU)) {
6638 case CG_V8:
6639 Builder.defineMacro("__sparcv8");
6640 if (getTriple().getOS() != llvm::Triple::Solaris)
6641 Builder.defineMacro("__sparcv8__");
6642 break;
6643 case CG_V9:
6644 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006645 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006646 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006647 Builder.defineMacro("__sparc_v9__");
6648 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006649 break;
6650 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006651 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6652 switch (CPU) {
6653 case CK_MYRIAD2_1:
6654 Builder.defineMacro("__myriad2", "1");
6655 Builder.defineMacro("__myriad2__", "1");
6656 break;
6657 case CK_MYRIAD2_2:
6658 Builder.defineMacro("__myriad2", "2");
6659 Builder.defineMacro("__myriad2__", "2");
6660 break;
6661 default:
6662 break;
6663 }
6664 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006665 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006666
6667 bool hasSjLjLowering() const override {
6668 return true;
6669 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006670};
6671
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006672// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6673class SparcV8elTargetInfo : public SparcV8TargetInfo {
6674 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006675 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6676 : SparcV8TargetInfo(Triple, Opts) {
6677 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6678 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006679 }
6680};
6681
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006682// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6683class SparcV9TargetInfo : public SparcTargetInfo {
6684public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006685 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6686 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006687 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006688 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006689 // This is an LP64 platform.
6690 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006691
6692 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006693 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006694 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006695 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006696 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006697 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006698
6699 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6700 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6701 LongDoubleWidth = 128;
6702 LongDoubleAlign = 128;
6703 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006704 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006705 }
6706
Craig Topper3164f332014-03-11 03:39:26 +00006707 void getTargetDefines(const LangOptions &Opts,
6708 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006709 SparcTargetInfo::getTargetDefines(Opts, Builder);
6710 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006711 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006712 // Solaris doesn't need these variants, but the BSDs do.
6713 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006714 Builder.defineMacro("__sparc64__");
6715 Builder.defineMacro("__sparc_v9__");
6716 Builder.defineMacro("__sparcv9__");
6717 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006718 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006719
Craig Topper3164f332014-03-11 03:39:26 +00006720 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006721 if (!SparcTargetInfo::setCPU(Name))
6722 return false;
6723 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006724 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006725};
6726
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006727class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006728 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006729 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006730 std::string CPU;
6731 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006732 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006733
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006734public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006735 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006736 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6737 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006738 IntMaxType = SignedLong;
6739 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006740 TLSSupported = true;
6741 IntWidth = IntAlign = 32;
6742 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6743 PointerWidth = PointerAlign = 64;
6744 LongDoubleWidth = 128;
6745 LongDoubleAlign = 64;
6746 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006747 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006748 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006749 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 +00006750 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6751 }
6752 void getTargetDefines(const LangOptions &Opts,
6753 MacroBuilder &Builder) const override {
6754 Builder.defineMacro("__s390__");
6755 Builder.defineMacro("__s390x__");
6756 Builder.defineMacro("__zarch__");
6757 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006758
6759 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6760 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6761 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6762 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6763
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006764 if (HasTransactionalExecution)
6765 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006766 if (Opts.ZVector)
6767 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006768 }
Craig Topper6c03a542015-10-19 04:51:35 +00006769 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6770 return llvm::makeArrayRef(BuiltinInfo,
6771 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006772 }
6773
Craig Topperf054e3a2015-10-19 03:52:27 +00006774 ArrayRef<const char *> getGCCRegNames() const override;
6775 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006776 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006777 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006778 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006779 bool validateAsmConstraint(const char *&Name,
6780 TargetInfo::ConstraintInfo &info) const override;
6781 const char *getClobbers() const override {
6782 // FIXME: Is this really right?
6783 return "";
6784 }
6785 BuiltinVaListKind getBuiltinVaListKind() const override {
6786 return TargetInfo::SystemZBuiltinVaList;
6787 }
6788 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006789 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006790 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6791 .Case("z10", true)
6792 .Case("z196", true)
6793 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006794 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006795 .Default(false);
6796
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006797 return CPUKnown;
6798 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006799 bool
6800 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6801 StringRef CPU,
6802 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006803 if (CPU == "zEC12")
6804 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006805 if (CPU == "z13") {
6806 Features["transactional-execution"] = true;
6807 Features["vector"] = true;
6808 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006809 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006810 }
6811
6812 bool handleTargetFeatures(std::vector<std::string> &Features,
6813 DiagnosticsEngine &Diags) override {
6814 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006815 for (const auto &Feature : Features) {
6816 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006817 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006818 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006819 HasVector = true;
6820 }
6821 // If we use the vector ABI, vector types are 64-bit aligned.
6822 if (HasVector) {
6823 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006824 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6825 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006826 }
6827 return true;
6828 }
6829
6830 bool hasFeature(StringRef Feature) const override {
6831 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006832 .Case("systemz", true)
6833 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006834 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006835 .Default(false);
6836 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006837
Bryan Chane3f1ed52016-04-28 13:56:43 +00006838 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6839 switch (CC) {
6840 case CC_C:
6841 case CC_Swift:
6842 return CCCR_OK;
6843 default:
6844 return CCCR_Warning;
6845 }
6846 }
6847
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006848 StringRef getABI() const override {
6849 if (HasVector)
6850 return "vector";
6851 return "";
6852 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006853
6854 bool useFloat128ManglingForLongDouble() const override {
6855 return true;
6856 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006857};
6858
6859const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6860#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006861 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006862#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6863 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006864#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006865};
6866
6867const char *const SystemZTargetInfo::GCCRegNames[] = {
6868 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6869 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6870 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6871 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6872};
6873
Craig Topperf054e3a2015-10-19 03:52:27 +00006874ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6875 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006876}
6877
6878bool SystemZTargetInfo::
6879validateAsmConstraint(const char *&Name,
6880 TargetInfo::ConstraintInfo &Info) const {
6881 switch (*Name) {
6882 default:
6883 return false;
6884
6885 case 'a': // Address register
6886 case 'd': // Data register (equivalent to 'r')
6887 case 'f': // Floating-point register
6888 Info.setAllowsRegister();
6889 return true;
6890
6891 case 'I': // Unsigned 8-bit constant
6892 case 'J': // Unsigned 12-bit constant
6893 case 'K': // Signed 16-bit constant
6894 case 'L': // Signed 20-bit displacement (on all targets we support)
6895 case 'M': // 0x7fffffff
6896 return true;
6897
6898 case 'Q': // Memory with base and unsigned 12-bit displacement
6899 case 'R': // Likewise, plus an index
6900 case 'S': // Memory with base and signed 20-bit displacement
6901 case 'T': // Likewise, plus an index
6902 Info.setAllowsMemory();
6903 return true;
6904 }
6905}
Ulrich Weigand47445072013-05-06 16:26:41 +00006906
Eric Christopherc48497a2015-09-18 21:26:24 +00006907class MSP430TargetInfo : public TargetInfo {
6908 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006909
Eric Christopherc48497a2015-09-18 21:26:24 +00006910public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006911 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6912 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006913 BigEndian = false;
6914 TLSSupported = false;
6915 IntWidth = 16;
6916 IntAlign = 16;
6917 LongWidth = 32;
6918 LongLongWidth = 64;
6919 LongAlign = LongLongAlign = 16;
6920 PointerWidth = 16;
6921 PointerAlign = 16;
6922 SuitableAlign = 16;
6923 SizeType = UnsignedInt;
6924 IntMaxType = SignedLongLong;
6925 IntPtrType = SignedInt;
6926 PtrDiffType = SignedInt;
6927 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006928 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006929 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006930 void getTargetDefines(const LangOptions &Opts,
6931 MacroBuilder &Builder) const override {
6932 Builder.defineMacro("MSP430");
6933 Builder.defineMacro("__MSP430__");
6934 // FIXME: defines for different 'flavours' of MCU
6935 }
Craig Topper6c03a542015-10-19 04:51:35 +00006936 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006937 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006938 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006939 }
6940 bool hasFeature(StringRef Feature) const override {
6941 return Feature == "msp430";
6942 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006943 ArrayRef<const char *> getGCCRegNames() const override;
6944 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006945 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006946 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006947 }
6948 bool validateAsmConstraint(const char *&Name,
6949 TargetInfo::ConstraintInfo &info) const override {
6950 // FIXME: implement
6951 switch (*Name) {
6952 case 'K': // the constant 1
6953 case 'L': // constant -1^20 .. 1^19
6954 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006955 return true;
6956 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006957 // No target constraints for now.
6958 return false;
6959 }
6960 const char *getClobbers() const override {
6961 // FIXME: Is this really right?
6962 return "";
6963 }
6964 BuiltinVaListKind getBuiltinVaListKind() const override {
6965 // FIXME: implement
6966 return TargetInfo::CharPtrBuiltinVaList;
6967 }
6968};
6969
6970const char *const MSP430TargetInfo::GCCRegNames[] = {
6971 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6972 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6973
Craig Topperf054e3a2015-10-19 03:52:27 +00006974ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6975 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006976}
6977
6978// LLVM and Clang cannot be used directly to output native binaries for
6979// target, but is used to compile C code to llvm bitcode with correct
6980// type and alignment information.
6981//
6982// TCE uses the llvm bitcode as input and uses it for generating customized
6983// target processor and program binary. TCE co-design environment is
6984// publicly available in http://tce.cs.tut.fi
6985
6986static const unsigned TCEOpenCLAddrSpaceMap[] = {
6987 3, // opencl_global
6988 4, // opencl_local
6989 5, // opencl_constant
6990 // FIXME: generic has to be added to the target
6991 0, // opencl_generic
6992 0, // cuda_device
6993 0, // cuda_constant
6994 0 // cuda_shared
6995};
6996
6997class TCETargetInfo : public TargetInfo {
6998public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006999 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7000 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007001 TLSSupported = false;
7002 IntWidth = 32;
7003 LongWidth = LongLongWidth = 32;
7004 PointerWidth = 32;
7005 IntAlign = 32;
7006 LongAlign = LongLongAlign = 32;
7007 PointerAlign = 32;
7008 SuitableAlign = 32;
7009 SizeType = UnsignedInt;
7010 IntMaxType = SignedLong;
7011 IntPtrType = SignedInt;
7012 PtrDiffType = SignedInt;
7013 FloatWidth = 32;
7014 FloatAlign = 32;
7015 DoubleWidth = 32;
7016 DoubleAlign = 32;
7017 LongDoubleWidth = 32;
7018 LongDoubleAlign = 32;
7019 FloatFormat = &llvm::APFloat::IEEEsingle;
7020 DoubleFormat = &llvm::APFloat::IEEEsingle;
7021 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007022 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7023 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007024 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7025 UseAddrSpaceMapMangling = true;
7026 }
7027
7028 void getTargetDefines(const LangOptions &Opts,
7029 MacroBuilder &Builder) const override {
7030 DefineStd(Builder, "tce", Opts);
7031 Builder.defineMacro("__TCE__");
7032 Builder.defineMacro("__TCE_V1__");
7033 }
7034 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7035
Craig Topper6c03a542015-10-19 04:51:35 +00007036 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007037 const char *getClobbers() const override { return ""; }
7038 BuiltinVaListKind getBuiltinVaListKind() const override {
7039 return TargetInfo::VoidPtrBuiltinVaList;
7040 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007041 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007042 bool validateAsmConstraint(const char *&Name,
7043 TargetInfo::ConstraintInfo &info) const override {
7044 return true;
7045 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007046 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7047 return None;
7048 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007049};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007050
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007051class BPFTargetInfo : public TargetInfo {
7052public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007053 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7054 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007055 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7056 SizeType = UnsignedLong;
7057 PtrDiffType = SignedLong;
7058 IntPtrType = SignedLong;
7059 IntMaxType = SignedLong;
7060 Int64Type = SignedLong;
7061 RegParmMax = 5;
7062 if (Triple.getArch() == llvm::Triple::bpfeb) {
7063 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007064 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007065 } else {
7066 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00007067 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007068 }
7069 MaxAtomicPromoteWidth = 64;
7070 MaxAtomicInlineWidth = 64;
7071 TLSSupported = false;
7072 }
7073 void getTargetDefines(const LangOptions &Opts,
7074 MacroBuilder &Builder) const override {
7075 DefineStd(Builder, "bpf", Opts);
7076 Builder.defineMacro("__BPF__");
7077 }
7078 bool hasFeature(StringRef Feature) const override {
7079 return Feature == "bpf";
7080 }
7081
Craig Topper6c03a542015-10-19 04:51:35 +00007082 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007083 const char *getClobbers() const override {
7084 return "";
7085 }
7086 BuiltinVaListKind getBuiltinVaListKind() const override {
7087 return TargetInfo::VoidPtrBuiltinVaList;
7088 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007089 ArrayRef<const char *> getGCCRegNames() const override {
7090 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007091 }
7092 bool validateAsmConstraint(const char *&Name,
7093 TargetInfo::ConstraintInfo &info) const override {
7094 return true;
7095 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007096 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7097 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007098 }
7099};
7100
Daniel Sanders4672af62016-05-27 11:51:02 +00007101class MipsTargetInfo : public TargetInfo {
7102 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007103 StringRef Layout;
7104
7105 if (ABI == "o32")
7106 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7107 else if (ABI == "n32")
7108 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7109 else if (ABI == "n64")
7110 Layout = "m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7111 else
7112 llvm_unreachable("Invalid ABI");
7113
7114 if (BigEndian)
7115 resetDataLayout(("E-" + Layout).str());
7116 else
7117 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007118 }
7119
Akira Hatanaka9064e362013-10-29 18:30:33 +00007120
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007121 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007122 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007123 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007124 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007125 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007126 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007127 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007128 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007129 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007130 enum DspRevEnum {
7131 NoDSP, DSP1, DSP2
7132 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007133 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007134
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007135protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007136 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007137 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007138
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007139public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007140 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007141 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7142 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7143 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007144 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007145 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7146 getTriple().getArch() == llvm::Triple::mips64;
7147
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007148 setABI((getTriple().getArch() == llvm::Triple::mips ||
7149 getTriple().getArch() == llvm::Triple::mipsel)
7150 ? "o32"
7151 : "n64");
7152
7153 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007154 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007155
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007156 bool isNaN2008Default() const {
7157 return CPU == "mips32r6" || CPU == "mips64r6";
7158 }
7159
7160 bool isFP64Default() const {
7161 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7162 }
7163
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007164 bool isNan2008() const override {
7165 return IsNan2008;
7166 }
7167
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007168 bool processorSupportsGPR64() const {
7169 return llvm::StringSwitch<bool>(CPU)
7170 .Case("mips3", true)
7171 .Case("mips4", true)
7172 .Case("mips5", true)
7173 .Case("mips64", true)
7174 .Case("mips64r2", true)
7175 .Case("mips64r3", true)
7176 .Case("mips64r5", true)
7177 .Case("mips64r6", true)
7178 .Case("octeon", true)
7179 .Default(false);
7180 return false;
7181 }
7182
Alp Toker4925ba72014-06-07 23:30:42 +00007183 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007184 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007185 if (Name == "o32") {
7186 setO32ABITypes();
7187 ABI = Name;
7188 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007189 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007190
7191 if (Name == "n32") {
7192 setN32ABITypes();
7193 ABI = Name;
7194 return true;
7195 }
7196 if (Name == "n64") {
7197 setN64ABITypes();
7198 ABI = Name;
7199 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007200 }
7201 return false;
7202 }
7203
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007204 void setO32ABITypes() {
7205 Int64Type = SignedLongLong;
7206 IntMaxType = Int64Type;
7207 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7208 LongDoubleWidth = LongDoubleAlign = 64;
7209 LongWidth = LongAlign = 32;
7210 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7211 PointerWidth = PointerAlign = 32;
7212 PtrDiffType = SignedInt;
7213 SizeType = UnsignedInt;
7214 SuitableAlign = 64;
7215 }
7216
7217 void setN32N64ABITypes() {
7218 LongDoubleWidth = LongDoubleAlign = 128;
7219 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7220 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7221 LongDoubleWidth = LongDoubleAlign = 64;
7222 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7223 }
7224 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7225 SuitableAlign = 128;
7226 }
7227
Daniel Sanders4672af62016-05-27 11:51:02 +00007228 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007229 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007230 Int64Type = SignedLong;
7231 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007232 LongWidth = LongAlign = 64;
7233 PointerWidth = PointerAlign = 64;
7234 PtrDiffType = SignedLong;
7235 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007236 }
7237
7238 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007239 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007240 Int64Type = SignedLongLong;
7241 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007242 LongWidth = LongAlign = 32;
7243 PointerWidth = PointerAlign = 32;
7244 PtrDiffType = SignedInt;
7245 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007246 }
7247
Craig Topper3164f332014-03-11 03:39:26 +00007248 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007249 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007250 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007251 .Case("mips1", true)
7252 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007253 .Case("mips3", true)
7254 .Case("mips4", true)
7255 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007256 .Case("mips32", true)
7257 .Case("mips32r2", true)
7258 .Case("mips32r3", true)
7259 .Case("mips32r5", true)
7260 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007261 .Case("mips64", true)
7262 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007263 .Case("mips64r3", true)
7264 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007265 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007266 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007267 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007268 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007269 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007270 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007271 bool
7272 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7273 StringRef CPU,
7274 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007275 if (CPU.empty())
7276 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007277 if (CPU == "octeon")
7278 Features["mips64r2"] = Features["cnmips"] = true;
7279 else
7280 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007281 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007282 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007283
Craig Topper3164f332014-03-11 03:39:26 +00007284 void getTargetDefines(const LangOptions &Opts,
7285 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007286 if (BigEndian) {
7287 DefineStd(Builder, "MIPSEB", Opts);
7288 Builder.defineMacro("_MIPSEB");
7289 } else {
7290 DefineStd(Builder, "MIPSEL", Opts);
7291 Builder.defineMacro("_MIPSEL");
7292 }
7293
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007294 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007295 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007296 if (Opts.GNUMode)
7297 Builder.defineMacro("mips");
7298
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007299 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007300 Builder.defineMacro("__mips", "32");
7301 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7302 } else {
7303 Builder.defineMacro("__mips", "64");
7304 Builder.defineMacro("__mips64");
7305 Builder.defineMacro("__mips64__");
7306 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7307 }
7308
7309 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7310 .Cases("mips32", "mips64", "1")
7311 .Cases("mips32r2", "mips64r2", "2")
7312 .Cases("mips32r3", "mips64r3", "3")
7313 .Cases("mips32r5", "mips64r5", "5")
7314 .Cases("mips32r6", "mips64r6", "6")
7315 .Default("");
7316 if (!ISARev.empty())
7317 Builder.defineMacro("__mips_isa_rev", ISARev);
7318
7319 if (ABI == "o32") {
7320 Builder.defineMacro("__mips_o32");
7321 Builder.defineMacro("_ABIO32", "1");
7322 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007323 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007324 Builder.defineMacro("__mips_n32");
7325 Builder.defineMacro("_ABIN32", "2");
7326 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7327 } else if (ABI == "n64") {
7328 Builder.defineMacro("__mips_n64");
7329 Builder.defineMacro("_ABI64", "3");
7330 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7331 } else
7332 llvm_unreachable("Invalid ABI.");
7333
Simon Atanasyan683535b2012-08-29 19:14:58 +00007334 Builder.defineMacro("__REGISTER_PREFIX__", "");
7335
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007336 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007337 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007338 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007339 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007340 case SoftFloat:
7341 Builder.defineMacro("__mips_soft_float", Twine(1));
7342 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007343 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007344
Simon Atanasyan16071912013-04-14 14:07:30 +00007345 if (IsSingleFloat)
7346 Builder.defineMacro("__mips_single_float", Twine(1));
7347
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007348 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7349 Builder.defineMacro("_MIPS_FPSET",
7350 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7351
Simon Atanasyan72244b62012-07-05 16:06:06 +00007352 if (IsMips16)
7353 Builder.defineMacro("__mips16", Twine(1));
7354
Simon Atanasyan60777612013-04-14 14:07:51 +00007355 if (IsMicromips)
7356 Builder.defineMacro("__mips_micromips", Twine(1));
7357
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007358 if (IsNan2008)
7359 Builder.defineMacro("__mips_nan2008", Twine(1));
7360
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007361 switch (DspRev) {
7362 default:
7363 break;
7364 case DSP1:
7365 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7366 Builder.defineMacro("__mips_dsp", Twine(1));
7367 break;
7368 case DSP2:
7369 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7370 Builder.defineMacro("__mips_dspr2", Twine(1));
7371 Builder.defineMacro("__mips_dsp", Twine(1));
7372 break;
7373 }
7374
Jack Carter44ff1e52013-08-12 17:20:29 +00007375 if (HasMSA)
7376 Builder.defineMacro("__mips_msa", Twine(1));
7377
Simon Atanasyan26f19672012-04-05 19:28:31 +00007378 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7379 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7380 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007381
7382 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7383 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007384
7385 // These shouldn't be defined for MIPS-I but there's no need to check
7386 // for that since MIPS-I isn't supported.
7387 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7388 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7389 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007390
7391 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7392 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7393 // the instructions exist but using them violates the ABI since they
7394 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7395 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007396 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007397 }
7398
Craig Topper6c03a542015-10-19 04:51:35 +00007399 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7400 return llvm::makeArrayRef(BuiltinInfo,
7401 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007402 }
Craig Topper3164f332014-03-11 03:39:26 +00007403 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007404 return llvm::StringSwitch<bool>(Feature)
7405 .Case("mips", true)
7406 .Case("fp64", HasFP64)
7407 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007408 }
Craig Topper3164f332014-03-11 03:39:26 +00007409 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007410 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007411 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007412 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007413 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007414 // CPU register names
7415 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007416 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7417 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7418 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007419 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7420 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007421 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7422 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7423 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7424 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007425 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007426 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007427 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7428 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007429 // MSA register names
7430 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7431 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7432 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7433 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7434 // MSA control register names
7435 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7436 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007437 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007438 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007439 }
Craig Topper3164f332014-03-11 03:39:26 +00007440 bool validateAsmConstraint(const char *&Name,
7441 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007442 switch (*Name) {
7443 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007444 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007445 case 'r': // CPU registers.
7446 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007447 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007448 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007449 case 'c': // $25 for indirect jumps
7450 case 'l': // lo register
7451 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007452 Info.setAllowsRegister();
7453 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007454 case 'I': // Signed 16-bit constant
7455 case 'J': // Integer 0
7456 case 'K': // Unsigned 16-bit constant
7457 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7458 case 'M': // Constants not loadable via lui, addiu, or ori
7459 case 'N': // Constant -1 to -65535
7460 case 'O': // A signed 15-bit constant
7461 case 'P': // A constant between 1 go 65535
7462 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007463 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007464 Info.setAllowsMemory();
7465 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007466 case 'Z':
7467 if (Name[1] == 'C') { // An address usable by ll, and sc.
7468 Info.setAllowsMemory();
7469 Name++; // Skip over 'Z'.
7470 return true;
7471 }
7472 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007473 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007474 }
7475
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007476 std::string convertConstraint(const char *&Constraint) const override {
7477 std::string R;
7478 switch (*Constraint) {
7479 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7480 if (Constraint[1] == 'C') {
7481 R = std::string("^") + std::string(Constraint, 2);
7482 Constraint++;
7483 return R;
7484 }
7485 break;
7486 }
7487 return TargetInfo::convertConstraint(Constraint);
7488 }
7489
Craig Topper3164f332014-03-11 03:39:26 +00007490 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007491 // In GCC, $1 is not widely used in generated code (it's used only in a few
7492 // specific situations), so there is no real need for users to add it to
7493 // the clobbers list if they want to use it in their inline assembly code.
7494 //
7495 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7496 // code generation, so using it in inline assembly without adding it to the
7497 // clobbers list can cause conflicts between the inline assembly code and
7498 // the surrounding generated code.
7499 //
7500 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7501 // operands, which will conflict with the ".set at" assembler option (which
7502 // we use only for inline assembly, in order to maintain compatibility with
7503 // GCC) and will also conflict with the user's usage of $1.
7504 //
7505 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7506 // register for generated code is to automatically clobber $1 for all inline
7507 // assembly code.
7508 //
7509 // FIXME: We should automatically clobber $1 only for inline assembly code
7510 // which actually uses it. This would allow LLVM to use $1 for inline
7511 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007512 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007513 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007514
Craig Topper3164f332014-03-11 03:39:26 +00007515 bool handleTargetFeatures(std::vector<std::string> &Features,
7516 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007517 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007518 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007519 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007520 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007521 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007522 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007523 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007524
Eric Christopher610fe112015-08-26 08:21:55 +00007525 for (const auto &Feature : Features) {
7526 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007527 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007528 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007529 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007530 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007531 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007532 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007533 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007534 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007535 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007536 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007537 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007538 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007539 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007540 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007541 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007542 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007543 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007544 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007545 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007546 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007547 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007548 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007549
James Y Knightb214cbc2016-03-04 19:00:41 +00007550 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007551
Rafael Espindolaeb265472013-08-21 21:59:03 +00007552 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007553 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007554
Craig Topper3164f332014-03-11 03:39:26 +00007555 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007556 if (RegNo == 0) return 4;
7557 if (RegNo == 1) return 5;
7558 return -1;
7559 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007560
7561 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007562
7563 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7564 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7565 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7566 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7567 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7568 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7569 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7570 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7571 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7572 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7573 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7574 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7575 {{"ra"}, "$31"}};
7576 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7577 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7578 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7579 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7580 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7581 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7582 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7583 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7584 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7585 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7586 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7587 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007588 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007589 return llvm::makeArrayRef(O32RegAliases);
7590 return llvm::makeArrayRef(NewABIRegAliases);
7591 }
7592
7593 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007594 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007595 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007596
7597 bool validateTarget(DiagnosticsEngine &Diags) const override {
7598 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7599 // this yet. It's better to fail here than on the backend assertion.
7600 if (processorSupportsGPR64() && ABI == "o32") {
7601 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7602 return false;
7603 }
7604
7605 // 64-bit ABI's require 64-bit CPU's.
7606 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7607 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7608 return false;
7609 }
7610
7611 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7612 // can't handle this yet. It's better to fail here than on the
7613 // backend assertion.
7614 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7615 getTriple().getArch() == llvm::Triple::mips64el) &&
7616 ABI == "o32") {
7617 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7618 << ABI << getTriple().str();
7619 return false;
7620 }
7621
7622 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7623 // can't handle this yet. It's better to fail here than on the
7624 // backend assertion.
7625 if ((getTriple().getArch() == llvm::Triple::mips ||
7626 getTriple().getArch() == llvm::Triple::mipsel) &&
7627 (ABI == "n32" || ABI == "n64")) {
7628 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7629 << ABI << getTriple().str();
7630 return false;
7631 }
7632
7633 return true;
7634 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007635};
7636
Daniel Sanders4672af62016-05-27 11:51:02 +00007637const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007638#define BUILTIN(ID, TYPE, ATTRS) \
7639 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7640#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7641 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007642#include "clang/Basic/BuiltinsMips.def"
7643};
7644
Ivan Krasindd7403e2011-08-24 20:22:22 +00007645class PNaClTargetInfo : public TargetInfo {
7646public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007647 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7648 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007649 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007650 this->LongAlign = 32;
7651 this->LongWidth = 32;
7652 this->PointerAlign = 32;
7653 this->PointerWidth = 32;
7654 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007655 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007656 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007657 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007658 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007659 this->SizeType = TargetInfo::UnsignedInt;
7660 this->PtrDiffType = TargetInfo::SignedInt;
7661 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007662 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007663 }
7664
Craig Toppere6f17d02014-03-11 04:07:52 +00007665 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007666 Builder.defineMacro("__le32__");
7667 Builder.defineMacro("__pnacl__");
7668 }
Craig Topper3164f332014-03-11 03:39:26 +00007669 void getTargetDefines(const LangOptions &Opts,
7670 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007671 getArchDefines(Opts, Builder);
7672 }
Craig Topper3164f332014-03-11 03:39:26 +00007673 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007674 return Feature == "pnacl";
7675 }
Craig Topper6c03a542015-10-19 04:51:35 +00007676 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007677 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007678 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007679 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007680 ArrayRef<const char *> getGCCRegNames() const override;
7681 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007682 bool validateAsmConstraint(const char *&Name,
7683 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007684 return false;
7685 }
7686
Craig Topper3164f332014-03-11 03:39:26 +00007687 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007688 return "";
7689 }
7690};
7691
Craig Topperf054e3a2015-10-19 03:52:27 +00007692ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7693 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007694}
7695
Craig Topperf054e3a2015-10-19 03:52:27 +00007696ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7697 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007698}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007699
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007700// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007701class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007702public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007703 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7704 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007705
7706 BuiltinVaListKind getBuiltinVaListKind() const override {
7707 return TargetInfo::PNaClABIBuiltinVaList;
7708 }
7709};
7710
JF Bastien643817d2014-09-12 17:52:47 +00007711class Le64TargetInfo : public TargetInfo {
7712 static const Builtin::Info BuiltinInfo[];
7713
7714public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007715 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7716 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007717 BigEndian = false;
7718 NoAsmVariants = true;
7719 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7720 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007721 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007722 }
7723
7724 void getTargetDefines(const LangOptions &Opts,
7725 MacroBuilder &Builder) const override {
7726 DefineStd(Builder, "unix", Opts);
7727 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7728 Builder.defineMacro("__ELF__");
7729 }
Craig Topper6c03a542015-10-19 04:51:35 +00007730 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7731 return llvm::makeArrayRef(BuiltinInfo,
7732 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007733 }
7734 BuiltinVaListKind getBuiltinVaListKind() const override {
7735 return TargetInfo::PNaClABIBuiltinVaList;
7736 }
7737 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007738 ArrayRef<const char *> getGCCRegNames() const override {
7739 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007740 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007741 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7742 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007743 }
7744 bool validateAsmConstraint(const char *&Name,
7745 TargetInfo::ConstraintInfo &Info) const override {
7746 return false;
7747 }
7748
7749 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007750};
Dan Gohmanc2853072015-09-03 22:51:53 +00007751
7752class WebAssemblyTargetInfo : public TargetInfo {
7753 static const Builtin::Info BuiltinInfo[];
7754
7755 enum SIMDEnum {
7756 NoSIMD,
7757 SIMD128,
7758 } SIMDLevel;
7759
7760public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007761 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007762 : TargetInfo(T), SIMDLevel(NoSIMD) {
7763 BigEndian = false;
7764 NoAsmVariants = true;
7765 SuitableAlign = 128;
7766 LargeArrayMinWidth = 128;
7767 LargeArrayAlign = 128;
7768 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007769 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007770 LongDoubleWidth = LongDoubleAlign = 128;
7771 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007772 }
7773
7774protected:
7775 void getTargetDefines(const LangOptions &Opts,
7776 MacroBuilder &Builder) const override {
7777 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7778 if (SIMDLevel >= SIMD128)
7779 Builder.defineMacro("__wasm_simd128__");
7780 }
7781
7782private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007783 bool
7784 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7785 StringRef CPU,
7786 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007787 if (CPU == "bleeding-edge")
7788 Features["simd128"] = true;
7789 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7790 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007791 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007792 return llvm::StringSwitch<bool>(Feature)
7793 .Case("simd128", SIMDLevel >= SIMD128)
7794 .Default(false);
7795 }
7796 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007797 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007798 for (const auto &Feature : Features) {
7799 if (Feature == "+simd128") {
7800 SIMDLevel = std::max(SIMDLevel, SIMD128);
7801 continue;
7802 }
7803 if (Feature == "-simd128") {
7804 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7805 continue;
7806 }
7807
7808 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7809 << "-target-feature";
7810 return false;
7811 }
7812 return true;
7813 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007814 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007815 return llvm::StringSwitch<bool>(Name)
7816 .Case("mvp", true)
7817 .Case("bleeding-edge", true)
7818 .Case("generic", true)
7819 .Default(false);
7820 }
Craig Topper6c03a542015-10-19 04:51:35 +00007821 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7822 return llvm::makeArrayRef(BuiltinInfo,
7823 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007824 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007825 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007826 return VoidPtrBuiltinVaList;
7827 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007828 ArrayRef<const char *> getGCCRegNames() const final {
7829 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007830 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007831 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7832 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007833 }
7834 bool
7835 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007836 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007837 return false;
7838 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007839 const char *getClobbers() const final { return ""; }
7840 bool isCLZForZeroUndef() const final { return false; }
7841 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007842 IntType getIntTypeByWidth(unsigned BitWidth,
7843 bool IsSigned) const final {
7844 // WebAssembly prefers long long for explicitly 64-bit integers.
7845 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7846 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7847 }
7848 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7849 bool IsSigned) const final {
7850 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7851 return BitWidth == 64
7852 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7853 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7854 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007855};
7856
7857const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7858#define BUILTIN(ID, TYPE, ATTRS) \
7859 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7860#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7861 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7862#include "clang/Basic/BuiltinsWebAssembly.def"
7863};
7864
7865class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7866public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007867 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7868 const TargetOptions &Opts)
7869 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007870 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007871 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007872 }
7873
7874protected:
7875 void getTargetDefines(const LangOptions &Opts,
7876 MacroBuilder &Builder) const override {
7877 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7878 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7879 }
7880};
7881
7882class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7883public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007884 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7885 const TargetOptions &Opts)
7886 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007887 LongAlign = LongWidth = 64;
7888 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007889 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007890 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007891 }
7892
7893protected:
7894 void getTargetDefines(const LangOptions &Opts,
7895 MacroBuilder &Builder) const override {
7896 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7897 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7898 }
7899};
7900
JF Bastien643817d2014-09-12 17:52:47 +00007901const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7902#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007903 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007904#include "clang/Basic/BuiltinsLe64.def"
7905};
7906
Eric Christopherc48497a2015-09-18 21:26:24 +00007907static const unsigned SPIRAddrSpaceMap[] = {
7908 1, // opencl_global
7909 3, // opencl_local
7910 2, // opencl_constant
7911 4, // opencl_generic
7912 0, // cuda_device
7913 0, // cuda_constant
7914 0 // cuda_shared
7915};
7916class SPIRTargetInfo : public TargetInfo {
7917public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007918 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7919 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007920 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7921 "SPIR target must use unknown OS");
7922 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7923 "SPIR target must use unknown environment type");
7924 BigEndian = false;
7925 TLSSupported = false;
7926 LongWidth = LongAlign = 64;
7927 AddrSpaceMap = &SPIRAddrSpaceMap;
7928 UseAddrSpaceMapMangling = true;
7929 // Define available target features
7930 // These must be defined in sorted order!
7931 NoAsmVariants = true;
7932 }
7933 void getTargetDefines(const LangOptions &Opts,
7934 MacroBuilder &Builder) const override {
7935 DefineStd(Builder, "SPIR", Opts);
7936 }
7937 bool hasFeature(StringRef Feature) const override {
7938 return Feature == "spir";
7939 }
Craig Topper3164f332014-03-11 03:39:26 +00007940
Craig Topper6c03a542015-10-19 04:51:35 +00007941 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007942 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007943 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007944 bool validateAsmConstraint(const char *&Name,
7945 TargetInfo::ConstraintInfo &info) const override {
7946 return true;
7947 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007948 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7949 return None;
7950 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007951 BuiltinVaListKind getBuiltinVaListKind() const override {
7952 return TargetInfo::VoidPtrBuiltinVaList;
7953 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007954
Eric Christopherc48497a2015-09-18 21:26:24 +00007955 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00007956 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
7957 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00007958 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007959
Eric Christopherc48497a2015-09-18 21:26:24 +00007960 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7961 return CC_SpirFunction;
7962 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007963
7964 void setSupportedOpenCLOpts() override {
7965 // Assume all OpenCL extensions and optional core features are supported
7966 // for SPIR since it is a generic target.
7967 getSupportedOpenCLOpts().setAll();
7968 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007969};
Guy Benyeib798fc92012-12-11 21:38:14 +00007970
Eric Christopherc48497a2015-09-18 21:26:24 +00007971class SPIR32TargetInfo : public SPIRTargetInfo {
7972public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007973 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7974 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007975 PointerWidth = PointerAlign = 32;
7976 SizeType = TargetInfo::UnsignedInt;
7977 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007978 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7979 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007980 }
7981 void getTargetDefines(const LangOptions &Opts,
7982 MacroBuilder &Builder) const override {
7983 DefineStd(Builder, "SPIR32", Opts);
7984 }
7985};
Guy Benyeib798fc92012-12-11 21:38:14 +00007986
Eric Christopherc48497a2015-09-18 21:26:24 +00007987class SPIR64TargetInfo : public SPIRTargetInfo {
7988public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007989 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7990 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007991 PointerWidth = PointerAlign = 64;
7992 SizeType = TargetInfo::UnsignedLong;
7993 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007994 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7995 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007996 }
7997 void getTargetDefines(const LangOptions &Opts,
7998 MacroBuilder &Builder) const override {
7999 DefineStd(Builder, "SPIR64", Opts);
8000 }
8001};
Guy Benyeib798fc92012-12-11 21:38:14 +00008002
Robert Lytton0e076492013-08-13 09:43:10 +00008003class XCoreTargetInfo : public TargetInfo {
8004 static const Builtin::Info BuiltinInfo[];
8005public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008006 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8007 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008008 BigEndian = false;
8009 NoAsmVariants = true;
8010 LongLongAlign = 32;
8011 SuitableAlign = 32;
8012 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008013 SizeType = UnsignedInt;
8014 PtrDiffType = SignedInt;
8015 IntPtrType = SignedInt;
8016 WCharType = UnsignedChar;
8017 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008018 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008019 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8020 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008021 }
Craig Topper3164f332014-03-11 03:39:26 +00008022 void getTargetDefines(const LangOptions &Opts,
8023 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008024 Builder.defineMacro("__XS1B__");
8025 }
Craig Topper6c03a542015-10-19 04:51:35 +00008026 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8027 return llvm::makeArrayRef(BuiltinInfo,
8028 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008029 }
Craig Topper3164f332014-03-11 03:39:26 +00008030 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008031 return TargetInfo::VoidPtrBuiltinVaList;
8032 }
Craig Topper3164f332014-03-11 03:39:26 +00008033 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008034 return "";
8035 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008036 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008037 static const char * const GCCRegNames[] = {
8038 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8039 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8040 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008041 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008042 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008043 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8044 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008045 }
Craig Topper3164f332014-03-11 03:39:26 +00008046 bool validateAsmConstraint(const char *&Name,
8047 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008048 return false;
8049 }
Craig Topper3164f332014-03-11 03:39:26 +00008050 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008051 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8052 return (RegNo < 2)? RegNo : -1;
8053 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008054 bool allowsLargerPreferedTypeAlignment() const override {
8055 return false;
8056 }
Robert Lytton0e076492013-08-13 09:43:10 +00008057};
8058
8059const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008060#define BUILTIN(ID, TYPE, ATTRS) \
8061 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8062#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8063 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008064#include "clang/Basic/BuiltinsXCore.def"
8065};
Robert Lytton0e076492013-08-13 09:43:10 +00008066
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008067// x86_32 Android target
8068class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8069public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008070 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8071 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008072 SuitableAlign = 32;
8073 LongDoubleWidth = 64;
8074 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8075 }
8076};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008077
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008078// x86_64 Android target
8079class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8080public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008081 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8082 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008083 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8084 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008085
8086 bool useFloat128ManglingForLongDouble() const override {
8087 return true;
8088 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008089};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008090
8091// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8092class RenderScript32TargetInfo : public ARMleTargetInfo {
8093public:
8094 RenderScript32TargetInfo(const llvm::Triple &Triple,
8095 const TargetOptions &Opts)
8096 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8097 Triple.getOSName(),
8098 Triple.getEnvironmentName()),
8099 Opts) {
8100 LongWidth = LongAlign = 64;
8101 }
8102 void getTargetDefines(const LangOptions &Opts,
8103 MacroBuilder &Builder) const override {
8104 Builder.defineMacro("__RENDERSCRIPT__");
8105 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8106 }
8107};
8108
8109// 64-bit RenderScript is aarch64
8110class RenderScript64TargetInfo : public AArch64leTargetInfo {
8111public:
8112 RenderScript64TargetInfo(const llvm::Triple &Triple,
8113 const TargetOptions &Opts)
8114 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8115 Triple.getOSName(),
8116 Triple.getEnvironmentName()),
8117 Opts) {}
8118
8119 void getTargetDefines(const LangOptions &Opts,
8120 MacroBuilder &Builder) const override {
8121 Builder.defineMacro("__RENDERSCRIPT__");
8122 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8123 }
8124};
8125
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008126} // end anonymous namespace
8127
Chris Lattner5ba61f02006-10-14 07:39:34 +00008128//===----------------------------------------------------------------------===//
8129// Driver code
8130//===----------------------------------------------------------------------===//
8131
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008132static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8133 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008134 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008135
Daniel Dunbar52322032009-08-18 05:47:58 +00008136 switch (Triple.getArch()) {
8137 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008138 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008139
Tim Northover2a0783d2014-05-30 14:14:07 +00008140 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008141 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008142
8143 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008144 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008145
Jacques Pienaard964cc22016-03-28 21:02:54 +00008146 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008147 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008148
Tim Northover2a0783d2014-05-30 14:14:07 +00008149 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008150 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008151 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008152
8153 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008154 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008155 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008156 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008157 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008158 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008159 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008160 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008161 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008162 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008163 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008164 }
8165
Christian Pirker9b019ae2014-02-25 13:51:00 +00008166 case llvm::Triple::aarch64_be:
8167 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008168 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008169 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008170 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008171 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008172 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008173 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008174 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008175 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008176 }
8177
Daniel Dunbar52322032009-08-18 05:47:58 +00008178 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008179 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008180 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008181 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008182
Daniel Dunbar52322032009-08-18 05:47:58 +00008183 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008184 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008185 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008186 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008187 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008188 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008189 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008190 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008191 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008192 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008193 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008194 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008195 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008196 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008197 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008198 case llvm::Triple::Win32:
8199 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008200 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008201 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008202 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008203 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008204 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008205 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008206 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008207 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008208 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008209 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008210 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008211 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008212 }
8213
8214 case llvm::Triple::armeb:
8215 case llvm::Triple::thumbeb:
8216 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008217 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008218
8219 switch (os) {
8220 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008221 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008222 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008224 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008226 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008227 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008228 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008229 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008230 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008231 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008232 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008233 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008234 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008236 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008237
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008238 case llvm::Triple::bpfeb:
8239 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008240 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008241
Daniel Dunbar52322032009-08-18 05:47:58 +00008242 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008243 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008244
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008245 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008246 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008247 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008248 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008249 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008250 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008251 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008252 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008253 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008254 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008255 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008256 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008257 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008258
8259 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008260 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008261 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008262 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008263 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008264 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008265 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008266 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008267 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008268 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008269 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008270 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008271 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008272 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008273 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008274
Akira Hatanakabef17452011-09-20 19:21:49 +00008275 case llvm::Triple::mips64:
8276 switch (os) {
8277 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008278 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008279 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008280 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008281 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008282 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008283 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008284 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008285 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008286 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008287 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008288 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008289 }
8290
8291 case llvm::Triple::mips64el:
8292 switch (os) {
8293 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008294 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008295 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008296 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008297 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008298 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008299 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008300 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008301 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008302 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008303 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008304 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008305 }
8306
Ivan Krasindd7403e2011-08-24 20:22:22 +00008307 case llvm::Triple::le32:
8308 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008309 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008310 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008311 default:
8312 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008313 }
8314
JF Bastien643817d2014-09-12 17:52:47 +00008315 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008316 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008317
Daniel Dunbar52322032009-08-18 05:47:58 +00008318 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008319 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008320 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008321 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008322 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008323 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008324 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008325 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008326 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008328 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008329 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008330 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008331 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008332 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008333 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008334 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008335
8336 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008337 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008338 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008339 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008340 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008341 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008342 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008343 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008344 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008345 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008346 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008347 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008348 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008350 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008351
Bill Schmidt778d3872013-07-26 01:36:11 +00008352 case llvm::Triple::ppc64le:
8353 switch (os) {
8354 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008355 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008356 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008357 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008358 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008359 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008360 }
8361
Peter Collingbournec947aae2012-05-20 23:28:41 +00008362 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008363 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008364 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008365 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008366
Tom Stellardd8e38a32015-01-06 20:34:47 +00008367 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008368 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008370
Daniel Dunbar52322032009-08-18 05:47:58 +00008371 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008372 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008373 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008374 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008375 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008376 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008377 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008378 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008379 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008380 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008381 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008383 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008384 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008385 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008386
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008387 // The 'sparcel' architecture copies all the above cases except for Solaris.
8388 case llvm::Triple::sparcel:
8389 switch (os) {
8390 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008391 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008392 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008394 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008395 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008396 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008397 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008398 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008399 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008400 }
8401
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008402 case llvm::Triple::sparcv9:
8403 switch (os) {
8404 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008405 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008406 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008407 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008408 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008409 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008410 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008411 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008412 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008413 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008414 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008415 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008416 }
8417
Ulrich Weigand47445072013-05-06 16:26:41 +00008418 case llvm::Triple::systemz:
8419 switch (os) {
8420 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008421 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008422 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008423 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008424 }
8425
Eli Friedmana9c3d712009-08-19 20:47:07 +00008426 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008428
Daniel Dunbar52322032009-08-18 05:47:58 +00008429 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008430 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008431 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008432
Daniel Dunbar52322032009-08-18 05:47:58 +00008433 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008434 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008436 case llvm::Triple::Linux: {
8437 switch (Triple.getEnvironment()) {
8438 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008440 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008441 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008442 }
8443 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008444 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008445 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008446 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008447 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008448 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008449 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008450 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008451 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008452 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008453 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008454 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008455 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008456 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008457 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008458 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008459 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008460 case llvm::Triple::Win32: {
8461 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008462 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008464 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008466 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008467 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008468 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008469 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008470 }
8471 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008472 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008473 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008474 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008475 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008476 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008477 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008478 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008479 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008480 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008481 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008482 }
8483
8484 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008485 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008486 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008487
Daniel Dunbar52322032009-08-18 05:47:58 +00008488 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008489 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008490 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008491 case llvm::Triple::Linux: {
8492 switch (Triple.getEnvironment()) {
8493 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008494 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008495 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008496 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008497 }
8498 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008499 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008500 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008501 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008502 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008503 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008504 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008505 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008506 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008507 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008508 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008509 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008510 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008511 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008512 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008513 case llvm::Triple::Win32: {
8514 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008515 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008516 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008517 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008518 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008519 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008520 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008521 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008522 }
8523 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008524 case llvm::Triple::Haiku:
8525 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008526 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008527 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008528 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008529 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008530 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008531 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008532 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008533
Douglas Katzman78d7c542015-05-12 21:18:10 +00008534 case llvm::Triple::spir: {
8535 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8536 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8537 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008538 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008539 }
8540 case llvm::Triple::spir64: {
8541 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8542 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8543 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008544 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008545 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008546 case llvm::Triple::wasm32:
8547 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8548 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008549 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008550 case llvm::Triple::wasm64:
8551 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8552 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008553 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008554
8555 case llvm::Triple::renderscript32:
8556 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8557 case llvm::Triple::renderscript64:
8558 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008559 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008560}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008561
8562/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008563/// options.
Alp Toker80758082014-07-06 05:26:44 +00008564TargetInfo *
8565TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008566 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008567 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008568
8569 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008570 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008571 if (!Target) {
8572 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008573 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008574 }
Alp Toker80758082014-07-06 05:26:44 +00008575 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008576
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008577 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008578 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8579 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008580 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008581 }
8582
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008583 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008584 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8585 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008586 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008587 }
8588
Rafael Espindolaeb265472013-08-21 21:59:03 +00008589 // Set the fp math unit.
8590 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8591 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008592 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008593 }
8594
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008595 // Compute the default target features, we need the target to handle this
8596 // because features may have dependencies on one another.
8597 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008598 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8599 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008600 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008601
8602 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008603 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008604 for (const auto &F : Features)
8605 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8606
Eric Christopher3ff21b32013-10-16 21:26:26 +00008607 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008608 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008609
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008610 Target->setSupportedOpenCLOpts();
8611
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008612 if (!Target->validateTarget(Diags))
8613 return nullptr;
8614
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008615 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008616}