blob: 134b84b8dc775521ac43cb4995829034d610051a [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
Saleem Abdulrasool10a49722016-04-08 16:52:00 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#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"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Justin Lebar76945b22016-04-29 23:05:19 +000068static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
69 const TargetOptions &Opts);
70
Chris Lattner09d98f52008-10-05 21:50:58 +000071//===----------------------------------------------------------------------===//
72// Defines specific to certain operating systems.
73//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000074
Torok Edwinb2b37c62009-06-30 17:10:35 +000075namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076template<typename TgtInfo>
77class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000078protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000079 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000081public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000082 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
83 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000084 void getTargetDefines(const LangOptions &Opts,
85 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000086 TgtInfo::getTargetDefines(Opts, Builder);
87 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000088 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000089
90};
Chris Lattner30ba6742009-08-10 19:03:04 +000091
Eric Christopher7d0c7252015-09-24 21:17:04 +000092// CloudABI Target
93template <typename Target>
94class CloudABITargetInfo : public OSTargetInfo<Target> {
95protected:
96 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
97 MacroBuilder &Builder) const override {
98 Builder.defineMacro("__CloudABI__");
99 Builder.defineMacro("__ELF__");
100
101 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
102 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
103 Builder.defineMacro("__STDC_UTF_16__");
104 Builder.defineMacro("__STDC_UTF_32__");
105 }
106
107public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000108 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
109 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000110};
111
Daniel Dunbard86666f2010-01-26 01:44:04 +0000112static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000113 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000114 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000116 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000119 // AddressSanitizer doesn't play well with source fortification, which is on
120 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000121 if (Opts.Sanitize.has(SanitizerKind::Address))
122 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000123
John McCall460ce582015-10-22 18:38:17 +0000124 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
125 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000126 // __weak is always defined, for use in blocks and with objc pointers.
127 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000128 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000129 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000130 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000131
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000132 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000133 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000136
137 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 if (Triple.isMacOSX()) {
143 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000146 Triple.getOSVersion(Maj, Min, Rev);
147 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000148 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000149
Sebastian Pop422377c2012-01-20 22:01:23 +0000150 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000151 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000152 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
153 if (PlatformName == "win32") {
154 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
155 return;
156 }
157
Evan Cheng31dd9a62014-01-26 23:12:43 +0000158 // Set the appropriate OS version define.
159 if (Triple.isiOS()) {
160 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
161 char Str[6];
162 Str[0] = '0' + Maj;
163 Str[1] = '0' + (Min / 10);
164 Str[2] = '0' + (Min % 10);
165 Str[3] = '0' + (Rev / 10);
166 Str[4] = '0' + (Rev % 10);
167 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000168 if (Triple.isTvOS())
169 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
170 else
171 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
172 Str);
173
174 } else if (Triple.isWatchOS()) {
175 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
176 char Str[6];
177 Str[0] = '0' + Maj;
178 Str[1] = '0' + (Min / 10);
179 Str[2] = '0' + (Min % 10);
180 Str[3] = '0' + (Rev / 10);
181 Str[4] = '0' + (Rev % 10);
182 Str[5] = '\0';
183 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000184 } else if (Triple.isMacOSX()) {
185 // Note that the Driver allows versions which aren't representable in the
186 // define (because we only get a single digit for the minor and micro
187 // revision numbers). So, we limit them to the maximum representable
188 // version.
189 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000190 char Str[7];
191 if (Maj < 10 || (Maj == 10 && Min < 10)) {
192 Str[0] = '0' + (Maj / 10);
193 Str[1] = '0' + (Maj % 10);
194 Str[2] = '0' + std::min(Min, 9U);
195 Str[3] = '0' + std::min(Rev, 9U);
196 Str[4] = '\0';
197 } else {
198 // Handle versions > 10.9.
199 Str[0] = '0' + (Maj / 10);
200 Str[1] = '0' + (Maj % 10);
201 Str[2] = '0' + (Min / 10);
202 Str[3] = '0' + (Min % 10);
203 Str[4] = '0' + (Rev / 10);
204 Str[5] = '0' + (Rev % 10);
205 Str[6] = '\0';
206 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000207 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000208 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210 // Tell users about the kernel if there is one.
211 if (Triple.isOSDarwin())
212 Builder.defineMacro("__MACH__");
213
Chris Bieneman46977b62016-04-29 17:53:00 +0000214 // The Watch ABI uses Dwarf EH.
215 if(Triple.isWatchABI())
216 Builder.defineMacro("__ARM_DWARF_EH__");
217
Daniel Dunbarecf13562011-04-19 21:40:34 +0000218 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000219}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000220
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221template<typename Target>
222class DarwinTargetInfo : public OSTargetInfo<Target> {
223protected:
Craig Topper3164f332014-03-11 03:39:26 +0000224 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
225 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000226 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000227 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000228 }
Mike Stump11289f42009-09-09 15:08:12 +0000229
Torok Edwinb2b37c62009-06-30 17:10:35 +0000230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000231 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
232 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000233 // By default, no TLS, and we whitelist permitted architecture/OS
234 // combinations.
235 this->TLSSupported = false;
236
237 if (Triple.isMacOSX())
238 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
239 else if (Triple.isiOS()) {
240 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
241 if (Triple.getArch() == llvm::Triple::x86_64 ||
242 Triple.getArch() == llvm::Triple::aarch64)
243 this->TLSSupported = !Triple.isOSVersionLT(8);
244 else if (Triple.getArch() == llvm::Triple::x86 ||
245 Triple.getArch() == llvm::Triple::arm ||
246 Triple.getArch() == llvm::Triple::thumb)
247 this->TLSSupported = !Triple.isOSVersionLT(9);
248 } else if (Triple.isWatchOS())
249 this->TLSSupported = !Triple.isOSVersionLT(2);
250
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000251 this->MCountName = "\01mcount";
252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000255 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000256 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000257 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000258 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000259 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000260 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000261 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000262
Craig Topper3164f332014-03-11 03:39:26 +0000263 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000264 // FIXME: We should return 0 when building kexts.
265 return "__TEXT,__StaticInit,regular,pure_instructions";
266 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000267
John McCalleed64c72012-01-29 01:20:30 +0000268 /// Darwin does not support protected visibility. Darwin's "default"
269 /// is very similar to ELF's "protected"; Darwin requires a "weak"
270 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000271 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000272 return false;
273 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000274
275 unsigned getExnObjectAlignment() const override {
276 // The alignment of an exception object is 8-bytes for darwin since
277 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
278 // and therefore doesn't guarantee 16-byte alignment.
279 return 64;
280 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281};
282
Chris Lattner30ba6742009-08-10 19:03:04 +0000283
Torok Edwinb2b37c62009-06-30 17:10:35 +0000284// DragonFlyBSD Target
285template<typename Target>
286class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
287protected:
Craig Topper3164f332014-03-11 03:39:26 +0000288 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
289 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__DragonFly__");
292 Builder.defineMacro("__DragonFly_cc_version", "100001");
293 Builder.defineMacro("__ELF__");
294 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
295 Builder.defineMacro("__tune_i386__");
296 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297 }
298public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000299 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
300 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000301 switch (Triple.getArch()) {
302 default:
303 case llvm::Triple::x86:
304 case llvm::Triple::x86_64:
305 this->MCountName = ".mcount";
306 break;
307 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000308 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000309};
310
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000311#ifndef FREEBSD_CC_VERSION
312#define FREEBSD_CC_VERSION 0U
313#endif
314
Torok Edwinb2b37c62009-06-30 17:10:35 +0000315// FreeBSD Target
316template<typename Target>
317class FreeBSDTargetInfo : public OSTargetInfo<Target> {
318protected:
Craig Topper3164f332014-03-11 03:39:26 +0000319 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
320 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000321 // FreeBSD defines; list based off of gcc output
322
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000323 unsigned Release = Triple.getOSMajorVersion();
324 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000325 Release = 8U;
326 unsigned CCVersion = FREEBSD_CC_VERSION;
327 if (CCVersion == 0U)
328 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000329
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000330 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000331 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000332 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
333 DefineStd(Builder, "unix", Opts);
334 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000335
336 // On FreeBSD, wchar_t contains the number of the code point as
337 // used by the character set of the locale. These character sets are
338 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000339 //
340 // FIXME: This is wrong; the macro refers to the numerical values
341 // of wchar_t *literals*, which are not locale-dependent. However,
342 // FreeBSD systems apparently depend on us getting this wrong, and
343 // setting this to 1 is conforming even if all the basic source
344 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000345 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000346 }
347public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000348 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
349 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000350 switch (Triple.getArch()) {
351 default:
352 case llvm::Triple::x86:
353 case llvm::Triple::x86_64:
354 this->MCountName = ".mcount";
355 break;
356 case llvm::Triple::mips:
357 case llvm::Triple::mipsel:
358 case llvm::Triple::ppc:
359 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000360 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000361 this->MCountName = "_mcount";
362 break;
363 case llvm::Triple::arm:
364 this->MCountName = "__mcount";
365 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000366 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000367 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368};
369
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000370// GNU/kFreeBSD Target
371template<typename Target>
372class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
373protected:
Craig Topper3164f332014-03-11 03:39:26 +0000374 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
375 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000376 // GNU/kFreeBSD defines; list based off of gcc output
377
378 DefineStd(Builder, "unix", Opts);
379 Builder.defineMacro("__FreeBSD_kernel__");
380 Builder.defineMacro("__GLIBC__");
381 Builder.defineMacro("__ELF__");
382 if (Opts.POSIXThreads)
383 Builder.defineMacro("_REENTRANT");
384 if (Opts.CPlusPlus)
385 Builder.defineMacro("_GNU_SOURCE");
386 }
387public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000388 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
389 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000390};
391
Reid Kleckner330fb172016-05-11 16:19:05 +0000392// Haiku Target
393template<typename Target>
394class HaikuTargetInfo : public OSTargetInfo<Target> {
395protected:
396 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
397 MacroBuilder &Builder) const override {
398 // Haiku defines; list based off of gcc output
399 Builder.defineMacro("__HAIKU__");
400 Builder.defineMacro("__ELF__");
401 DefineStd(Builder, "unix", Opts);
402 }
403public:
404 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
405 : OSTargetInfo<Target>(Triple, Opts) {
406 this->SizeType = TargetInfo::UnsignedLong;
407 this->IntPtrType = TargetInfo::SignedLong;
408 this->PtrDiffType = TargetInfo::SignedLong;
409 this->ProcessIDType = TargetInfo::SignedLong;
410 this->TLSSupported = false;
411
412 }
413};
414
Chris Lattner3e2ee142010-07-07 16:01:42 +0000415// Minix Target
416template<typename Target>
417class MinixTargetInfo : public OSTargetInfo<Target> {
418protected:
Craig Topper3164f332014-03-11 03:39:26 +0000419 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
420 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000421 // Minix defines
422
423 Builder.defineMacro("__minix", "3");
424 Builder.defineMacro("_EM_WSIZE", "4");
425 Builder.defineMacro("_EM_PSIZE", "4");
426 Builder.defineMacro("_EM_SSIZE", "2");
427 Builder.defineMacro("_EM_LSIZE", "4");
428 Builder.defineMacro("_EM_FSIZE", "4");
429 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000430 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000431 DefineStd(Builder, "unix", Opts);
432 }
433public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000434 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
435 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000436};
437
Torok Edwinb2b37c62009-06-30 17:10:35 +0000438// Linux target
439template<typename Target>
440class LinuxTargetInfo : public OSTargetInfo<Target> {
441protected:
Craig Topper3164f332014-03-11 03:39:26 +0000442 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
443 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000444 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000445 DefineStd(Builder, "unix", Opts);
446 DefineStd(Builder, "linux", Opts);
447 Builder.defineMacro("__gnu_linux__");
448 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000449 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000450 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000451 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000452 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000453 this->PlatformName = "android";
454 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
455 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000456 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000457 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000458 if (Opts.CPlusPlus)
459 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000460 if (this->HasFloat128)
461 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000462 }
463public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000464 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
465 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000466 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000467
468 switch (Triple.getArch()) {
469 default:
470 break;
471 case llvm::Triple::ppc:
472 case llvm::Triple::ppc64:
473 case llvm::Triple::ppc64le:
474 this->MCountName = "_mcount";
475 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000476 case llvm::Triple::x86:
477 case llvm::Triple::x86_64:
478 case llvm::Triple::systemz:
479 this->HasFloat128 = true;
480 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000481 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000482 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000483
Craig Topper3164f332014-03-11 03:39:26 +0000484 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000485 return ".text.startup";
486 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000487};
488
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000489// NetBSD Target
490template<typename Target>
491class NetBSDTargetInfo : public OSTargetInfo<Target> {
492protected:
Craig Topper3164f332014-03-11 03:39:26 +0000493 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
494 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000495 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000496 Builder.defineMacro("__NetBSD__");
497 Builder.defineMacro("__unix__");
498 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000499 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000500 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000501
502 switch (Triple.getArch()) {
503 default:
504 break;
505 case llvm::Triple::arm:
506 case llvm::Triple::armeb:
507 case llvm::Triple::thumb:
508 case llvm::Triple::thumbeb:
509 Builder.defineMacro("__ARM_DWARF_EH__");
510 break;
511 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000512 }
513public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000514 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
515 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000516 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000518};
519
Torok Edwinb2b37c62009-06-30 17:10:35 +0000520// OpenBSD Target
521template<typename Target>
522class OpenBSDTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000526 // OpenBSD defines; list based off of gcc output
527
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000528 Builder.defineMacro("__OpenBSD__");
529 DefineStd(Builder, "unix", Opts);
530 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000531 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000532 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533 }
534public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000535 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
536 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000537 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000538
Eli Friedman3715d1f2011-12-15 02:15:56 +0000539 switch (Triple.getArch()) {
540 default:
541 case llvm::Triple::x86:
542 case llvm::Triple::x86_64:
543 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000544 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000545 this->MCountName = "__mcount";
546 break;
547 case llvm::Triple::mips64:
548 case llvm::Triple::mips64el:
549 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000550 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551 this->MCountName = "_mcount";
552 break;
553 }
554 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000555};
556
Eli Friedman9fa28852012-08-08 23:57:20 +0000557// Bitrig Target
558template<typename Target>
559class BitrigTargetInfo : public OSTargetInfo<Target> {
560protected:
Craig Topper3164f332014-03-11 03:39:26 +0000561 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
562 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000563 // Bitrig defines; list based off of gcc output
564
565 Builder.defineMacro("__Bitrig__");
566 DefineStd(Builder, "unix", Opts);
567 Builder.defineMacro("__ELF__");
568 if (Opts.POSIXThreads)
569 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000570
571 switch (Triple.getArch()) {
572 default:
573 break;
574 case llvm::Triple::arm:
575 case llvm::Triple::armeb:
576 case llvm::Triple::thumb:
577 case llvm::Triple::thumbeb:
578 Builder.defineMacro("__ARM_DWARF_EH__");
579 break;
580 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000581 }
582public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000583 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
584 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000585 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000586 }
587};
588
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000589// PSP Target
590template<typename Target>
591class PSPTargetInfo : public OSTargetInfo<Target> {
592protected:
Craig Topper3164f332014-03-11 03:39:26 +0000593 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
594 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000595 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000596 Builder.defineMacro("PSP");
597 Builder.defineMacro("_PSP");
598 Builder.defineMacro("__psp__");
599 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000600 }
601public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000602 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000603};
604
John Thompsone467e192009-11-19 17:18:50 +0000605// PS3 PPU Target
606template<typename Target>
607class PS3PPUTargetInfo : public OSTargetInfo<Target> {
608protected:
Craig Topper3164f332014-03-11 03:39:26 +0000609 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
610 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000611 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000612 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000613 Builder.defineMacro("__PPU__");
614 Builder.defineMacro("__CELLOS_LV2__");
615 Builder.defineMacro("__ELF__");
616 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000617 Builder.defineMacro("_ARCH_PPC64");
618 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000619 }
620public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000621 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
622 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000623 this->LongWidth = this->LongAlign = 32;
624 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000625 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000626 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000627 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000628 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000629 }
630};
631
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000632template <typename Target>
633class PS4OSTargetInfo : public OSTargetInfo<Target> {
634protected:
635 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
636 MacroBuilder &Builder) const override {
637 Builder.defineMacro("__FreeBSD__", "9");
638 Builder.defineMacro("__FreeBSD_cc_version", "900001");
639 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
640 DefineStd(Builder, "unix", Opts);
641 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000642 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000643 }
644public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000645 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
646 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000647 this->WCharType = this->UnsignedShort;
648
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000649 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
650 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000651
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000652 // On PS4, do not honor explicit bit field alignment,
653 // as in "__attribute__((aligned(2))) int b : 1;".
654 this->UseExplicitBitFieldAlignment = false;
655
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 switch (Triple.getArch()) {
657 default:
658 case llvm::Triple::x86_64:
659 this->MCountName = ".mcount";
660 break;
661 }
662 }
663};
664
Torok Edwinb2b37c62009-06-30 17:10:35 +0000665// Solaris target
666template<typename Target>
667class SolarisTargetInfo : public OSTargetInfo<Target> {
668protected:
Craig Topper3164f332014-03-11 03:39:26 +0000669 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
670 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000671 DefineStd(Builder, "sun", Opts);
672 DefineStd(Builder, "unix", Opts);
673 Builder.defineMacro("__ELF__");
674 Builder.defineMacro("__svr4__");
675 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000676 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
677 // newer, but to 500 for everything else. feature_test.h has a check to
678 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000679 // with a new version.
680 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000681 Builder.defineMacro("_XOPEN_SOURCE", "600");
682 else
683 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000684 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000685 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000686 Builder.defineMacro("_LARGEFILE_SOURCE");
687 Builder.defineMacro("_LARGEFILE64_SOURCE");
688 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000690 }
691public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000692 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
693 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000694 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000695 // FIXME: WIntType should be SignedLong
696 }
697};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000698
699// Windows target
700template<typename Target>
701class WindowsTargetInfo : public OSTargetInfo<Target> {
702protected:
Craig Topper3164f332014-03-11 03:39:26 +0000703 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
704 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000705 Builder.defineMacro("_WIN32");
706 }
707 void getVisualStudioDefines(const LangOptions &Opts,
708 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000709 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000710 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711 Builder.defineMacro("_CPPRTTI");
712
Reid Kleckner16514352015-01-30 21:42:55 +0000713 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000714 Builder.defineMacro("_CPPUNWIND");
715 }
716
David Majnemer6a658902015-07-22 22:36:26 +0000717 if (Opts.Bool)
718 Builder.defineMacro("__BOOL_DEFINED");
719
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000720 if (!Opts.CharIsSigned)
721 Builder.defineMacro("_CHAR_UNSIGNED");
722
723 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
724 // but it works for now.
725 if (Opts.POSIXThreads)
726 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000727
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000728 if (Opts.MSCompatibilityVersion) {
729 Builder.defineMacro("_MSC_VER",
730 Twine(Opts.MSCompatibilityVersion / 100000));
731 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000732 // FIXME We cannot encode the revision information into 32-bits
733 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000734
David Majnemerb710a932015-05-11 03:57:49 +0000735 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000736 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000737 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000738
739 if (Opts.MicrosoftExt) {
740 Builder.defineMacro("_MSC_EXTENSIONS");
741
742 if (Opts.CPlusPlus11) {
743 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
744 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
745 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
746 }
747 }
748
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000749 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000750 }
751
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000752public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000753 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
754 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000755};
756
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000757template <typename Target>
758class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000759protected:
Craig Topper3164f332014-03-11 03:39:26 +0000760 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
761 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000762 if (Opts.POSIXThreads)
763 Builder.defineMacro("_REENTRANT");
764 if (Opts.CPlusPlus)
765 Builder.defineMacro("_GNU_SOURCE");
766
767 DefineStd(Builder, "unix", Opts);
768 Builder.defineMacro("__ELF__");
769 Builder.defineMacro("__native_client__");
770 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000771
772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000775 this->LongAlign = 32;
776 this->LongWidth = 32;
777 this->PointerAlign = 32;
778 this->PointerWidth = 32;
779 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000780 this->Int64Type = TargetInfo::SignedLongLong;
781 this->DoubleAlign = 64;
782 this->LongDoubleWidth = 64;
783 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000784 this->LongLongWidth = 64;
785 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000786 this->SizeType = TargetInfo::UnsignedInt;
787 this->PtrDiffType = TargetInfo::SignedInt;
788 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000789 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000790 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000791 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000792 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000793 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000794 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000795 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000796 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000797 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000798 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000799 } else {
800 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000801 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000802 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000803 }
804};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000805
Dan Gohmanc2853072015-09-03 22:51:53 +0000806// WebAssembly target
807template <typename Target>
808class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
809 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000810 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000811 // A common platform macro.
812 if (Opts.POSIXThreads)
813 Builder.defineMacro("_REENTRANT");
814 // Follow g++ convention and predefine _GNU_SOURCE for C++.
815 if (Opts.CPlusPlus)
816 Builder.defineMacro("_GNU_SOURCE");
817 }
818
819 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000820 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000821 return ".text.__startup";
822 }
823
824public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000825 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
826 const TargetOptions &Opts)
827 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000828 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000829 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
830 }
831};
Dan Gohmanc2853072015-09-03 22:51:53 +0000832
Chris Lattner09d98f52008-10-05 21:50:58 +0000833//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000834// Specific target implementations.
835//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000836
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000837// PPC abstract base class
838class PPCTargetInfo : public TargetInfo {
839 static const Builtin::Info BuiltinInfo[];
840 static const char * const GCCRegNames[];
841 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000842 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000843
844 // Target cpu features.
845 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000846 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000847 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000848 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000849 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000850 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000851 bool HasBPERMD;
852 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000853
Ulrich Weigand8afad612014-07-28 13:17:52 +0000854protected:
855 std::string ABI;
856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000858 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000859 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
860 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000861 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000862 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000863 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000864 LongDoubleWidth = LongDoubleAlign = 128;
865 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
866 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000867
Hal Finkel6b984f02012-07-03 16:51:04 +0000868 /// \brief Flags for architecture specific defines.
869 typedef enum {
870 ArchDefineNone = 0,
871 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
872 ArchDefinePpcgr = 1 << 1,
873 ArchDefinePpcsq = 1 << 2,
874 ArchDefine440 = 1 << 3,
875 ArchDefine603 = 1 << 4,
876 ArchDefine604 = 1 << 5,
877 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000878 ArchDefinePwr5 = 1 << 7,
879 ArchDefinePwr5x = 1 << 8,
880 ArchDefinePwr6 = 1 << 9,
881 ArchDefinePwr6x = 1 << 10,
882 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000883 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000884 ArchDefinePwr9 = 1 << 13,
885 ArchDefineA2 = 1 << 14,
886 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000887 } ArchDefineTypes;
888
Bill Schmidt38378a02013-02-01 20:23:10 +0000889 // Note: GCC recognizes the following additional cpus:
890 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
891 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
892 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000893 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000894 bool CPUKnown = llvm::StringSwitch<bool>(Name)
895 .Case("generic", true)
896 .Case("440", true)
897 .Case("450", true)
898 .Case("601", true)
899 .Case("602", true)
900 .Case("603", true)
901 .Case("603e", true)
902 .Case("603ev", true)
903 .Case("604", true)
904 .Case("604e", true)
905 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000906 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000907 .Case("g3", true)
908 .Case("7400", true)
909 .Case("g4", true)
910 .Case("7450", true)
911 .Case("g4+", true)
912 .Case("750", true)
913 .Case("970", true)
914 .Case("g5", true)
915 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000916 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000917 .Case("e500mc", true)
918 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000919 .Case("power3", true)
920 .Case("pwr3", true)
921 .Case("power4", true)
922 .Case("pwr4", true)
923 .Case("power5", true)
924 .Case("pwr5", true)
925 .Case("power5x", true)
926 .Case("pwr5x", true)
927 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000928 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000929 .Case("power6x", true)
930 .Case("pwr6x", true)
931 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000932 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000933 .Case("power8", true)
934 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000935 .Case("power9", true)
936 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000937 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000938 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000939 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000940 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000941 .Case("powerpc64le", true)
942 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000943 .Default(false);
944
945 if (CPUKnown)
946 CPU = Name;
947
948 return CPUKnown;
949 }
950
Ulrich Weigand8afad612014-07-28 13:17:52 +0000951
952 StringRef getABI() const override { return ABI; }
953
Craig Topper6c03a542015-10-19 04:51:35 +0000954 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
955 return llvm::makeArrayRef(BuiltinInfo,
956 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000957 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000958
Craig Topper3164f332014-03-11 03:39:26 +0000959 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000960
Craig Topper3164f332014-03-11 03:39:26 +0000961 void getTargetDefines(const LangOptions &Opts,
962 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000963
Eric Christopher8c47b422015-10-09 18:39:55 +0000964 bool
965 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
966 StringRef CPU,
967 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000968
Craig Topper3164f332014-03-11 03:39:26 +0000969 bool handleTargetFeatures(std::vector<std::string> &Features,
970 DiagnosticsEngine &Diags) override;
971 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000972 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
973 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000974
Craig Topperf054e3a2015-10-19 03:52:27 +0000975 ArrayRef<const char *> getGCCRegNames() const override;
976 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000977 bool validateAsmConstraint(const char *&Name,
978 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000979 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000980 default: return false;
981 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000982 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000983 case 'b': // Base register
984 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000985 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000986 break;
987 // FIXME: The following are added to allow parsing.
988 // I just took a guess at what the actions should be.
989 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000991 case 'v': // Altivec vector register
992 Info.setAllowsRegister();
993 break;
994 case 'w':
995 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 case 'd':// VSX vector register to hold vector double data
997 case 'f':// VSX vector register to hold vector float data
998 case 's':// VSX vector register to hold scalar float data
999 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001000 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001001 break;
1002 default:
1003 return false;
1004 }
1005 Info.setAllowsRegister();
1006 Name++; // Skip over 'w'.
1007 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001008 case 'h': // `MQ', `CTR', or `LINK' register
1009 case 'q': // `MQ' register
1010 case 'c': // `CTR' register
1011 case 'l': // `LINK' register
1012 case 'x': // `CR' register (condition register) number 0
1013 case 'y': // `CR' register (condition register)
1014 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001015 Info.setAllowsRegister();
1016 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001017 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001018 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001019 // (use `L' instead for SImode constants)
1020 case 'K': // Unsigned 16-bit constant
1021 case 'L': // Signed 16-bit constant shifted left 16 bits
1022 case 'M': // Constant larger than 31
1023 case 'N': // Exact power of 2
1024 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001025 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001026 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001027 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001029 break;
1030 case 'm': // Memory operand. Note that on PowerPC targets, m can
1031 // include addresses that update the base register. It
1032 // is therefore only safe to use `m' in an asm statement
1033 // if that asm statement accesses the operand exactly once.
1034 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001035 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001036 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001037 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001039 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1040 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001041 // register to be updated.
1042 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001043 if (Name[1] != 's')
1044 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001045 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001046 // include any automodification of the base register. Unlike
1047 // `m', this constraint can be used in asm statements that
1048 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001049 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001050 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001051 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001052 break;
1053 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001054 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001055 case 'Z': // Memory operand that is an indexed or indirect from a
1056 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001057 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001058 Info.setAllowsMemory();
1059 Info.setAllowsRegister();
1060 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001062 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 // register (`p' is preferable for asm statements)
1064 case 'S': // Constant suitable as a 64-bit mask operand
1065 case 'T': // Constant suitable as a 32-bit mask operand
1066 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001067 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001068 // instructions
1069 case 'W': // Vector constant that does not require memory
1070 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001071 break;
1072 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001073 }
John Thompson07a61a42010-06-24 22:44:13 +00001074 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001075 }
Craig Topper3164f332014-03-11 03:39:26 +00001076 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001077 std::string R;
1078 switch (*Constraint) {
1079 case 'e':
1080 case 'w':
1081 // Two-character constraint; add "^" hint for later parsing.
1082 R = std::string("^") + std::string(Constraint, 2);
1083 Constraint++;
1084 break;
1085 default:
1086 return TargetInfo::convertConstraint(Constraint);
1087 }
1088 return R;
1089 }
Craig Topper3164f332014-03-11 03:39:26 +00001090 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001091 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001092 }
Craig Topper3164f332014-03-11 03:39:26 +00001093 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001094 if (RegNo == 0) return 3;
1095 if (RegNo == 1) return 4;
1096 return -1;
1097 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001098
1099 bool hasSjLjLowering() const override {
1100 return true;
1101 }
David Majnemer2617ea62015-06-09 18:05:33 +00001102
1103 bool useFloat128ManglingForLongDouble() const override {
1104 return LongDoubleWidth == 128 &&
1105 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1106 getTriple().isOSBinFormatELF();
1107 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001108};
Anders Carlssonf511f642007-11-27 04:11:28 +00001109
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001110const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001111#define BUILTIN(ID, TYPE, ATTRS) \
1112 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1113#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1114 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001115#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001116};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001117
Eric Christopher917e9522014-11-18 22:36:15 +00001118/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001119/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001120bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001121 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001122 for (const auto &Feature : Features) {
1123 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001124 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001125 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001126 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001127 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001128 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001129 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001130 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001131 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001132 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001133 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001134 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001135 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001136 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001137 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001138 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001139 } else if (Feature == "+float128") {
1140 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001141 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001142 // TODO: Finish this list and add an assert that we've handled them
1143 // all.
1144 }
Eric Christopher02c33352015-08-25 00:59:11 +00001145
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001146 return true;
1147}
1148
Chris Lattnerecd49032009-03-02 22:27:17 +00001149/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1150/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001151void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001152 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001153 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001154 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001155 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001156 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001157 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001158 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001159 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001160 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001161 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001162 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001163 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001164 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001165
Chris Lattnerecd49032009-03-02 22:27:17 +00001166 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001167 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1168 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001169 } else {
1170 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1171 getTriple().getOS() != llvm::Triple::OpenBSD)
1172 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001173 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001174
Ulrich Weigand8afad612014-07-28 13:17:52 +00001175 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001176 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001177 Builder.defineMacro("_CALL_ELF", "1");
1178 if (ABI == "elfv2")
1179 Builder.defineMacro("_CALL_ELF", "2");
1180
Chris Lattnerecd49032009-03-02 22:27:17 +00001181 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001182 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1183 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001184
Chris Lattnerecd49032009-03-02 22:27:17 +00001185 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001186 if (LongDoubleWidth == 128)
1187 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001188
John Thompsone467e192009-11-19 17:18:50 +00001189 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001190 Builder.defineMacro("__VEC__", "10206");
1191 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001192 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001193
1194 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001195 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1196 .Case("440", ArchDefineName)
1197 .Case("450", ArchDefineName | ArchDefine440)
1198 .Case("601", ArchDefineName)
1199 .Case("602", ArchDefineName | ArchDefinePpcgr)
1200 .Case("603", ArchDefineName | ArchDefinePpcgr)
1201 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1202 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1203 .Case("604", ArchDefineName | ArchDefinePpcgr)
1204 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1205 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001206 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001207 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1208 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1209 .Case("750", ArchDefineName | ArchDefinePpcgr)
1210 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1211 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001212 .Case("a2", ArchDefineA2)
1213 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001214 .Case("pwr3", ArchDefinePpcgr)
1215 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1216 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1217 | ArchDefinePpcsq)
1218 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1219 | ArchDefinePpcgr | ArchDefinePpcsq)
1220 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1221 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1222 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1223 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1224 | ArchDefinePpcsq)
1225 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1226 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001227 | ArchDefinePpcgr | ArchDefinePpcsq)
1228 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1229 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1230 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001231 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1232 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1233 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1234 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001235 .Case("power3", ArchDefinePpcgr)
1236 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1237 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1238 | ArchDefinePpcsq)
1239 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1240 | ArchDefinePpcgr | ArchDefinePpcsq)
1241 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1242 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1243 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1244 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1245 | ArchDefinePpcsq)
1246 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1247 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001248 | ArchDefinePpcgr | ArchDefinePpcsq)
1249 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1250 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1251 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001252 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1253 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1254 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1255 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001256 .Default(ArchDefineNone);
1257
1258 if (defs & ArchDefineName)
1259 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1260 if (defs & ArchDefinePpcgr)
1261 Builder.defineMacro("_ARCH_PPCGR");
1262 if (defs & ArchDefinePpcsq)
1263 Builder.defineMacro("_ARCH_PPCSQ");
1264 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001265 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001266 if (defs & ArchDefine603)
1267 Builder.defineMacro("_ARCH_603");
1268 if (defs & ArchDefine604)
1269 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001270 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001271 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001272 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001273 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001274 if (defs & ArchDefinePwr5x)
1275 Builder.defineMacro("_ARCH_PWR5X");
1276 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001277 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001278 if (defs & ArchDefinePwr6x)
1279 Builder.defineMacro("_ARCH_PWR6X");
1280 if (defs & ArchDefinePwr7)
1281 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001282 if (defs & ArchDefinePwr8)
1283 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001284 if (defs & ArchDefinePwr9)
1285 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001286 if (defs & ArchDefineA2)
1287 Builder.defineMacro("_ARCH_A2");
1288 if (defs & ArchDefineA2q) {
1289 Builder.defineMacro("_ARCH_A2Q");
1290 Builder.defineMacro("_ARCH_QP");
1291 }
1292
1293 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1294 Builder.defineMacro("__bg__");
1295 Builder.defineMacro("__THW_BLUEGENE__");
1296 Builder.defineMacro("__bgq__");
1297 Builder.defineMacro("__TOS_BGQ__");
1298 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001299
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001300 if (HasVSX)
1301 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001302 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001303 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001304 if (HasP8Crypto)
1305 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001306 if (HasHTM)
1307 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001308 if (HasFloat128)
1309 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001310
1311 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1312 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1313 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1314 if (PointerWidth == 64)
1315 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001316
Bill Schmidt38378a02013-02-01 20:23:10 +00001317 // FIXME: The following are not yet generated here by Clang, but are
1318 // generated by GCC:
1319 //
1320 // _SOFT_FLOAT_
1321 // __RECIP_PRECISION__
1322 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001323 // __RECIP__
1324 // __RECIPF__
1325 // __RSQRTE__
1326 // __RSQRTEF__
1327 // _SOFT_DOUBLE_
1328 // __NO_LWSYNC__
1329 // __HAVE_BSWAP__
1330 // __LONGDOUBLE128
1331 // __CMODEL_MEDIUM__
1332 // __CMODEL_LARGE__
1333 // _CALL_SYSV
1334 // _CALL_DARWIN
1335 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001336}
1337
Eric Christophera8a14c32015-08-31 18:39:16 +00001338// Handle explicit options being passed to the compiler here: if we've
1339// explicitly turned off vsx and turned on power8-vector or direct-move then
1340// go ahead and error since the customer has expressed a somewhat incompatible
1341// set of options.
1342static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001343 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001344
1345 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1346 FeaturesVec.end()) {
1347 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1348 FeaturesVec.end()) {
1349 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1350 << "-mno-vsx";
1351 return false;
1352 }
1353
1354 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1355 FeaturesVec.end()) {
1356 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1357 << "-mno-vsx";
1358 return false;
1359 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001360
1361 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1362 FeaturesVec.end()) {
1363 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1364 << "-mno-vsx";
1365 return false;
1366 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001367 }
1368
1369 return true;
1370}
1371
Eric Christopher8c47b422015-10-09 18:39:55 +00001372bool PPCTargetInfo::initFeatureMap(
1373 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1374 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001375 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1376 .Case("7400", true)
1377 .Case("g4", true)
1378 .Case("7450", true)
1379 .Case("g4+", true)
1380 .Case("970", true)
1381 .Case("g5", true)
1382 .Case("pwr6", true)
1383 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001384 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001385 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001386 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001387 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001388 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001389
1390 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001391 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1392 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001393 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001394 .Case("pwr8", true)
1395 .Default(false);
1396 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1397 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001398 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001399 .Case("pwr8", true)
1400 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001401 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1402 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001403 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001404 .Case("pwr8", true)
1405 .Case("pwr7", true)
1406 .Default(false);
1407 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1408 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001409 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001410 .Case("pwr8", true)
1411 .Case("pwr7", true)
1412 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001413 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1414 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001415 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001416 .Case("pwr8", true)
1417 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001418 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1419 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001420 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001421 .Case("pwr8", true)
1422 .Case("pwr7", true)
1423 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001424
Eric Christophera8a14c32015-08-31 18:39:16 +00001425 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1426 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001427
Eric Christopher007b0a02015-08-28 22:32:01 +00001428 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001429}
1430
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001431bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001432 return llvm::StringSwitch<bool>(Feature)
1433 .Case("powerpc", true)
1434 .Case("vsx", HasVSX)
1435 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001436 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001437 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001438 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001439 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001440 .Case("bpermd", HasBPERMD)
1441 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001442 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001443 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001444}
Chris Lattner17df24e2008-04-21 18:56:49 +00001445
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001446void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1447 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001448 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1449 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1450 // incompatible options.
1451 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001452 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001453 Features[Name] = Features["vsx"] = true;
1454 } else if (Name == "power8-vector") {
1455 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001456 } else if (Name == "float128") {
1457 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001458 } else {
1459 Features[Name] = true;
1460 }
1461 } else {
1462 if (Name == "vsx") {
1463 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001464 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001465 } else {
1466 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001467 }
1468 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001469}
1470
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001471const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001472 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1473 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1474 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1475 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1476 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1477 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1478 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1479 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001480 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001481 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001482 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001483 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1484 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1485 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1486 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001487 "vrsave", "vscr",
1488 "spe_acc", "spefscr",
1489 "sfp"
1490};
Chris Lattner10a5b382007-01-29 05:24:35 +00001491
Craig Topperf054e3a2015-10-19 03:52:27 +00001492ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1493 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001494}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001495
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001496const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1497 // While some of these aliases do map to different registers
1498 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001499 { { "0" }, "r0" },
1500 { { "1"}, "r1" },
1501 { { "2" }, "r2" },
1502 { { "3" }, "r3" },
1503 { { "4" }, "r4" },
1504 { { "5" }, "r5" },
1505 { { "6" }, "r6" },
1506 { { "7" }, "r7" },
1507 { { "8" }, "r8" },
1508 { { "9" }, "r9" },
1509 { { "10" }, "r10" },
1510 { { "11" }, "r11" },
1511 { { "12" }, "r12" },
1512 { { "13" }, "r13" },
1513 { { "14" }, "r14" },
1514 { { "15" }, "r15" },
1515 { { "16" }, "r16" },
1516 { { "17" }, "r17" },
1517 { { "18" }, "r18" },
1518 { { "19" }, "r19" },
1519 { { "20" }, "r20" },
1520 { { "21" }, "r21" },
1521 { { "22" }, "r22" },
1522 { { "23" }, "r23" },
1523 { { "24" }, "r24" },
1524 { { "25" }, "r25" },
1525 { { "26" }, "r26" },
1526 { { "27" }, "r27" },
1527 { { "28" }, "r28" },
1528 { { "29" }, "r29" },
1529 { { "30" }, "r30" },
1530 { { "31" }, "r31" },
1531 { { "fr0" }, "f0" },
1532 { { "fr1" }, "f1" },
1533 { { "fr2" }, "f2" },
1534 { { "fr3" }, "f3" },
1535 { { "fr4" }, "f4" },
1536 { { "fr5" }, "f5" },
1537 { { "fr6" }, "f6" },
1538 { { "fr7" }, "f7" },
1539 { { "fr8" }, "f8" },
1540 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001541 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001542 { { "fr11" }, "f11" },
1543 { { "fr12" }, "f12" },
1544 { { "fr13" }, "f13" },
1545 { { "fr14" }, "f14" },
1546 { { "fr15" }, "f15" },
1547 { { "fr16" }, "f16" },
1548 { { "fr17" }, "f17" },
1549 { { "fr18" }, "f18" },
1550 { { "fr19" }, "f19" },
1551 { { "fr20" }, "f20" },
1552 { { "fr21" }, "f21" },
1553 { { "fr22" }, "f22" },
1554 { { "fr23" }, "f23" },
1555 { { "fr24" }, "f24" },
1556 { { "fr25" }, "f25" },
1557 { { "fr26" }, "f26" },
1558 { { "fr27" }, "f27" },
1559 { { "fr28" }, "f28" },
1560 { { "fr29" }, "f29" },
1561 { { "fr30" }, "f30" },
1562 { { "fr31" }, "f31" },
1563 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001564};
1565
Craig Topperf054e3a2015-10-19 03:52:27 +00001566ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1567 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001568}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001569
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001570class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001571public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001572 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1573 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001574 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001575
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001576 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001577 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001578 case llvm::Triple::FreeBSD:
1579 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001580 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001581 PtrDiffType = SignedInt;
1582 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001583 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001584 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001585 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001586 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001587
Roman Divacky3ffe7462012-03-13 19:20:17 +00001588 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1589 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001590 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001591 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001592
1593 // PPC32 supports atomics up to 4 bytes.
1594 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001595 }
1596
Craig Topper3164f332014-03-11 03:39:26 +00001597 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001598 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001599 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001600 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001601};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001602
Bill Schmidt778d3872013-07-26 01:36:11 +00001603// Note: ABI differences may eventually require us to have a separate
1604// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001605class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001606public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001607 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1608 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001609 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001610 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001611 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001612
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001613 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001614 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001615 ABI = "elfv2";
1616 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001617 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001618 ABI = "elfv1";
1619 }
1620
1621 switch (getTriple().getOS()) {
1622 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001623 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001624 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001625 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001626 case llvm::Triple::NetBSD:
1627 IntMaxType = SignedLongLong;
1628 Int64Type = SignedLongLong;
1629 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001630 default:
1631 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001632 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001633
1634 // PPC64 supports atomics up to 8 bytes.
1635 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001636 }
Craig Topper3164f332014-03-11 03:39:26 +00001637 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001638 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001639 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001640 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001641 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001642 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001643 ABI = Name;
1644 return true;
1645 }
1646 return false;
1647 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001648};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001649
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001650class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001651public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001652 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1653 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001654 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001655 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001656 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001657 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001658 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001659 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001660 }
Craig Topper3164f332014-03-11 03:39:26 +00001661 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001662 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001663 }
1664};
1665
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001666class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001667public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001668 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1669 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001670 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001671 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001672 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001673 }
1674};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001675
Eric Christopherc48497a2015-09-18 21:26:24 +00001676static const unsigned NVPTXAddrSpaceMap[] = {
1677 1, // opencl_global
1678 3, // opencl_local
1679 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001680 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001681 0, // opencl_generic
1682 1, // cuda_device
1683 4, // cuda_constant
1684 3, // cuda_shared
1685};
1686
1687class NVPTXTargetInfo : public TargetInfo {
1688 static const char *const GCCRegNames[];
1689 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001690
1691 // The GPU profiles supported by the NVPTX backend
1692 enum GPUKind {
1693 GK_NONE,
1694 GK_SM20,
1695 GK_SM21,
1696 GK_SM30,
1697 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001698 GK_SM37,
Artem Belevichffa5fc52016-05-19 17:47:47 +00001699 GK_SM50,
1700 GK_SM52,
1701 GK_SM53,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001702 } GPU;
1703
Eric Christopherc48497a2015-09-18 21:26:24 +00001704public:
Justin Lebar76945b22016-04-29 23:05:19 +00001705 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001706 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001707 BigEndian = false;
1708 TLSSupported = false;
1709 LongWidth = LongAlign = 64;
1710 AddrSpaceMap = &NVPTXAddrSpaceMap;
1711 UseAddrSpaceMapMangling = true;
1712 // Define available target features
1713 // These must be defined in sorted order!
1714 NoAsmVariants = true;
1715 // Set the default GPU to sm20
1716 GPU = GK_SM20;
Justin Lebar76945b22016-04-29 23:05:19 +00001717
1718 // If possible, get a TargetInfo for our host triple, so we can match its
1719 // types.
1720 llvm::Triple HostTriple(Opts.HostTriple);
1721 if (HostTriple.isNVPTX())
1722 return;
1723 std::unique_ptr<TargetInfo> HostTarget(
1724 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1725 if (!HostTarget) {
1726 return;
1727 }
1728
1729 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1730 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1731 BoolWidth = HostTarget->getBoolWidth();
1732 BoolAlign = HostTarget->getBoolAlign();
1733 IntWidth = HostTarget->getIntWidth();
1734 IntAlign = HostTarget->getIntAlign();
1735 HalfWidth = HostTarget->getHalfWidth();
1736 HalfAlign = HostTarget->getHalfAlign();
1737 FloatWidth = HostTarget->getFloatWidth();
1738 FloatAlign = HostTarget->getFloatAlign();
1739 DoubleWidth = HostTarget->getDoubleWidth();
1740 DoubleAlign = HostTarget->getDoubleAlign();
1741 LongWidth = HostTarget->getLongWidth();
1742 LongAlign = HostTarget->getLongAlign();
1743 LongLongWidth = HostTarget->getLongLongWidth();
1744 LongLongAlign = HostTarget->getLongLongAlign();
1745 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1746 DefaultAlignForAttributeAligned =
1747 HostTarget->getDefaultAlignForAttributeAligned();
1748 SizeType = HostTarget->getSizeType();
1749 IntMaxType = HostTarget->getIntMaxType();
1750 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1751 IntPtrType = HostTarget->getIntPtrType();
1752 WCharType = HostTarget->getWCharType();
1753 WIntType = HostTarget->getWIntType();
1754 Char16Type = HostTarget->getChar16Type();
1755 Char32Type = HostTarget->getChar32Type();
1756 Int64Type = HostTarget->getInt64Type();
1757 SigAtomicType = HostTarget->getSigAtomicType();
1758 ProcessIDType = HostTarget->getProcessIDType();
1759
1760 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1761 UseZeroLengthBitfieldAlignment =
1762 HostTarget->useZeroLengthBitfieldAlignment();
1763 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1764 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1765
1766 // Properties intentionally not copied from host:
1767 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1768 // host/device boundary.
1769 // - SuitableAlign: Not visible across the host/device boundary, and may
1770 // correctly be different on host/device, e.g. if host has wider vector
1771 // types than device.
1772 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1773 // as its double type, but that's not necessarily true on the host.
1774 // TODO: nvcc emits a warning when using long double on device; we should
1775 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001776 }
1777 void getTargetDefines(const LangOptions &Opts,
1778 MacroBuilder &Builder) const override {
1779 Builder.defineMacro("__PTX__");
1780 Builder.defineMacro("__NVPTX__");
1781 if (Opts.CUDAIsDevice) {
1782 // Set __CUDA_ARCH__ for the GPU specified.
1783 std::string CUDAArchCode;
1784 switch (GPU) {
1785 case GK_SM20:
1786 CUDAArchCode = "200";
1787 break;
1788 case GK_SM21:
1789 CUDAArchCode = "210";
1790 break;
1791 case GK_SM30:
1792 CUDAArchCode = "300";
1793 break;
1794 case GK_SM35:
1795 CUDAArchCode = "350";
1796 break;
1797 case GK_SM37:
1798 CUDAArchCode = "370";
1799 break;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001800 case GK_SM50:
1801 CUDAArchCode = "500";
1802 break;
1803 case GK_SM52:
1804 CUDAArchCode = "520";
1805 break;
1806 case GK_SM53:
1807 CUDAArchCode = "530";
1808 break;
Eric Christopherc48497a2015-09-18 21:26:24 +00001809 default:
1810 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001811 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001812 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001813 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001814 }
Craig Topper6c03a542015-10-19 04:51:35 +00001815 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1816 return llvm::makeArrayRef(BuiltinInfo,
1817 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001818 }
1819 bool hasFeature(StringRef Feature) const override {
1820 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001821 }
1822
Craig Topperf054e3a2015-10-19 03:52:27 +00001823 ArrayRef<const char *> getGCCRegNames() const override;
1824 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001825 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001826 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001827 }
1828 bool validateAsmConstraint(const char *&Name,
1829 TargetInfo::ConstraintInfo &Info) const override {
1830 switch (*Name) {
1831 default:
1832 return false;
1833 case 'c':
1834 case 'h':
1835 case 'r':
1836 case 'l':
1837 case 'f':
1838 case 'd':
1839 Info.setAllowsRegister();
1840 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001841 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001842 }
1843 const char *getClobbers() const override {
1844 // FIXME: Is this really right?
1845 return "";
1846 }
1847 BuiltinVaListKind getBuiltinVaListKind() const override {
1848 // FIXME: implement
1849 return TargetInfo::CharPtrBuiltinVaList;
1850 }
1851 bool setCPU(const std::string &Name) override {
1852 GPU = llvm::StringSwitch<GPUKind>(Name)
1853 .Case("sm_20", GK_SM20)
1854 .Case("sm_21", GK_SM21)
1855 .Case("sm_30", GK_SM30)
1856 .Case("sm_35", GK_SM35)
1857 .Case("sm_37", GK_SM37)
Artem Belevichffa5fc52016-05-19 17:47:47 +00001858 .Case("sm_50", GK_SM50)
1859 .Case("sm_52", GK_SM52)
1860 .Case("sm_53", GK_SM53)
Eric Christopherc48497a2015-09-18 21:26:24 +00001861 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001862
Eric Christopherc48497a2015-09-18 21:26:24 +00001863 return GPU != GK_NONE;
1864 }
1865};
1866
1867const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1868#define BUILTIN(ID, TYPE, ATTRS) \
1869 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1870#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1871 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1872#include "clang/Basic/BuiltinsNVPTX.def"
1873};
1874
1875const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1876
Craig Topperf054e3a2015-10-19 03:52:27 +00001877ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1878 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001879}
1880
1881class NVPTX32TargetInfo : public NVPTXTargetInfo {
1882public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001883 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1884 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001885 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001886 PointerWidth = PointerAlign = 32;
1887 SizeType = TargetInfo::UnsignedInt;
1888 PtrDiffType = TargetInfo::SignedInt;
1889 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001890 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001891 }
1892};
1893
1894class NVPTX64TargetInfo : public NVPTXTargetInfo {
1895public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001896 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1897 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001898 PointerWidth = PointerAlign = 64;
1899 SizeType = TargetInfo::UnsignedLong;
1900 PtrDiffType = TargetInfo::SignedLong;
1901 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001902 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001903 }
1904};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001905
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001906static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001907 1, // opencl_global
1908 3, // opencl_local
1909 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001910 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001911 1, // cuda_device
1912 2, // cuda_constant
1913 3 // cuda_shared
1914};
1915
Tom Stellarda96344b2014-08-21 13:58:40 +00001916// If you edit the description strings, make sure you update
1917// getPointerWidthV().
1918
Craig Topper273dbc62015-10-18 05:29:26 +00001919static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001920 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1921 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001922
Craig Topper273dbc62015-10-18 05:29:26 +00001923static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001924 "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 +00001925 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1926 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001927
Matt Arsenault250024f2016-06-08 01:56:42 +00001928class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001929 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001930 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001931
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001932 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001933 enum GPUKind {
1934 GK_NONE,
1935 GK_R600,
1936 GK_R600_DOUBLE_OPS,
1937 GK_R700,
1938 GK_R700_DOUBLE_OPS,
1939 GK_EVERGREEN,
1940 GK_EVERGREEN_DOUBLE_OPS,
1941 GK_NORTHERN_ISLANDS,
1942 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001943 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001944 GK_SEA_ISLANDS,
1945 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001946 } GPU;
1947
Jan Veselyeebeaea2015-05-04 19:53:36 +00001948 bool hasFP64:1;
1949 bool hasFMAF:1;
1950 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001951
Matt Arsenault250024f2016-06-08 01:56:42 +00001952 static bool isAMDGCN(const llvm::Triple &TT) {
1953 return TT.getArch() == llvm::Triple::amdgcn;
1954 }
1955
Eli Friedmand13b41e2012-10-12 23:32:00 +00001956public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001957 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Matt Arsenault250024f2016-06-08 01:56:42 +00001958 : TargetInfo(Triple) ,
1959 GPU(isAMDGCN(Triple) ? GK_SOUTHERN_ISLANDS : GK_R600),
1960 hasFP64(false),
1961 hasFMAF(false),
1962 hasLDEXPF(false) {
1963 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001964 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001965 hasFMAF = true;
1966 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001967 }
Matt Arsenault250024f2016-06-08 01:56:42 +00001968
1969 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1970 DataLayoutStringSI : DataLayoutStringR600);
1971
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001972 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001973 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001974 }
1975
Tom Stellarda96344b2014-08-21 13:58:40 +00001976 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1977 if (GPU <= GK_CAYMAN)
1978 return 32;
1979
1980 switch(AddrSpace) {
1981 default:
1982 return 64;
1983 case 0:
1984 case 3:
1985 case 5:
1986 return 32;
1987 }
1988 }
1989
Craig Topper3164f332014-03-11 03:39:26 +00001990 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001991 return "";
1992 }
1993
Craig Topperf054e3a2015-10-19 03:52:27 +00001994 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001995
Craig Topperf054e3a2015-10-19 03:52:27 +00001996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1997 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001998 }
1999
Craig Topper3164f332014-03-11 03:39:26 +00002000 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002001 TargetInfo::ConstraintInfo &Info) const override {
2002 switch (*Name) {
2003 default: break;
2004 case 'v': // vgpr
2005 case 's': // sgpr
2006 Info.setAllowsRegister();
2007 return true;
2008 }
2009 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002010 }
2011
Matt Arsenault250024f2016-06-08 01:56:42 +00002012 bool initFeatureMap(llvm::StringMap<bool> &Features,
2013 DiagnosticsEngine &Diags, StringRef CPU,
2014 const std::vector<std::string> &FeatureVec) const override;
2015
Craig Topper6c03a542015-10-19 04:51:35 +00002016 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2017 return llvm::makeArrayRef(BuiltinInfo,
2018 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002019 }
2020
Craig Topper3164f332014-03-11 03:39:26 +00002021 void getTargetDefines(const LangOptions &Opts,
2022 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002023 if (getTriple().getArch() == llvm::Triple::amdgcn)
2024 Builder.defineMacro("__AMDGCN__");
2025 else
2026 Builder.defineMacro("__R600__");
2027
Jan Veselyeebeaea2015-05-04 19:53:36 +00002028 if (hasFMAF)
2029 Builder.defineMacro("__HAS_FMAF__");
2030 if (hasLDEXPF)
2031 Builder.defineMacro("__HAS_LDEXPF__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002032 }
2033
Craig Topper3164f332014-03-11 03:39:26 +00002034 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002035 return TargetInfo::CharPtrBuiltinVaList;
2036 }
2037
Matt Arsenault250024f2016-06-08 01:56:42 +00002038 static GPUKind parseR600Name(StringRef Name) {
2039 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002040 .Case("r600" , GK_R600)
2041 .Case("rv610", GK_R600)
2042 .Case("rv620", GK_R600)
2043 .Case("rv630", GK_R600)
2044 .Case("rv635", GK_R600)
2045 .Case("rs780", GK_R600)
2046 .Case("rs880", GK_R600)
2047 .Case("rv670", GK_R600_DOUBLE_OPS)
2048 .Case("rv710", GK_R700)
2049 .Case("rv730", GK_R700)
2050 .Case("rv740", GK_R700_DOUBLE_OPS)
2051 .Case("rv770", GK_R700_DOUBLE_OPS)
2052 .Case("palm", GK_EVERGREEN)
2053 .Case("cedar", GK_EVERGREEN)
2054 .Case("sumo", GK_EVERGREEN)
2055 .Case("sumo2", GK_EVERGREEN)
2056 .Case("redwood", GK_EVERGREEN)
2057 .Case("juniper", GK_EVERGREEN)
2058 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2059 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2060 .Case("barts", GK_NORTHERN_ISLANDS)
2061 .Case("turks", GK_NORTHERN_ISLANDS)
2062 .Case("caicos", GK_NORTHERN_ISLANDS)
2063 .Case("cayman", GK_CAYMAN)
2064 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002065 .Default(GK_NONE);
2066 }
2067
2068 static GPUKind parseAMDGCNName(StringRef Name) {
2069 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellard785699322013-04-01 20:56:49 +00002070 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002071 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2072 .Case("verde", GK_SOUTHERN_ISLANDS)
2073 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002074 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002075 .Case("bonaire", GK_SEA_ISLANDS)
2076 .Case("kabini", GK_SEA_ISLANDS)
2077 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002078 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002079 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002080 .Case("tonga", GK_VOLCANIC_ISLANDS)
2081 .Case("iceland", GK_VOLCANIC_ISLANDS)
2082 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002083 .Case("fiji", GK_VOLCANIC_ISLANDS)
2084 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002085 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002086 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002087
Matt Arsenault250024f2016-06-08 01:56:42 +00002088 bool setCPU(const std::string &Name) override {
2089 if (getTriple().getArch() == llvm::Triple::amdgcn)
2090 GPU = parseAMDGCNName(Name);
2091 else
2092 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002093
Matt Arsenault250024f2016-06-08 01:56:42 +00002094 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002095 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002096
2097 void setSupportedOpenCLOpts() override {
2098 auto &Opts = getSupportedOpenCLOpts();
2099 Opts.cl_clang_storage_class_specifiers = 1;
2100 Opts.cl_khr_gl_sharing = 1;
2101 Opts.cl_khr_gl_event = 1;
2102 Opts.cl_khr_d3d10_sharing = 1;
2103 Opts.cl_khr_subgroups = 1;
2104
2105 if (hasFP64)
2106 Opts.cl_khr_fp64 = 1;
2107 if (GPU >= GK_NORTHERN_ISLANDS) {
2108 Opts.cl_khr_byte_addressable_store = 1;
2109 Opts.cl_khr_global_int32_base_atomics = 1;
2110 Opts.cl_khr_global_int32_extended_atomics = 1;
2111 Opts.cl_khr_local_int32_base_atomics = 1;
2112 Opts.cl_khr_local_int32_extended_atomics = 1;
2113 }
2114 if (GPU >= GK_SOUTHERN_ISLANDS)
2115 Opts.cl_khr_fp16 = 1;
2116 Opts.cl_khr_int64_base_atomics = 1;
2117 Opts.cl_khr_int64_extended_atomics = 1;
2118 Opts.cl_khr_3d_image_writes = 1;
2119 Opts.cl_khr_gl_msaa_sharing = 1;
2120 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002121};
2122
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002123const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002124#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002125 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002126#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2127 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002128#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002129};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002130const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002131 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2132 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2133 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2134 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2135 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2136 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2137 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2138 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2139 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2140 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2141 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2142 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2143 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2144 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2145 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2146 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2147 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2148 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2149 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2150 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2151 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2152 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2153 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2154 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2155 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2156 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2157 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2158 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2159 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2160 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2161 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2162 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2163 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2164 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2165 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2166 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2167 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2168 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2169 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2170 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2171 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2172 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2173 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2174 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2175 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2176 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2177 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002178 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002179 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2180 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002181};
2182
Craig Topperf054e3a2015-10-19 03:52:27 +00002183ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2184 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002185}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002186
Matt Arsenault250024f2016-06-08 01:56:42 +00002187bool AMDGPUTargetInfo::initFeatureMap(
2188 llvm::StringMap<bool> &Features,
2189 DiagnosticsEngine &Diags, StringRef CPU,
2190 const std::vector<std::string> &FeatureVec) const {
2191
2192 // XXX - What does the member GPU mean if device name string passed here?
2193 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2194 if (CPU.empty())
2195 CPU = "tahiti";
2196
2197 switch (parseAMDGCNName(CPU)) {
2198 case GK_SOUTHERN_ISLANDS:
2199 case GK_SEA_ISLANDS:
2200 break;
2201
2202 case GK_VOLCANIC_ISLANDS:
2203 Features["s-memrealtime"] = true;
2204 Features["16-bit-insts"] = true;
2205 break;
2206
2207 case GK_NONE:
2208 return false;
2209 default:
2210 llvm_unreachable("unhandled subtarget");
2211 }
2212 } else {
2213 if (CPU.empty())
2214 CPU = "r600";
2215
2216 switch (parseR600Name(CPU)) {
2217 case GK_R600:
2218 case GK_R700:
2219 case GK_EVERGREEN:
2220 case GK_NORTHERN_ISLANDS:
2221 break;
2222 case GK_R600_DOUBLE_OPS:
2223 case GK_R700_DOUBLE_OPS:
2224 case GK_EVERGREEN_DOUBLE_OPS:
2225 case GK_CAYMAN:
2226 Features["fp64"] = true;
2227 break;
2228 case GK_NONE:
2229 return false;
2230 default:
2231 llvm_unreachable("unhandled subtarget");
2232 }
2233 }
2234
2235 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2236}
2237
Eli Friedman3fd920a2008-08-20 02:34:37 +00002238// Namespace for x86 abstract base class
2239const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002240#define BUILTIN(ID, TYPE, ATTRS) \
2241 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002242#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002243 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002244#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002245 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002246#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002247};
Eli Friedmanb5366062008-05-20 14:21:01 +00002248
Nuno Lopescfca1f02009-12-23 17:49:57 +00002249static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002250 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2251 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002252 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002253 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2254 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2255 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002256 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002257 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2258 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002259 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2260 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2261 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2262 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2263 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2264 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2265 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2266 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002267};
2268
Eric Christophercdd36352011-06-21 00:05:20 +00002269const TargetInfo::AddlRegName AddlRegNames[] = {
2270 { { "al", "ah", "eax", "rax" }, 0 },
2271 { { "bl", "bh", "ebx", "rbx" }, 3 },
2272 { { "cl", "ch", "ecx", "rcx" }, 2 },
2273 { { "dl", "dh", "edx", "rdx" }, 1 },
2274 { { "esi", "rsi" }, 4 },
2275 { { "edi", "rdi" }, 5 },
2276 { { "esp", "rsp" }, 7 },
2277 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002278 { { "r8d", "r8w", "r8b" }, 38 },
2279 { { "r9d", "r9w", "r9b" }, 39 },
2280 { { "r10d", "r10w", "r10b" }, 40 },
2281 { { "r11d", "r11w", "r11b" }, 41 },
2282 { { "r12d", "r12w", "r12b" }, 42 },
2283 { { "r13d", "r13w", "r13b" }, 43 },
2284 { { "r14d", "r14w", "r14b" }, 44 },
2285 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002286};
2287
2288// X86 target abstract base class; x86-32 and x86-64 are very close, so
2289// most of the implementation can be shared.
2290class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002291 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002292 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002293 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002294 enum MMX3DNowEnum {
2295 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002296 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002297 enum XOPEnum {
2298 NoXOP,
2299 SSE4A,
2300 FMA4,
2301 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002302 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002303
Craig Topper543f3bd2015-10-14 23:47:57 +00002304 bool HasAES = false;
2305 bool HasPCLMUL = false;
2306 bool HasLZCNT = false;
2307 bool HasRDRND = false;
2308 bool HasFSGSBASE = false;
2309 bool HasBMI = false;
2310 bool HasBMI2 = false;
2311 bool HasPOPCNT = false;
2312 bool HasRTM = false;
2313 bool HasPRFCHW = false;
2314 bool HasRDSEED = false;
2315 bool HasADX = false;
2316 bool HasTBM = false;
2317 bool HasFMA = false;
2318 bool HasF16C = false;
2319 bool HasAVX512CD = false;
2320 bool HasAVX512ER = false;
2321 bool HasAVX512PF = false;
2322 bool HasAVX512DQ = false;
2323 bool HasAVX512BW = false;
2324 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002325 bool HasAVX512VBMI = false;
2326 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002327 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002328 bool HasMPX = false;
2329 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002330 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002331 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002332 bool HasXSAVE = false;
2333 bool HasXSAVEOPT = false;
2334 bool HasXSAVEC = false;
2335 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002336 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002337 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002338 bool HasCLFLUSHOPT = false;
2339 bool HasPCOMMIT = false;
2340 bool HasCLWB = false;
2341 bool HasUMIP = false;
2342 bool HasMOVBE = false;
2343 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002344
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002345 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2346 ///
2347 /// Each enumeration represents a particular CPU supported by Clang. These
2348 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2349 enum CPUKind {
2350 CK_Generic,
2351
2352 /// \name i386
2353 /// i386-generation processors.
2354 //@{
2355 CK_i386,
2356 //@}
2357
2358 /// \name i486
2359 /// i486-generation processors.
2360 //@{
2361 CK_i486,
2362 CK_WinChipC6,
2363 CK_WinChip2,
2364 CK_C3,
2365 //@}
2366
2367 /// \name i586
2368 /// i586-generation processors, P5 microarchitecture based.
2369 //@{
2370 CK_i586,
2371 CK_Pentium,
2372 CK_PentiumMMX,
2373 //@}
2374
2375 /// \name i686
2376 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2377 //@{
2378 CK_i686,
2379 CK_PentiumPro,
2380 CK_Pentium2,
2381 CK_Pentium3,
2382 CK_Pentium3M,
2383 CK_PentiumM,
2384 CK_C3_2,
2385
2386 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2387 /// Clang however has some logic to suport this.
2388 // FIXME: Warn, deprecate, and potentially remove this.
2389 CK_Yonah,
2390 //@}
2391
2392 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002393 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002394 //@{
2395 CK_Pentium4,
2396 CK_Pentium4M,
2397 CK_Prescott,
2398 CK_Nocona,
2399 //@}
2400
2401 /// \name Core
2402 /// Core microarchitecture based processors.
2403 //@{
2404 CK_Core2,
2405
2406 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2407 /// codename which GCC no longer accepts as an option to -march, but Clang
2408 /// has some logic for recognizing it.
2409 // FIXME: Warn, deprecate, and potentially remove this.
2410 CK_Penryn,
2411 //@}
2412
2413 /// \name Atom
2414 /// Atom processors
2415 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002416 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002417 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002418 //@}
2419
2420 /// \name Nehalem
2421 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002422 CK_Nehalem,
2423
2424 /// \name Westmere
2425 /// Westmere microarchitecture based processors.
2426 CK_Westmere,
2427
2428 /// \name Sandy Bridge
2429 /// Sandy Bridge microarchitecture based processors.
2430 CK_SandyBridge,
2431
2432 /// \name Ivy Bridge
2433 /// Ivy Bridge microarchitecture based processors.
2434 CK_IvyBridge,
2435
2436 /// \name Haswell
2437 /// Haswell microarchitecture based processors.
2438 CK_Haswell,
2439
2440 /// \name Broadwell
2441 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002442 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002443
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002444 /// \name Skylake Client
2445 /// Skylake client microarchitecture based processors.
2446 CK_SkylakeClient,
2447
2448 /// \name Skylake Server
2449 /// Skylake server microarchitecture based processors.
2450 CK_SkylakeServer,
2451
2452 /// \name Cannonlake Client
2453 /// Cannonlake client microarchitecture based processors.
2454 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002455
Craig Topper449314e2013-08-20 07:09:39 +00002456 /// \name Knights Landing
2457 /// Knights Landing processor.
2458 CK_KNL,
2459
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002460 /// \name Lakemont
2461 /// Lakemont microarchitecture based processors.
2462 CK_Lakemont,
2463
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002464 /// \name K6
2465 /// K6 architecture processors.
2466 //@{
2467 CK_K6,
2468 CK_K6_2,
2469 CK_K6_3,
2470 //@}
2471
2472 /// \name K7
2473 /// K7 architecture processors.
2474 //@{
2475 CK_Athlon,
2476 CK_AthlonThunderbird,
2477 CK_Athlon4,
2478 CK_AthlonXP,
2479 CK_AthlonMP,
2480 //@}
2481
2482 /// \name K8
2483 /// K8 architecture processors.
2484 //@{
2485 CK_Athlon64,
2486 CK_Athlon64SSE3,
2487 CK_AthlonFX,
2488 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002489 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002490 CK_Opteron,
2491 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002492 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002493 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002494
Benjamin Kramer569f2152012-01-10 11:50:18 +00002495 /// \name Bobcat
2496 /// Bobcat architecture processors.
2497 //@{
2498 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002499 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002500 //@}
2501
2502 /// \name Bulldozer
2503 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002504 //@{
2505 CK_BDVER1,
2506 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002507 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002508 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002509 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002510
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002511 /// This specification is deprecated and will be removed in the future.
2512 /// Users should prefer \see CK_K8.
2513 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002514 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002515 CK_x86_64,
2516 //@}
2517
2518 /// \name Geode
2519 /// Geode processors.
2520 //@{
2521 CK_Geode
2522 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002523 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002524
Eric Christopherc50738f2015-08-27 00:05:50 +00002525 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002526 return llvm::StringSwitch<CPUKind>(CPU)
2527 .Case("i386", CK_i386)
2528 .Case("i486", CK_i486)
2529 .Case("winchip-c6", CK_WinChipC6)
2530 .Case("winchip2", CK_WinChip2)
2531 .Case("c3", CK_C3)
2532 .Case("i586", CK_i586)
2533 .Case("pentium", CK_Pentium)
2534 .Case("pentium-mmx", CK_PentiumMMX)
2535 .Case("i686", CK_i686)
2536 .Case("pentiumpro", CK_PentiumPro)
2537 .Case("pentium2", CK_Pentium2)
2538 .Case("pentium3", CK_Pentium3)
2539 .Case("pentium3m", CK_Pentium3M)
2540 .Case("pentium-m", CK_PentiumM)
2541 .Case("c3-2", CK_C3_2)
2542 .Case("yonah", CK_Yonah)
2543 .Case("pentium4", CK_Pentium4)
2544 .Case("pentium4m", CK_Pentium4M)
2545 .Case("prescott", CK_Prescott)
2546 .Case("nocona", CK_Nocona)
2547 .Case("core2", CK_Core2)
2548 .Case("penryn", CK_Penryn)
2549 .Case("bonnell", CK_Bonnell)
2550 .Case("atom", CK_Bonnell) // Legacy name.
2551 .Case("silvermont", CK_Silvermont)
2552 .Case("slm", CK_Silvermont) // Legacy name.
2553 .Case("nehalem", CK_Nehalem)
2554 .Case("corei7", CK_Nehalem) // Legacy name.
2555 .Case("westmere", CK_Westmere)
2556 .Case("sandybridge", CK_SandyBridge)
2557 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2558 .Case("ivybridge", CK_IvyBridge)
2559 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2560 .Case("haswell", CK_Haswell)
2561 .Case("core-avx2", CK_Haswell) // Legacy name.
2562 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002563 .Case("skylake", CK_SkylakeClient)
2564 .Case("skylake-avx512", CK_SkylakeServer)
2565 .Case("skx", CK_SkylakeServer) // Legacy name.
2566 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002567 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002568 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002569 .Case("k6", CK_K6)
2570 .Case("k6-2", CK_K6_2)
2571 .Case("k6-3", CK_K6_3)
2572 .Case("athlon", CK_Athlon)
2573 .Case("athlon-tbird", CK_AthlonThunderbird)
2574 .Case("athlon-4", CK_Athlon4)
2575 .Case("athlon-xp", CK_AthlonXP)
2576 .Case("athlon-mp", CK_AthlonMP)
2577 .Case("athlon64", CK_Athlon64)
2578 .Case("athlon64-sse3", CK_Athlon64SSE3)
2579 .Case("athlon-fx", CK_AthlonFX)
2580 .Case("k8", CK_K8)
2581 .Case("k8-sse3", CK_K8SSE3)
2582 .Case("opteron", CK_Opteron)
2583 .Case("opteron-sse3", CK_OpteronSSE3)
2584 .Case("barcelona", CK_AMDFAM10)
2585 .Case("amdfam10", CK_AMDFAM10)
2586 .Case("btver1", CK_BTVER1)
2587 .Case("btver2", CK_BTVER2)
2588 .Case("bdver1", CK_BDVER1)
2589 .Case("bdver2", CK_BDVER2)
2590 .Case("bdver3", CK_BDVER3)
2591 .Case("bdver4", CK_BDVER4)
2592 .Case("x86-64", CK_x86_64)
2593 .Case("geode", CK_Geode)
2594 .Default(CK_Generic);
2595 }
2596
Rafael Espindolaeb265472013-08-21 21:59:03 +00002597 enum FPMathKind {
2598 FP_Default,
2599 FP_SSE,
2600 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002601 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002602
Eli Friedman3fd920a2008-08-20 02:34:37 +00002603public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002604 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2605 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002606 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002607 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002608 }
Craig Topper3164f332014-03-11 03:39:26 +00002609 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002610 // X87 evaluates with 80 bits "long double" precision.
2611 return SSELevel == NoSSE ? 2 : 0;
2612 }
Craig Topper6c03a542015-10-19 04:51:35 +00002613 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2614 return llvm::makeArrayRef(BuiltinInfo,
2615 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002616 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002617 ArrayRef<const char *> getGCCRegNames() const override {
2618 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002619 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002620 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2621 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002622 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002623 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2624 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002625 }
Eric Christopherd9832702015-06-29 21:00:05 +00002626 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002627 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002628 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002629
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002630 bool validateGlobalRegisterVariable(StringRef RegName,
2631 unsigned RegSize,
2632 bool &HasSizeMismatch) const override {
2633 // esp and ebp are the only 32-bit registers the x86 backend can currently
2634 // handle.
2635 if (RegName.equals("esp") || RegName.equals("ebp")) {
2636 // Check that the register size is 32-bit.
2637 HasSizeMismatch = RegSize != 32;
2638 return true;
2639 }
2640
2641 return false;
2642 }
2643
Akira Hatanaka974131e2014-09-18 18:17:18 +00002644 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2645
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002646 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2647
Akira Hatanaka974131e2014-09-18 18:17:18 +00002648 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2649
Craig Topper3164f332014-03-11 03:39:26 +00002650 std::string convertConstraint(const char *&Constraint) const override;
2651 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002652 return "~{dirflag},~{fpsr},~{flags}";
2653 }
Craig Topper3164f332014-03-11 03:39:26 +00002654 void getTargetDefines(const LangOptions &Opts,
2655 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002656 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2657 bool Enabled);
2658 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2659 bool Enabled);
2660 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2661 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002662 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2663 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002664 setFeatureEnabledImpl(Features, Name, Enabled);
2665 }
2666 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002667 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002668 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2669 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002670 bool
2671 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2672 StringRef CPU,
2673 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002674 bool hasFeature(StringRef Feature) const override;
2675 bool handleTargetFeatures(std::vector<std::string> &Features,
2676 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002677 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002678 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2679 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002680 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002681 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002682 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002683 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002684 return "no-mmx";
2685 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002686 }
Craig Topper3164f332014-03-11 03:39:26 +00002687 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002688 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002689
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002690 // Perform any per-CPU checks necessary to determine if this CPU is
2691 // acceptable.
2692 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2693 // invalid without explaining *why*.
2694 switch (CPU) {
2695 case CK_Generic:
2696 // No processor selected!
2697 return false;
2698
2699 case CK_i386:
2700 case CK_i486:
2701 case CK_WinChipC6:
2702 case CK_WinChip2:
2703 case CK_C3:
2704 case CK_i586:
2705 case CK_Pentium:
2706 case CK_PentiumMMX:
2707 case CK_i686:
2708 case CK_PentiumPro:
2709 case CK_Pentium2:
2710 case CK_Pentium3:
2711 case CK_Pentium3M:
2712 case CK_PentiumM:
2713 case CK_Yonah:
2714 case CK_C3_2:
2715 case CK_Pentium4:
2716 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002717 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002718 case CK_Prescott:
2719 case CK_K6:
2720 case CK_K6_2:
2721 case CK_K6_3:
2722 case CK_Athlon:
2723 case CK_AthlonThunderbird:
2724 case CK_Athlon4:
2725 case CK_AthlonXP:
2726 case CK_AthlonMP:
2727 case CK_Geode:
2728 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002729 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002730 return false;
2731
2732 // Fallthrough
2733 case CK_Nocona:
2734 case CK_Core2:
2735 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002736 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002737 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002738 case CK_Nehalem:
2739 case CK_Westmere:
2740 case CK_SandyBridge:
2741 case CK_IvyBridge:
2742 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002743 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002744 case CK_SkylakeClient:
2745 case CK_SkylakeServer:
2746 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002747 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002748 case CK_Athlon64:
2749 case CK_Athlon64SSE3:
2750 case CK_AthlonFX:
2751 case CK_K8:
2752 case CK_K8SSE3:
2753 case CK_Opteron:
2754 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002755 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002756 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002757 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002758 case CK_BDVER1:
2759 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002760 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002761 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002762 case CK_x86_64:
2763 return true;
2764 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002765 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002766 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002767
Craig Topper3164f332014-03-11 03:39:26 +00002768 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002769
Craig Topper3164f332014-03-11 03:39:26 +00002770 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002771 // Most of the non-ARM calling conventions are i386 conventions.
2772 switch (CC) {
2773 case CC_X86ThisCall:
2774 case CC_X86FastCall:
2775 case CC_X86StdCall:
2776 case CC_X86VectorCall:
2777 case CC_C:
2778 case CC_Swift:
2779 case CC_X86Pascal:
2780 case CC_IntelOclBicc:
2781 return CCCR_OK;
2782 default:
2783 return CCCR_Warning;
2784 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002785 }
2786
Craig Topper3164f332014-03-11 03:39:26 +00002787 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002788 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002789 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002790
2791 bool hasSjLjLowering() const override {
2792 return true;
2793 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002794
2795 void setSupportedOpenCLOpts() override {
2796 getSupportedOpenCLOpts().setAll();
2797 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002798};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002799
Rafael Espindolaeb265472013-08-21 21:59:03 +00002800bool X86TargetInfo::setFPMath(StringRef Name) {
2801 if (Name == "387") {
2802 FPMath = FP_387;
2803 return true;
2804 }
2805 if (Name == "sse") {
2806 FPMath = FP_SSE;
2807 return true;
2808 }
2809 return false;
2810}
2811
Eric Christopher007b0a02015-08-28 22:32:01 +00002812bool X86TargetInfo::initFeatureMap(
2813 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002814 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002815 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002816 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002817 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002818 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002819
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002820 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002821
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002822 // Enable X87 for all X86 processors but Lakemont.
2823 if (Kind != CK_Lakemont)
2824 setFeatureEnabledImpl(Features, "x87", true);
2825
2826 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002827 case CK_Generic:
2828 case CK_i386:
2829 case CK_i486:
2830 case CK_i586:
2831 case CK_Pentium:
2832 case CK_i686:
2833 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002834 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002835 break;
2836 case CK_PentiumMMX:
2837 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002838 case CK_K6:
2839 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002840 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002841 break;
2842 case CK_Pentium3:
2843 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002844 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002845 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002846 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002847 break;
2848 case CK_PentiumM:
2849 case CK_Pentium4:
2850 case CK_Pentium4M:
2851 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002852 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002853 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002854 break;
2855 case CK_Yonah:
2856 case CK_Prescott:
2857 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002858 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002859 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002860 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002861 break;
2862 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002863 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002864 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002865 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002866 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002867 break;
2868 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002869 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002870 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002871 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002872 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002873 case CK_Cannonlake:
2874 setFeatureEnabledImpl(Features, "avx512ifma", true);
2875 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2876 setFeatureEnabledImpl(Features, "sha", true);
2877 setFeatureEnabledImpl(Features, "umip", true);
2878 // FALLTHROUGH
2879 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002880 setFeatureEnabledImpl(Features, "avx512f", true);
2881 setFeatureEnabledImpl(Features, "avx512cd", true);
2882 setFeatureEnabledImpl(Features, "avx512dq", true);
2883 setFeatureEnabledImpl(Features, "avx512bw", true);
2884 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002885 setFeatureEnabledImpl(Features, "pku", true);
2886 setFeatureEnabledImpl(Features, "pcommit", true);
2887 setFeatureEnabledImpl(Features, "clwb", true);
2888 // FALLTHROUGH
2889 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002890 setFeatureEnabledImpl(Features, "xsavec", true);
2891 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002892 setFeatureEnabledImpl(Features, "mpx", true);
2893 setFeatureEnabledImpl(Features, "sgx", true);
2894 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002895 // FALLTHROUGH
2896 case CK_Broadwell:
2897 setFeatureEnabledImpl(Features, "rdseed", true);
2898 setFeatureEnabledImpl(Features, "adx", true);
2899 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002900 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002901 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002902 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002903 setFeatureEnabledImpl(Features, "bmi", true);
2904 setFeatureEnabledImpl(Features, "bmi2", true);
2905 setFeatureEnabledImpl(Features, "rtm", true);
2906 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002907 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002908 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002909 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002910 setFeatureEnabledImpl(Features, "rdrnd", true);
2911 setFeatureEnabledImpl(Features, "f16c", true);
2912 setFeatureEnabledImpl(Features, "fsgsbase", true);
2913 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002914 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002915 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002916 setFeatureEnabledImpl(Features, "xsave", true);
2917 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002918 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002919 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002920 case CK_Silvermont:
2921 setFeatureEnabledImpl(Features, "aes", true);
2922 setFeatureEnabledImpl(Features, "pclmul", true);
2923 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002924 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002925 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002926 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002927 setFeatureEnabledImpl(Features, "cx16", true);
2928 break;
2929 case CK_KNL:
2930 setFeatureEnabledImpl(Features, "avx512f", true);
2931 setFeatureEnabledImpl(Features, "avx512cd", true);
2932 setFeatureEnabledImpl(Features, "avx512er", true);
2933 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002934 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002935 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002936 setFeatureEnabledImpl(Features, "rdseed", true);
2937 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002938 setFeatureEnabledImpl(Features, "lzcnt", true);
2939 setFeatureEnabledImpl(Features, "bmi", true);
2940 setFeatureEnabledImpl(Features, "bmi2", true);
2941 setFeatureEnabledImpl(Features, "rtm", true);
2942 setFeatureEnabledImpl(Features, "fma", true);
2943 setFeatureEnabledImpl(Features, "rdrnd", true);
2944 setFeatureEnabledImpl(Features, "f16c", true);
2945 setFeatureEnabledImpl(Features, "fsgsbase", true);
2946 setFeatureEnabledImpl(Features, "aes", true);
2947 setFeatureEnabledImpl(Features, "pclmul", true);
2948 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002949 setFeatureEnabledImpl(Features, "xsaveopt", true);
2950 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002951 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002952 break;
2953 case CK_K6_2:
2954 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002955 case CK_WinChip2:
2956 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002957 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002958 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002959 case CK_Athlon:
2960 case CK_AthlonThunderbird:
2961 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002962 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002963 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002964 case CK_Athlon4:
2965 case CK_AthlonXP:
2966 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002967 setFeatureEnabledImpl(Features, "sse", true);
2968 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002969 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002970 break;
2971 case CK_K8:
2972 case CK_Opteron:
2973 case CK_Athlon64:
2974 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002975 setFeatureEnabledImpl(Features, "sse2", true);
2976 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002977 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002978 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002979 case CK_AMDFAM10:
2980 setFeatureEnabledImpl(Features, "sse4a", true);
2981 setFeatureEnabledImpl(Features, "lzcnt", true);
2982 setFeatureEnabledImpl(Features, "popcnt", true);
2983 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002984 case CK_K8SSE3:
2985 case CK_OpteronSSE3:
2986 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002987 setFeatureEnabledImpl(Features, "sse3", true);
2988 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002989 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002990 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002991 case CK_BTVER2:
2992 setFeatureEnabledImpl(Features, "avx", true);
2993 setFeatureEnabledImpl(Features, "aes", true);
2994 setFeatureEnabledImpl(Features, "pclmul", true);
2995 setFeatureEnabledImpl(Features, "bmi", true);
2996 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002997 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002998 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002999 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003000 setFeatureEnabledImpl(Features, "ssse3", true);
3001 setFeatureEnabledImpl(Features, "sse4a", true);
3002 setFeatureEnabledImpl(Features, "lzcnt", true);
3003 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003004 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003005 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003006 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003007 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003008 case CK_BDVER4:
3009 setFeatureEnabledImpl(Features, "avx2", true);
3010 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003011 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003012 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003013 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003014 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003015 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003016 // FALLTHROUGH
3017 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003018 setFeatureEnabledImpl(Features, "bmi", true);
3019 setFeatureEnabledImpl(Features, "fma", true);
3020 setFeatureEnabledImpl(Features, "f16c", true);
3021 setFeatureEnabledImpl(Features, "tbm", true);
3022 // FALLTHROUGH
3023 case CK_BDVER1:
3024 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003025 setFeatureEnabledImpl(Features, "xop", true);
3026 setFeatureEnabledImpl(Features, "lzcnt", true);
3027 setFeatureEnabledImpl(Features, "aes", true);
3028 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003029 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003030 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003031 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003032 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003033 break;
Eli Friedman33465822011-07-08 23:31:17 +00003034 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003035 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3036 return false;
3037
3038 // Can't do this earlier because we need to be able to explicitly enable
3039 // or disable these features and the things that they depend upon.
3040
3041 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3042 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003043 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003044 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3045 FeaturesVec.end())
3046 Features["popcnt"] = true;
3047
3048 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3049 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003050 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003051 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3052 FeaturesVec.end())
3053 Features["prfchw"] = true;
3054
Eric Christophera7260af2015-10-08 20:10:18 +00003055 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3056 // then enable MMX.
3057 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003058 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003059 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3060 FeaturesVec.end())
3061 Features["mmx"] = true;
3062
Eric Christopherbbd746d2015-10-08 20:10:14 +00003063 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003064}
3065
Rafael Espindolae62e2792013-08-20 13:44:29 +00003066void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003067 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003068 if (Enabled) {
3069 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003070 case AVX512F:
3071 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003072 case AVX2:
3073 Features["avx2"] = true;
3074 case AVX:
3075 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003076 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003077 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003078 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003079 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003080 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003081 case SSSE3:
3082 Features["ssse3"] = true;
3083 case SSE3:
3084 Features["sse3"] = true;
3085 case SSE2:
3086 Features["sse2"] = true;
3087 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003088 Features["sse"] = true;
3089 case NoSSE:
3090 break;
3091 }
3092 return;
3093 }
3094
3095 switch (Level) {
3096 case NoSSE:
3097 case SSE1:
3098 Features["sse"] = false;
3099 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003100 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3101 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003102 case SSE3:
3103 Features["sse3"] = false;
3104 setXOPLevel(Features, NoXOP, false);
3105 case SSSE3:
3106 Features["ssse3"] = false;
3107 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003108 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003109 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003110 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003111 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003112 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3113 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003114 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003115 case AVX2:
3116 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003117 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003118 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003119 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003120 Features["avx512vl"] = Features["avx512vbmi"] =
3121 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003122 }
3123}
3124
3125void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003126 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003127 if (Enabled) {
3128 switch (Level) {
3129 case AMD3DNowAthlon:
3130 Features["3dnowa"] = true;
3131 case AMD3DNow:
3132 Features["3dnow"] = true;
3133 case MMX:
3134 Features["mmx"] = true;
3135 case NoMMX3DNow:
3136 break;
3137 }
3138 return;
3139 }
3140
3141 switch (Level) {
3142 case NoMMX3DNow:
3143 case MMX:
3144 Features["mmx"] = false;
3145 case AMD3DNow:
3146 Features["3dnow"] = false;
3147 case AMD3DNowAthlon:
3148 Features["3dnowa"] = false;
3149 }
3150}
3151
3152void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003153 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003154 if (Enabled) {
3155 switch (Level) {
3156 case XOP:
3157 Features["xop"] = true;
3158 case FMA4:
3159 Features["fma4"] = true;
3160 setSSELevel(Features, AVX, true);
3161 case SSE4A:
3162 Features["sse4a"] = true;
3163 setSSELevel(Features, SSE3, true);
3164 case NoXOP:
3165 break;
3166 }
3167 return;
3168 }
3169
3170 switch (Level) {
3171 case NoXOP:
3172 case SSE4A:
3173 Features["sse4a"] = false;
3174 case FMA4:
3175 Features["fma4"] = false;
3176 case XOP:
3177 Features["xop"] = false;
3178 }
3179}
3180
Craig Topper86d79ef2013-09-17 04:51:29 +00003181void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3182 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003183 // This is a bit of a hack to deal with the sse4 target feature when used
3184 // as part of the target attribute. We handle sse4 correctly everywhere
3185 // else. See below for more information on how we handle the sse4 options.
3186 if (Name != "sse4")
3187 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003188
Craig Topper29561122013-09-19 01:13:07 +00003189 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003190 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003191 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003192 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003193 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003194 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003195 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003196 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003197 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003198 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003199 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003200 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003201 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003202 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003203 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003204 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003205 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003206 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003207 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003208 if (Enabled)
3209 setSSELevel(Features, SSE2, Enabled);
3210 } else if (Name == "pclmul") {
3211 if (Enabled)
3212 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003213 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003214 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003215 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003216 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003217 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003218 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003219 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3220 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3221 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003222 if (Enabled)
3223 setSSELevel(Features, AVX512F, Enabled);
3224 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003225 if (Enabled)
3226 setSSELevel(Features, AVX, Enabled);
3227 } else if (Name == "fma4") {
3228 setXOPLevel(Features, FMA4, Enabled);
3229 } else if (Name == "xop") {
3230 setXOPLevel(Features, XOP, Enabled);
3231 } else if (Name == "sse4a") {
3232 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003233 } else if (Name == "f16c") {
3234 if (Enabled)
3235 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003236 } else if (Name == "sha") {
3237 if (Enabled)
3238 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003239 } else if (Name == "sse4") {
3240 // We can get here via the __target__ attribute since that's not controlled
3241 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3242 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3243 // disabled.
3244 if (Enabled)
3245 setSSELevel(Features, SSE42, Enabled);
3246 else
3247 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003248 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003249 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003250 Features["xsaveopt"] = false;
3251 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003252 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003253 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003254 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003255}
3256
Eric Christopher3ff21b32013-10-16 21:26:26 +00003257/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003258/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003259bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003260 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003261 for (const auto &Feature : Features) {
3262 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003263 continue;
3264
Eric Christopher610fe112015-08-26 08:21:55 +00003265 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003266 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003267 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003268 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003269 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003270 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003271 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003272 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003273 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003274 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003275 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003276 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003277 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003278 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003279 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003280 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003281 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003282 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003283 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003284 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003285 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003286 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003287 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003288 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003289 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003290 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003291 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003292 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003293 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003294 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003295 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003296 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003297 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003298 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003299 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003300 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003301 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003302 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003303 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003304 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003305 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003306 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003307 } else if (Feature == "+avx512vbmi") {
3308 HasAVX512VBMI = true;
3309 } else if (Feature == "+avx512ifma") {
3310 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003311 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003312 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003313 } else if (Feature == "+mpx") {
3314 HasMPX = true;
3315 } else if (Feature == "+movbe") {
3316 HasMOVBE = true;
3317 } else if (Feature == "+sgx") {
3318 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003319 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003320 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003321 } else if (Feature == "+fxsr") {
3322 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003323 } else if (Feature == "+xsave") {
3324 HasXSAVE = true;
3325 } else if (Feature == "+xsaveopt") {
3326 HasXSAVEOPT = true;
3327 } else if (Feature == "+xsavec") {
3328 HasXSAVEC = true;
3329 } else if (Feature == "+xsaves") {
3330 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003331 } else if (Feature == "+mwaitx") {
3332 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003333 } else if (Feature == "+pku") {
3334 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003335 } else if (Feature == "+clflushopt") {
3336 HasCLFLUSHOPT = true;
3337 } else if (Feature == "+pcommit") {
3338 HasPCOMMIT = true;
3339 } else if (Feature == "+clwb") {
3340 HasCLWB = true;
3341 } else if (Feature == "+umip") {
3342 HasUMIP = true;
3343 } else if (Feature == "+prefetchwt1") {
3344 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003345 }
3346
Benjamin Kramer27402c62012-03-05 15:10:44 +00003347 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003348 .Case("+avx512f", AVX512F)
3349 .Case("+avx2", AVX2)
3350 .Case("+avx", AVX)
3351 .Case("+sse4.2", SSE42)
3352 .Case("+sse4.1", SSE41)
3353 .Case("+ssse3", SSSE3)
3354 .Case("+sse3", SSE3)
3355 .Case("+sse2", SSE2)
3356 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003357 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003358 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003359
Eli Friedman33465822011-07-08 23:31:17 +00003360 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003361 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003362 .Case("+3dnowa", AMD3DNowAthlon)
3363 .Case("+3dnow", AMD3DNow)
3364 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003365 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003366 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003367
3368 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003369 .Case("+xop", XOP)
3370 .Case("+fma4", FMA4)
3371 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003372 .Default(NoXOP);
3373 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003374 }
Eli Friedman33465822011-07-08 23:31:17 +00003375
Rafael Espindolaeb265472013-08-21 21:59:03 +00003376 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3377 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003378 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3379 (FPMath == FP_387 && SSELevel >= SSE1)) {
3380 Diags.Report(diag::err_target_unsupported_fpmath) <<
3381 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003382 return false;
3383 }
3384
Alexey Bataev00396512015-07-02 03:40:19 +00003385 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003386 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003387 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003388}
Chris Lattnerecd49032009-03-02 22:27:17 +00003389
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003390/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3391/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003392void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003393 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003394 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003395 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003396 Builder.defineMacro("__amd64__");
3397 Builder.defineMacro("__amd64");
3398 Builder.defineMacro("__x86_64");
3399 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003400 if (getTriple().getArchName() == "x86_64h") {
3401 Builder.defineMacro("__x86_64h");
3402 Builder.defineMacro("__x86_64h__");
3403 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003404 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003405 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003406 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003407
Chris Lattnerecd49032009-03-02 22:27:17 +00003408 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003409 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3410 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003411 switch (CPU) {
3412 case CK_Generic:
3413 break;
3414 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003415 // The rest are coming from the i386 define above.
3416 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003417 break;
3418 case CK_i486:
3419 case CK_WinChipC6:
3420 case CK_WinChip2:
3421 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003422 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003423 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003424 case CK_PentiumMMX:
3425 Builder.defineMacro("__pentium_mmx__");
3426 Builder.defineMacro("__tune_pentium_mmx__");
3427 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003428 case CK_i586:
3429 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003430 defineCPUMacros(Builder, "i586");
3431 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003432 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003433 case CK_Pentium3:
3434 case CK_Pentium3M:
3435 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003436 Builder.defineMacro("__tune_pentium3__");
3437 // Fallthrough
3438 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003439 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003440 Builder.defineMacro("__tune_pentium2__");
3441 // Fallthrough
3442 case CK_PentiumPro:
3443 Builder.defineMacro("__tune_i686__");
3444 Builder.defineMacro("__tune_pentiumpro__");
3445 // Fallthrough
3446 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003447 Builder.defineMacro("__i686");
3448 Builder.defineMacro("__i686__");
3449 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3450 Builder.defineMacro("__pentiumpro");
3451 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003452 break;
3453 case CK_Pentium4:
3454 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003455 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003456 break;
3457 case CK_Yonah:
3458 case CK_Prescott:
3459 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003460 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003461 break;
3462 case CK_Core2:
3463 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003464 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003465 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003466 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003467 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003468 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003469 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003470 defineCPUMacros(Builder, "slm");
3471 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003472 case CK_Nehalem:
3473 case CK_Westmere:
3474 case CK_SandyBridge:
3475 case CK_IvyBridge:
3476 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003477 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003478 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003479 // FIXME: Historically, we defined this legacy name, it would be nice to
3480 // remove it at some point. We've never exposed fine-grained names for
3481 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003482 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003483 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003484 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003485 defineCPUMacros(Builder, "skx");
3486 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003487 case CK_Cannonlake:
3488 break;
Craig Topper449314e2013-08-20 07:09:39 +00003489 case CK_KNL:
3490 defineCPUMacros(Builder, "knl");
3491 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003492 case CK_Lakemont:
3493 Builder.defineMacro("__tune_lakemont__");
3494 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003495 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003496 Builder.defineMacro("__k6_2__");
3497 Builder.defineMacro("__tune_k6_2__");
3498 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003499 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003500 if (CPU != CK_K6_2) { // In case of fallthrough
3501 // FIXME: GCC may be enabling these in cases where some other k6
3502 // architecture is specified but -m3dnow is explicitly provided. The
3503 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003504 Builder.defineMacro("__k6_3__");
3505 Builder.defineMacro("__tune_k6_3__");
3506 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003507 // Fallthrough
3508 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003509 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003510 break;
3511 case CK_Athlon:
3512 case CK_AthlonThunderbird:
3513 case CK_Athlon4:
3514 case CK_AthlonXP:
3515 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003516 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003517 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003518 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003519 Builder.defineMacro("__tune_athlon_sse__");
3520 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003521 break;
3522 case CK_K8:
3523 case CK_K8SSE3:
3524 case CK_x86_64:
3525 case CK_Opteron:
3526 case CK_OpteronSSE3:
3527 case CK_Athlon64:
3528 case CK_Athlon64SSE3:
3529 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003530 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003531 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003532 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003533 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003534 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003535 case CK_BTVER1:
3536 defineCPUMacros(Builder, "btver1");
3537 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003538 case CK_BTVER2:
3539 defineCPUMacros(Builder, "btver2");
3540 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003541 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003542 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003543 break;
3544 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003545 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003546 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003547 case CK_BDVER3:
3548 defineCPUMacros(Builder, "bdver3");
3549 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003550 case CK_BDVER4:
3551 defineCPUMacros(Builder, "bdver4");
3552 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003553 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003554 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003555 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003556 }
Chris Lattner96e43572009-03-02 22:40:39 +00003557
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003558 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003559 Builder.defineMacro("__REGISTER_PREFIX__", "");
3560
Chris Lattner6df41af2009-04-19 17:32:33 +00003561 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3562 // functions in glibc header files that use FP Stack inline asm which the
3563 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003564 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003565
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003566 if (HasAES)
3567 Builder.defineMacro("__AES__");
3568
Craig Topper3f122a72012-05-31 05:18:48 +00003569 if (HasPCLMUL)
3570 Builder.defineMacro("__PCLMUL__");
3571
Craig Topper22967d42011-12-25 05:06:45 +00003572 if (HasLZCNT)
3573 Builder.defineMacro("__LZCNT__");
3574
Benjamin Kramer1e250392012-07-07 09:39:18 +00003575 if (HasRDRND)
3576 Builder.defineMacro("__RDRND__");
3577
Craig Topper8c7f2512014-11-03 06:51:41 +00003578 if (HasFSGSBASE)
3579 Builder.defineMacro("__FSGSBASE__");
3580
Craig Topper22967d42011-12-25 05:06:45 +00003581 if (HasBMI)
3582 Builder.defineMacro("__BMI__");
3583
3584 if (HasBMI2)
3585 Builder.defineMacro("__BMI2__");
3586
Craig Topper1de83482011-12-29 16:10:46 +00003587 if (HasPOPCNT)
3588 Builder.defineMacro("__POPCNT__");
3589
Michael Liao625a8752012-11-10 05:17:46 +00003590 if (HasRTM)
3591 Builder.defineMacro("__RTM__");
3592
Michael Liao74f4eaf2013-03-26 17:52:08 +00003593 if (HasPRFCHW)
3594 Builder.defineMacro("__PRFCHW__");
3595
Michael Liaoffaae352013-03-29 05:17:55 +00003596 if (HasRDSEED)
3597 Builder.defineMacro("__RDSEED__");
3598
Robert Khasanov50e6f582014-09-19 09:53:48 +00003599 if (HasADX)
3600 Builder.defineMacro("__ADX__");
3601
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003602 if (HasTBM)
3603 Builder.defineMacro("__TBM__");
3604
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003605 if (HasMWAITX)
3606 Builder.defineMacro("__MWAITX__");
3607
Rafael Espindolae62e2792013-08-20 13:44:29 +00003608 switch (XOPLevel) {
3609 case XOP:
3610 Builder.defineMacro("__XOP__");
3611 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003612 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003613 case SSE4A:
3614 Builder.defineMacro("__SSE4A__");
3615 case NoXOP:
3616 break;
3617 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003618
Craig Topperbba778b2012-06-03 21:46:30 +00003619 if (HasFMA)
3620 Builder.defineMacro("__FMA__");
3621
Manman Rena45358c2012-10-11 00:59:55 +00003622 if (HasF16C)
3623 Builder.defineMacro("__F16C__");
3624
Craig Topper679b53a2013-08-21 05:29:10 +00003625 if (HasAVX512CD)
3626 Builder.defineMacro("__AVX512CD__");
3627 if (HasAVX512ER)
3628 Builder.defineMacro("__AVX512ER__");
3629 if (HasAVX512PF)
3630 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003631 if (HasAVX512DQ)
3632 Builder.defineMacro("__AVX512DQ__");
3633 if (HasAVX512BW)
3634 Builder.defineMacro("__AVX512BW__");
3635 if (HasAVX512VL)
3636 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003637 if (HasAVX512VBMI)
3638 Builder.defineMacro("__AVX512VBMI__");
3639 if (HasAVX512IFMA)
3640 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003641
Ben Langmuir58078d02013-09-19 13:22:04 +00003642 if (HasSHA)
3643 Builder.defineMacro("__SHA__");
3644
Craig Toppere33f51f2015-10-16 06:22:36 +00003645 if (HasFXSR)
3646 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003647 if (HasXSAVE)
3648 Builder.defineMacro("__XSAVE__");
3649 if (HasXSAVEOPT)
3650 Builder.defineMacro("__XSAVEOPT__");
3651 if (HasXSAVEC)
3652 Builder.defineMacro("__XSAVEC__");
3653 if (HasXSAVES)
3654 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003655 if (HasPKU)
3656 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003657 if (HasCX16)
3658 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3659
Chris Lattner96e43572009-03-02 22:40:39 +00003660 // Each case falls through to the previous one here.
3661 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003662 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003663 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003664 case AVX2:
3665 Builder.defineMacro("__AVX2__");
3666 case AVX:
3667 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003668 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003669 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003670 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003671 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003672 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003673 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003674 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003675 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003676 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003677 Builder.defineMacro("__SSE2__");
3678 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003679 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003680 Builder.defineMacro("__SSE__");
3681 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003682 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003683 break;
3684 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003685
Derek Schuffc7dd7222012-10-11 15:52:22 +00003686 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003687 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003688 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003689 case AVX2:
3690 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003691 case SSE42:
3692 case SSE41:
3693 case SSSE3:
3694 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003695 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003696 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003697 break;
3698 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003699 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003700 break;
3701 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003702 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003703 }
3704 }
3705
Anders Carlssone437c682010-01-27 03:47:49 +00003706 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003707 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003708 case AMD3DNowAthlon:
3709 Builder.defineMacro("__3dNOW_A__");
3710 case AMD3DNow:
3711 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003712 case MMX:
3713 Builder.defineMacro("__MMX__");
3714 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003715 break;
3716 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003717
3718 if (CPU >= CK_i486) {
3719 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3720 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3721 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3722 }
3723 if (CPU >= CK_i586)
3724 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003725}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003726
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003727bool X86TargetInfo::hasFeature(StringRef Feature) const {
3728 return llvm::StringSwitch<bool>(Feature)
3729 .Case("aes", HasAES)
3730 .Case("avx", SSELevel >= AVX)
3731 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003732 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003733 .Case("avx512cd", HasAVX512CD)
3734 .Case("avx512er", HasAVX512ER)
3735 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003736 .Case("avx512dq", HasAVX512DQ)
3737 .Case("avx512bw", HasAVX512BW)
3738 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003739 .Case("avx512vbmi", HasAVX512VBMI)
3740 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003741 .Case("bmi", HasBMI)
3742 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003743 .Case("clflushopt", HasCLFLUSHOPT)
3744 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003745 .Case("cx16", HasCX16)
3746 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003747 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003748 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003749 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003750 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003751 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003752 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3753 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3754 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003755 .Case("movbe", HasMOVBE)
3756 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003757 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003758 .Case("pcommit", HasPCOMMIT)
3759 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003760 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003761 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003762 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003763 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003764 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003765 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003766 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003767 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003768 .Case("sse", SSELevel >= SSE1)
3769 .Case("sse2", SSELevel >= SSE2)
3770 .Case("sse3", SSELevel >= SSE3)
3771 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003772 .Case("sse4.1", SSELevel >= SSE41)
3773 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003774 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003775 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003776 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003777 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003778 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3779 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003780 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003781 .Case("xsave", HasXSAVE)
3782 .Case("xsavec", HasXSAVEC)
3783 .Case("xsaves", HasXSAVES)
3784 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003785 .Default(false);
3786}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003787
Eric Christopherd9832702015-06-29 21:00:05 +00003788// We can't use a generic validation scheme for the features accepted here
3789// versus subtarget features accepted in the target attribute because the
3790// bitfield structure that's initialized in the runtime only supports the
3791// below currently rather than the full range of subtarget features. (See
3792// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3793bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3794 return llvm::StringSwitch<bool>(FeatureStr)
3795 .Case("cmov", true)
3796 .Case("mmx", true)
3797 .Case("popcnt", true)
3798 .Case("sse", true)
3799 .Case("sse2", true)
3800 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003801 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003802 .Case("sse4.1", true)
3803 .Case("sse4.2", true)
3804 .Case("avx", true)
3805 .Case("avx2", true)
3806 .Case("sse4a", true)
3807 .Case("fma4", true)
3808 .Case("xop", true)
3809 .Case("fma", true)
3810 .Case("avx512f", true)
3811 .Case("bmi", true)
3812 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003813 .Case("aes", true)
3814 .Case("pclmul", true)
3815 .Case("avx512vl", true)
3816 .Case("avx512bw", true)
3817 .Case("avx512dq", true)
3818 .Case("avx512cd", true)
3819 .Case("avx512er", true)
3820 .Case("avx512pf", true)
3821 .Case("avx512vbmi", true)
3822 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003823 .Default(false);
3824}
3825
Eli Friedman3fd920a2008-08-20 02:34:37 +00003826bool
Anders Carlsson58436352009-02-28 17:11:49 +00003827X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003828 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003829 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003830 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003831 // Constant constraints.
3832 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3833 // instructions.
3834 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3835 // x86_64 instructions.
3836 case 's':
3837 Info.setRequiresImmediate();
3838 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003839 case 'I':
3840 Info.setRequiresImmediate(0, 31);
3841 return true;
3842 case 'J':
3843 Info.setRequiresImmediate(0, 63);
3844 return true;
3845 case 'K':
3846 Info.setRequiresImmediate(-128, 127);
3847 return true;
3848 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003849 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003850 return true;
3851 case 'M':
3852 Info.setRequiresImmediate(0, 3);
3853 return true;
3854 case 'N':
3855 Info.setRequiresImmediate(0, 255);
3856 return true;
3857 case 'O':
3858 Info.setRequiresImmediate(0, 127);
3859 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003860 // Register constraints.
3861 case 'Y': // 'Y' is the first character for several 2-character constraints.
3862 // Shift the pointer to the second character of the constraint.
3863 Name++;
3864 switch (*Name) {
3865 default:
3866 return false;
3867 case '0': // First SSE register.
3868 case 't': // Any SSE register, when SSE2 is enabled.
3869 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3870 case 'm': // Any MMX register, when inter-unit moves enabled.
3871 Info.setAllowsRegister();
3872 return true;
3873 }
3874 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003875 // Constraint 'f' cannot be used for output operands.
3876 if (Info.ConstraintStr[0] == '=')
3877 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003878 Info.setAllowsRegister();
3879 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003880 case 'a': // eax.
3881 case 'b': // ebx.
3882 case 'c': // ecx.
3883 case 'd': // edx.
3884 case 'S': // esi.
3885 case 'D': // edi.
3886 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003887 case 't': // Top of floating point stack.
3888 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003889 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003890 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003891 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003892 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003893 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3894 case 'l': // "Index" registers: any general register that can be used as an
3895 // index in a base+index memory access.
3896 Info.setAllowsRegister();
3897 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003898 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003899 case 'C': // SSE floating point constant.
3900 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003901 return true;
3902 }
3903}
3904
Akira Hatanaka974131e2014-09-18 18:17:18 +00003905bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3906 unsigned Size) const {
3907 // Strip off constraint modifiers.
3908 while (Constraint[0] == '=' ||
3909 Constraint[0] == '+' ||
3910 Constraint[0] == '&')
3911 Constraint = Constraint.substr(1);
3912
3913 return validateOperandSize(Constraint, Size);
3914}
3915
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003916bool X86TargetInfo::validateInputSize(StringRef Constraint,
3917 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003918 return validateOperandSize(Constraint, Size);
3919}
3920
3921bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3922 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003923 switch (Constraint[0]) {
3924 default: break;
3925 case 'y':
3926 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003927 case 'f':
3928 case 't':
3929 case 'u':
3930 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003931 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003932 if (SSELevel >= AVX512F)
3933 // 512-bit zmm registers can be used if target supports AVX512F.
3934 return Size <= 512U;
3935 else if (SSELevel >= AVX)
3936 // 256-bit ymm registers can be used if target supports AVX.
3937 return Size <= 256U;
3938 return Size <= 128U;
3939 case 'Y':
3940 // 'Y' is the first character for several 2-character constraints.
3941 switch (Constraint[1]) {
3942 default: break;
3943 case 'm':
3944 // 'Ym' is synonymous with 'y'.
3945 return Size <= 64;
3946 case 'i':
3947 case 't':
3948 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3949 if (SSELevel >= AVX512F)
3950 return Size <= 512U;
3951 else if (SSELevel >= AVX)
3952 return Size <= 256U;
3953 return SSELevel >= SSE2 && Size <= 128U;
3954 }
3955
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003956 }
3957
3958 return true;
3959}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003960
Eli Friedman3fd920a2008-08-20 02:34:37 +00003961std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003962X86TargetInfo::convertConstraint(const char *&Constraint) const {
3963 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003964 case 'a': return std::string("{ax}");
3965 case 'b': return std::string("{bx}");
3966 case 'c': return std::string("{cx}");
3967 case 'd': return std::string("{dx}");
3968 case 'S': return std::string("{si}");
3969 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003970 case 'p': // address
3971 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003972 case 't': // top of floating point stack.
3973 return std::string("{st}");
3974 case 'u': // second from top of floating point stack.
3975 return std::string("{st(1)}"); // second from top of floating point stack.
3976 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003977 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003978 }
3979}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003980
Eli Friedman3fd920a2008-08-20 02:34:37 +00003981// X86-32 generic target
3982class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003983public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003984 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3985 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003986 DoubleAlign = LongLongAlign = 32;
3987 LongDoubleWidth = 96;
3988 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003989 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003990 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003991 SizeType = UnsignedInt;
3992 PtrDiffType = SignedInt;
3993 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003994 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003995
3996 // Use fpret for all types.
3997 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3998 (1 << TargetInfo::Double) |
3999 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004000
4001 // x86-32 has atomics up to 8 bytes
4002 // FIXME: Check that we actually have cmpxchg8b before setting
4003 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4004 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004005 }
Craig Topper3164f332014-03-11 03:39:26 +00004006 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004007 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004008 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004009
Craig Topper3164f332014-03-11 03:39:26 +00004010 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004011 if (RegNo == 0) return 0;
4012 if (RegNo == 1) return 2;
4013 return -1;
4014 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004015 bool validateOperandSize(StringRef Constraint,
4016 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004017 switch (Constraint[0]) {
4018 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004019 case 'R':
4020 case 'q':
4021 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004022 case 'a':
4023 case 'b':
4024 case 'c':
4025 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004026 case 'S':
4027 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004028 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004029 case 'A':
4030 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004031 }
4032
Akira Hatanaka974131e2014-09-18 18:17:18 +00004033 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004034 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004035};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004036
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004037class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4038public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004039 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4040 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004041
Craig Topper3164f332014-03-11 03:39:26 +00004042 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004043 unsigned Major, Minor, Micro;
4044 getTriple().getOSVersion(Major, Minor, Micro);
4045 // New NetBSD uses the default rounding mode.
4046 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4047 return X86_32TargetInfo::getFloatEvalMethod();
4048 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004049 return 1;
4050 }
4051};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004052
Eli Friedmane3aa4542009-07-05 18:47:56 +00004053class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4054public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004055 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4056 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004057 SizeType = UnsignedLong;
4058 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004059 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004060 }
4061};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004062
Eli Friedman9fa28852012-08-08 23:57:20 +00004063class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4064public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004065 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4066 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004067 SizeType = UnsignedLong;
4068 IntPtrType = SignedLong;
4069 PtrDiffType = SignedLong;
4070 }
4071};
Eli Friedman9fa28852012-08-08 23:57:20 +00004072
Torok Edwinb2b37c62009-06-30 17:10:35 +00004073class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004074public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004075 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4076 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004077 LongDoubleWidth = 128;
4078 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004079 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004080 MaxVectorAlign = 256;
4081 // The watchOS simulator uses the builtin bool type for Objective-C.
4082 llvm::Triple T = llvm::Triple(Triple);
4083 if (T.isWatchOS())
4084 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004085 SizeType = UnsignedLong;
4086 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004087 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004088 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004089 }
4090
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004091 bool handleTargetFeatures(std::vector<std::string> &Features,
4092 DiagnosticsEngine &Diags) override {
4093 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4094 Diags))
4095 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004096 // We now know the features we have: we can decide how to align vectors.
4097 MaxVectorAlign =
4098 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004099 return true;
4100 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004101};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004102
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004103// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004104class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004105public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004106 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4107 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004108 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004109 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004110 bool IsWinCOFF =
4111 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004112 resetDataLayout(IsWinCOFF
4113 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4114 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004115 }
Craig Topper3164f332014-03-11 03:39:26 +00004116 void getTargetDefines(const LangOptions &Opts,
4117 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004118 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4119 }
4120};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004121
4122// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004123class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004124public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004125 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4126 const TargetOptions &Opts)
4127 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004128 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004129 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4130 }
Craig Topper3164f332014-03-11 03:39:26 +00004131 void getTargetDefines(const LangOptions &Opts,
4132 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004133 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4134 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4135 // The value of the following reflects processor type.
4136 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4137 // We lost the original triple, so we use the default.
4138 Builder.defineMacro("_M_IX86", "600");
4139 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004140};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004141
David Majnemerae1ed0e2015-05-28 04:36:18 +00004142static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004143 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4144 // supports __declspec natively under -fms-extensions, but we define a no-op
4145 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004146 if (Opts.MicrosoftExt)
4147 Builder.defineMacro("__declspec", "__declspec");
4148 else
4149 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4150
4151 if (!Opts.MicrosoftExt) {
4152 // Provide macros for all the calling convention keywords. Provide both
4153 // single and double underscore prefixed variants. These are available on
4154 // x64 as well as x86, even though they have no effect.
4155 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4156 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004157 std::string GCCSpelling = "__attribute__((__";
4158 GCCSpelling += CC;
4159 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004160 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4161 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4162 }
4163 }
4164}
4165
David Majnemerae1ed0e2015-05-28 04:36:18 +00004166static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4167 Builder.defineMacro("__MSVCRT__");
4168 Builder.defineMacro("__MINGW32__");
4169 addCygMingDefines(Opts, Builder);
4170}
4171
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004172// x86-32 MinGW target
4173class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4174public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004175 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4176 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004177 void getTargetDefines(const LangOptions &Opts,
4178 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004179 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004180 DefineStd(Builder, "WIN32", Opts);
4181 DefineStd(Builder, "WINNT", Opts);
4182 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004183 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004184 }
4185};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004186
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004187// x86-32 Cygwin target
4188class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4189public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004190 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4191 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004192 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004193 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004194 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 +00004195 }
Craig Topper3164f332014-03-11 03:39:26 +00004196 void getTargetDefines(const LangOptions &Opts,
4197 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004198 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004199 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004200 Builder.defineMacro("__CYGWIN__");
4201 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004202 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004203 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004204 if (Opts.CPlusPlus)
4205 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004206 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004207};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004208
Chris Lattnerb986aba2010-04-11 19:29:39 +00004209// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004210class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004211public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004212 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004213 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004214 }
Craig Topper3164f332014-03-11 03:39:26 +00004215 void getTargetDefines(const LangOptions &Opts,
4216 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004217 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004218 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004219 }
4220};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004221
Alexey Bataevc99b0492015-11-25 09:24:26 +00004222// X86-32 MCU target
4223class MCUX86_32TargetInfo : public X86_32TargetInfo {
4224public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004225 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4226 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004227 LongDoubleWidth = 64;
4228 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004229 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 +00004230 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004231 }
4232
4233 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4234 // On MCU we support only C calling convention.
4235 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4236 }
4237
4238 void getTargetDefines(const LangOptions &Opts,
4239 MacroBuilder &Builder) const override {
4240 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4241 Builder.defineMacro("__iamcu");
4242 Builder.defineMacro("__iamcu__");
4243 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004244
4245 bool allowsLargerPreferedTypeAlignment() const override {
4246 return false;
4247 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004248};
4249
Douglas Gregor9fabd852011-07-01 22:41:14 +00004250// RTEMS Target
4251template<typename Target>
4252class RTEMSTargetInfo : public OSTargetInfo<Target> {
4253protected:
Craig Topper3164f332014-03-11 03:39:26 +00004254 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4255 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004256 // RTEMS defines; list based off of gcc output
4257
Douglas Gregor9fabd852011-07-01 22:41:14 +00004258 Builder.defineMacro("__rtems__");
4259 Builder.defineMacro("__ELF__");
4260 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004261
Douglas Gregor9fabd852011-07-01 22:41:14 +00004262public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004263 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4264 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004265 switch (Triple.getArch()) {
4266 default:
4267 case llvm::Triple::x86:
4268 // this->MCountName = ".mcount";
4269 break;
4270 case llvm::Triple::mips:
4271 case llvm::Triple::mipsel:
4272 case llvm::Triple::ppc:
4273 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004274 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004275 // this->MCountName = "_mcount";
4276 break;
4277 case llvm::Triple::arm:
4278 // this->MCountName = "__mcount";
4279 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004280 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004281 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004282};
4283
Douglas Gregor9fabd852011-07-01 22:41:14 +00004284// x86-32 RTEMS target
4285class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4286public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004287 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4288 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004289 SizeType = UnsignedLong;
4290 IntPtrType = SignedLong;
4291 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004292 }
Craig Topper3164f332014-03-11 03:39:26 +00004293 void getTargetDefines(const LangOptions &Opts,
4294 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004295 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4296 Builder.defineMacro("__INTEL__");
4297 Builder.defineMacro("__rtems__");
4298 }
4299};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004300
Eli Friedman3fd920a2008-08-20 02:34:37 +00004301// x86-64 generic target
4302class X86_64TargetInfo : public X86TargetInfo {
4303public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004304 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4305 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004306 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004307 bool IsWinCOFF =
4308 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004309 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004310 LongDoubleWidth = 128;
4311 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004312 LargeArrayMinWidth = 128;
4313 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004314 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004315 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4316 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4317 IntPtrType = IsX32 ? SignedInt : SignedLong;
4318 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004319 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004320 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004321
Eric Christopher917e9522014-11-18 22:36:15 +00004322 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004323 resetDataLayout(IsX32
4324 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4325 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4326 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004327
4328 // Use fpret only for long double.
4329 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004330
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004331 // Use fp2ret for _Complex long double.
4332 ComplexLongDoubleUsesFP2Ret = true;
4333
Charles Davisc7d5c942015-09-17 20:55:33 +00004334 // Make __builtin_ms_va_list available.
4335 HasBuiltinMSVaList = true;
4336
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004337 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004338 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004339 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004340 }
Craig Topper3164f332014-03-11 03:39:26 +00004341 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004342 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004343 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004344
Craig Topper3164f332014-03-11 03:39:26 +00004345 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004346 if (RegNo == 0) return 0;
4347 if (RegNo == 1) return 1;
4348 return -1;
4349 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004350
Craig Topper3164f332014-03-11 03:39:26 +00004351 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004352 switch (CC) {
4353 case CC_C:
4354 case CC_Swift:
4355 case CC_X86VectorCall:
4356 case CC_IntelOclBicc:
4357 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004358 case CC_PreserveMost:
4359 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004360 return CCCR_OK;
4361 default:
4362 return CCCR_Warning;
4363 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004364 }
4365
Craig Topper3164f332014-03-11 03:39:26 +00004366 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004367 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004368 }
4369
Pavel Chupinfd223e12014-08-04 12:39:43 +00004370 // for x32 we need it here explicitly
4371 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004372 unsigned getUnwindWordWidth() const override { return 64; }
4373 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004374
4375 bool validateGlobalRegisterVariable(StringRef RegName,
4376 unsigned RegSize,
4377 bool &HasSizeMismatch) const override {
4378 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4379 // handle.
4380 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4381 // Check that the register size is 64-bit.
4382 HasSizeMismatch = RegSize != 64;
4383 return true;
4384 }
4385
4386 // Check if the register is a 32-bit register the backend can handle.
4387 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4388 HasSizeMismatch);
4389 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004390};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004391
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004392// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004393class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004394public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004395 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4396 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004397 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004398 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004399 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004400 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004401 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004402 SizeType = UnsignedLongLong;
4403 PtrDiffType = SignedLongLong;
4404 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004405 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004406
Craig Topper3164f332014-03-11 03:39:26 +00004407 void getTargetDefines(const LangOptions &Opts,
4408 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004409 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004410 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004411 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004412
Craig Topper3164f332014-03-11 03:39:26 +00004413 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004414 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004415 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004416
Craig Topper3164f332014-03-11 03:39:26 +00004417 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004418 switch (CC) {
4419 case CC_X86StdCall:
4420 case CC_X86ThisCall:
4421 case CC_X86FastCall:
4422 return CCCR_Ignore;
4423 case CC_C:
4424 case CC_X86VectorCall:
4425 case CC_IntelOclBicc:
4426 case CC_X86_64SysV:
4427 return CCCR_OK;
4428 default:
4429 return CCCR_Warning;
4430 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004431 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004432};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004433
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004434// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004435class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004436public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004437 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4438 const TargetOptions &Opts)
4439 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004440 LongDoubleWidth = LongDoubleAlign = 64;
4441 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004442 }
Craig Topper3164f332014-03-11 03:39:26 +00004443 void getTargetDefines(const LangOptions &Opts,
4444 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004445 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4446 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004447 Builder.defineMacro("_M_X64", "100");
4448 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004449 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004450};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004451
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004452// x86-64 MinGW target
4453class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4454public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004455 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4456 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004457 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4458 // with x86 FP ops. Weird.
4459 LongDoubleWidth = LongDoubleAlign = 128;
4460 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4461 }
4462
Craig Topper3164f332014-03-11 03:39:26 +00004463 void getTargetDefines(const LangOptions &Opts,
4464 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004465 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004466 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004467 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004468 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004469
4470 // GCC defines this macro when it is using __gxx_personality_seh0.
4471 if (!Opts.SjLjExceptions)
4472 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004473 }
4474};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004475
Yaron Kerend030d112015-07-22 17:38:19 +00004476// x86-64 Cygwin target
4477class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4478public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004479 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4480 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004481 TLSSupported = false;
4482 WCharType = UnsignedShort;
4483 }
4484 void getTargetDefines(const LangOptions &Opts,
4485 MacroBuilder &Builder) const override {
4486 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4487 Builder.defineMacro("__x86_64__");
4488 Builder.defineMacro("__CYGWIN__");
4489 Builder.defineMacro("__CYGWIN64__");
4490 addCygMingDefines(Opts, Builder);
4491 DefineStd(Builder, "unix", Opts);
4492 if (Opts.CPlusPlus)
4493 Builder.defineMacro("_GNU_SOURCE");
4494
4495 // GCC defines this macro when it is using __gxx_personality_seh0.
4496 if (!Opts.SjLjExceptions)
4497 Builder.defineMacro("__SEH__");
4498 }
4499};
4500
Eli Friedman2857ccb2009-07-01 03:36:11 +00004501class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4502public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004503 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4504 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004505 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004506 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4507 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004508 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004509 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004510 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004511 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004512
4513 bool handleTargetFeatures(std::vector<std::string> &Features,
4514 DiagnosticsEngine &Diags) override {
4515 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4516 Diags))
4517 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004518 // We now know the features we have: we can decide how to align vectors.
4519 MaxVectorAlign =
4520 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004521 return true;
4522 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004523};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004524
Eli Friedman245f2292009-07-05 22:31:18 +00004525class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004527 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4528 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004529 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004530 Int64Type = SignedLongLong;
4531 }
4532};
Eli Friedman245f2292009-07-05 22:31:18 +00004533
Eli Friedman9fa28852012-08-08 23:57:20 +00004534class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4535public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004536 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4537 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004538 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004539 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004540 }
4541};
Tim Northover9bb857a2013-01-31 12:13:10 +00004542
Eli Friedmanf05b7722008-08-20 07:44:10 +00004543class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004544 // Possible FPU choices.
4545 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004546 VFP2FPU = (1 << 0),
4547 VFP3FPU = (1 << 1),
4548 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004549 NeonFPU = (1 << 3),
4550 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004551 };
4552
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004553 // Possible HWDiv features.
4554 enum HWDivMode {
4555 HWDivThumb = (1 << 0),
4556 HWDivARM = (1 << 1)
4557 };
4558
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004559 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004560 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004561 }
4562
4563 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4564 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004565
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004566 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004567
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004568 StringRef CPUProfile;
4569 StringRef CPUAttr;
4570
Rafael Espindolaeb265472013-08-21 21:59:03 +00004571 enum {
4572 FP_Default,
4573 FP_VFP,
4574 FP_Neon
4575 } FPMath;
4576
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004577 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004578 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004579 unsigned ArchProfile;
4580 unsigned ArchVersion;
4581
Bernard Ogdenda13af32013-10-24 18:32:51 +00004582 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004583
Logan Chien57086ce2012-10-10 06:56:20 +00004584 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004585 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004586
4587 // Initialized via features.
4588 unsigned SoftFloat : 1;
4589 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004590
Bernard Ogden18b57012013-10-29 09:47:51 +00004591 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004592 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004593 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004594 unsigned Unaligned : 1;
4595
4596 enum {
4597 LDREX_B = (1 << 0), /// byte (8-bit)
4598 LDREX_H = (1 << 1), /// half (16-bit)
4599 LDREX_W = (1 << 2), /// word (32-bit)
4600 LDREX_D = (1 << 3), /// double (64-bit)
4601 };
4602
4603 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004604
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004605 // ACLE 6.5.1 Hardware floating point
4606 enum {
4607 HW_FP_HP = (1 << 1), /// half (16-bit)
4608 HW_FP_SP = (1 << 2), /// single (32-bit)
4609 HW_FP_DP = (1 << 3), /// double (64-bit)
4610 };
4611 uint32_t HW_FP;
4612
Chris Lattner5cc15e02010-03-03 19:03:45 +00004613 static const Builtin::Info BuiltinInfo[];
4614
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004615 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004616 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004617
4618 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004619 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004620
Renato Golin9ba39232015-02-27 16:35:48 +00004621 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4622 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4623 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004624 SizeType = UnsignedLong;
4625 else
4626 SizeType = UnsignedInt;
4627
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004628 switch (T.getOS()) {
4629 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004630 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004631 break;
4632 case llvm::Triple::Win32:
4633 WCharType = UnsignedShort;
4634 break;
4635 case llvm::Triple::Linux:
4636 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004637 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4638 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004639 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004640 }
4641
4642 UseBitFieldTypeAlignment = true;
4643
4644 ZeroLengthBitfieldBoundary = 0;
4645
Tim Northover147cd2f2014-10-14 22:12:21 +00004646 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4647 // so set preferred for small types to 32.
4648 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004649 resetDataLayout(BigEndian
4650 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4651 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004652 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004653 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004654 resetDataLayout("e"
4655 "-m:w"
4656 "-p:32:32"
4657 "-i64:64"
4658 "-v128:64:128"
4659 "-a:0:32"
4660 "-n32"
4661 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004662 } else if (T.isOSNaCl()) {
4663 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004664 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004665 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004666 resetDataLayout(BigEndian
4667 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4668 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004669 }
4670
4671 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004672 }
4673
Tim Northover5627d392015-10-30 16:30:45 +00004674 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004675 const llvm::Triple &T = getTriple();
4676
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004677 IsAAPCS = false;
4678
Tim Northover5627d392015-10-30 16:30:45 +00004679 if (IsAAPCS16)
4680 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4681 else
4682 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004683
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004684 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004685 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004686 SizeType = UnsignedInt;
4687 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004688 SizeType = UnsignedLong;
4689
4690 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4691 WCharType = SignedInt;
4692
4693 // Do not respect the alignment of bit-field types when laying out
4694 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4695 UseBitFieldTypeAlignment = false;
4696
4697 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4698 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4699 /// gcc.
4700 ZeroLengthBitfieldBoundary = 32;
4701
Tim Northover5627d392015-10-30 16:30:45 +00004702 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4703 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004704 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004705 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004706 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004707 BigEndian
4708 ? "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 +00004709 : "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 +00004710 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004711 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004712 BigEndian
4713 ? "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 +00004714 : "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 +00004715
4716 // FIXME: Override "preferred align" for double and long long.
4717 }
4718
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004719 void setArchInfo() {
4720 StringRef ArchName = getTriple().getArchName();
4721
Renato Goline84b0002015-10-08 16:43:26 +00004722 ArchISA = llvm::ARM::parseArchISA(ArchName);
4723 CPU = llvm::ARM::getDefaultCPU(ArchName);
4724 unsigned AK = llvm::ARM::parseArch(ArchName);
4725 if (AK != llvm::ARM::AK_INVALID)
4726 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004727 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004728 }
4729
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004730 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004731 StringRef SubArch;
4732
4733 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004734 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004735 SubArch = llvm::ARM::getSubArch(ArchKind);
4736 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4737 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004738
4739 // cache CPU related strings
4740 CPUAttr = getCPUAttr();
4741 CPUProfile = getCPUProfile();
4742 }
4743
4744 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004745 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004746 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004747 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004748 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4749 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004750 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004751 if (ArchProfile == llvm::ARM::PK_M) {
4752 MaxAtomicPromoteWidth = 32;
4753 if (ShouldUseInlineAtomic)
4754 MaxAtomicInlineWidth = 32;
4755 }
4756 else {
4757 MaxAtomicPromoteWidth = 64;
4758 if (ShouldUseInlineAtomic)
4759 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004760 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004761 }
4762
4763 bool isThumb() const {
4764 return (ArchISA == llvm::ARM::IK_THUMB);
4765 }
4766
4767 bool supportsThumb() const {
4768 return CPUAttr.count('T') || ArchVersion >= 6;
4769 }
4770
4771 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004772 return CPUAttr.equals("6T2") ||
4773 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004774 }
4775
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004776 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004777 // For most sub-arches, the build attribute CPU name is enough.
4778 // For Cortex variants, it's slightly different.
4779 switch(ArchKind) {
4780 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004781 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004782 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004783 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004784 case llvm::ARM::AK_ARMV7S:
4785 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004786 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004787 return "7A";
4788 case llvm::ARM::AK_ARMV7R:
4789 return "7R";
4790 case llvm::ARM::AK_ARMV7M:
4791 return "7M";
4792 case llvm::ARM::AK_ARMV7EM:
4793 return "7EM";
4794 case llvm::ARM::AK_ARMV8A:
4795 return "8A";
4796 case llvm::ARM::AK_ARMV8_1A:
4797 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004798 case llvm::ARM::AK_ARMV8_2A:
4799 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004800 case llvm::ARM::AK_ARMV8MBaseline:
4801 return "8M_BASE";
4802 case llvm::ARM::AK_ARMV8MMainline:
4803 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004804 }
4805 }
4806
4807 StringRef getCPUProfile() const {
4808 switch(ArchProfile) {
4809 case llvm::ARM::PK_A:
4810 return "A";
4811 case llvm::ARM::PK_R:
4812 return "R";
4813 case llvm::ARM::PK_M:
4814 return "M";
4815 default:
4816 return "";
4817 }
4818 }
4819
Chris Lattner17df24e2008-04-21 18:56:49 +00004820public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004821 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4822 bool IsBigEndian)
4823 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4824 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004825 BigEndian = IsBigEndian;
4826
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004827 switch (getTriple().getOS()) {
4828 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004829 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004830 break;
4831 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004832 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004833 break;
4834 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004835
Renato Goline84b0002015-10-08 16:43:26 +00004836 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004837 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004838
Chris Lattner1a8f3942010-04-23 16:29:58 +00004839 // {} in inline assembly are neon specifiers, not assembly variant
4840 // specifiers.
4841 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004842
Eric Christopher0e261882014-12-05 01:06:59 +00004843 // FIXME: This duplicates code from the driver that sets the -target-abi
4844 // option - this code is used if -target-abi isn't passed and should
4845 // be unified in some way.
4846 if (Triple.isOSBinFormatMachO()) {
4847 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4848 // the frontend matches that.
4849 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4850 Triple.getOS() == llvm::Triple::UnknownOS ||
4851 StringRef(CPU).startswith("cortex-m")) {
4852 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004853 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004854 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004855 } else {
4856 setABI("apcs-gnu");
4857 }
4858 } else if (Triple.isOSWindows()) {
4859 // FIXME: this is invalid for WindowsCE
4860 setABI("aapcs");
4861 } else {
4862 // Select the default based on the platform.
4863 switch (Triple.getEnvironment()) {
4864 case llvm::Triple::Android:
4865 case llvm::Triple::GNUEABI:
4866 case llvm::Triple::GNUEABIHF:
4867 setABI("aapcs-linux");
4868 break;
4869 case llvm::Triple::EABIHF:
4870 case llvm::Triple::EABI:
4871 setABI("aapcs");
4872 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004873 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004874 setABI("apcs-gnu");
4875 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004876 default:
4877 if (Triple.getOS() == llvm::Triple::NetBSD)
4878 setABI("apcs-gnu");
4879 else
4880 setABI("aapcs");
4881 break;
4882 }
4883 }
John McCall86353412010-08-21 22:46:04 +00004884
4885 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004886 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004887
Renato Golin15b86152015-07-03 16:41:13 +00004888 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004889 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004890
James Molloya7139222012-03-12 09:14:10 +00004891 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004892 // the alignment of the zero-length bitfield is greater than the member
4893 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004894 // zero length bitfield.
4895 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004896
4897 if (Triple.getOS() == llvm::Triple::Linux ||
4898 Triple.getOS() == llvm::Triple::UnknownOS)
4899 this->MCountName =
4900 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004901 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004902
Alp Toker4925ba72014-06-07 23:30:42 +00004903 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004904
Craig Topper3164f332014-03-11 03:39:26 +00004905 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004906 ABI = Name;
4907
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004908 // The defaults (above) are for AAPCS, check if we need to change them.
4909 //
4910 // FIXME: We need support for -meabi... we could just mangle it into the
4911 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004912 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004913 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004914 return true;
4915 }
4916 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4917 setABIAAPCS();
4918 return true;
4919 }
4920 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004921 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004922
Renato Golinf5c4dec2015-05-27 13:33:00 +00004923 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004924 bool
4925 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4926 StringRef CPU,
4927 const std::vector<std::string> &FeaturesVec) const override {
4928
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004929 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004930 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004931
4932 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004933 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004934 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4935
4936 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004937 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004938 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4939
4940 for (const char *Feature : TargetFeatures)
4941 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004942 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004943
Eric Christopher007b0a02015-08-28 22:32:01 +00004944 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004945 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004946
Craig Topper3164f332014-03-11 03:39:26 +00004947 bool handleTargetFeatures(std::vector<std::string> &Features,
4948 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004949 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004950 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004951 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004952 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004953 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004954 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004955 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004956
Ranjeet Singhac08e532015-06-24 23:39:25 +00004957 // This does not diagnose illegal cases like having both
4958 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4959 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004960 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004961 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004962 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004963 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004964 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004965 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004966 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004967 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004968 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004969 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004970 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004971 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004972 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004973 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004974 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004975 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004976 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004977 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004978 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004979 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004980 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004981 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004982 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004983 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004984 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004985 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004986 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004987 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004988 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004989 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004990 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00004991 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004992 } else if (Feature == "+strict-align") {
4993 Unaligned = 0;
4994 } else if (Feature == "+fp16") {
4995 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004996 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004997 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004998 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004999
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005000 switch (ArchVersion) {
5001 case 6:
5002 if (ArchProfile == llvm::ARM::PK_M)
5003 LDREX = 0;
5004 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5005 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5006 else
5007 LDREX = LDREX_W;
5008 break;
5009 case 7:
5010 if (ArchProfile == llvm::ARM::PK_M)
5011 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5012 else
5013 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5014 break;
5015 case 8:
5016 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5017 }
5018
Rafael Espindolaeb265472013-08-21 21:59:03 +00005019 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5020 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5021 return false;
5022 }
5023
5024 if (FPMath == FP_Neon)
5025 Features.push_back("+neonfp");
5026 else if (FPMath == FP_VFP)
5027 Features.push_back("-neonfp");
5028
Daniel Dunbar893d4752009-12-19 04:15:38 +00005029 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005030 auto Feature =
5031 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5032 if (Feature != Features.end())
5033 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005034
Rafael Espindolaeb265472013-08-21 21:59:03 +00005035 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005036 }
5037
Craig Topper3164f332014-03-11 03:39:26 +00005038 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005039 return llvm::StringSwitch<bool>(Feature)
5040 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005041 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005042 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005043 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005044 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005045 .Case("hwdiv", HWDiv & HWDivThumb)
5046 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005047 .Default(false);
5048 }
Renato Golin15b86152015-07-03 16:41:13 +00005049
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005050 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005051 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005052 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005053
Renato Golin15b86152015-07-03 16:41:13 +00005054 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005055 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005056 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005057 CPU = Name;
5058 return true;
5059 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005060
Craig Topper3164f332014-03-11 03:39:26 +00005061 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005062
Craig Topper3164f332014-03-11 03:39:26 +00005063 void getTargetDefines(const LangOptions &Opts,
5064 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005065 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005066 Builder.defineMacro("__arm");
5067 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005068 // For bare-metal none-eabi.
5069 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5070 getTriple().getEnvironment() == llvm::Triple::EABI)
5071 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005072
Chris Lattnerecd49032009-03-02 22:27:17 +00005073 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005074 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005075
5076 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5077 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005078 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005079 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5080
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005081 if (!CPUAttr.empty())
5082 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005083
5084 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005085 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005086 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005087
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005088 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005089 // ACLE 6.5.7 Crypto Extension
5090 if (Crypto)
5091 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5092 // ACLE 6.5.8 CRC32 Extension
5093 if (CRC)
5094 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5095 // ACLE 6.5.10 Numeric Maximum and Minimum
5096 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5097 // ACLE 6.5.9 Directed Rounding
5098 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005099 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005100
5101 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5102 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005103 // NOTE that the default profile is assumed to be 'A'
5104 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005105 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5106
Bradley Smithf4affc12016-03-03 13:52:22 +00005107 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5108 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5109 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5110 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005111 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005112 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005113 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005114 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5115
5116 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5117 // instruction set such as ARM or Thumb.
5118 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5119
5120 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5121
5122 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005123 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005124 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005125
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005126 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005127 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005128 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005129
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005130 // ACLE 6.4.4 LDREX/STREX
5131 if (LDREX)
5132 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5133
5134 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005135 if (ArchVersion == 5 ||
5136 (ArchVersion == 6 && CPUProfile != "M") ||
5137 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005138 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5139
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005140 // ACLE 6.5.1 Hardware Floating Point
5141 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005142 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005143
Yi Konga44c4d72014-06-27 21:25:42 +00005144 // ACLE predefines.
5145 Builder.defineMacro("__ARM_ACLE", "200");
5146
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005147 // FP16 support (we currently only support IEEE format).
5148 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5149 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5150
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005151 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005152 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005153 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5154
Mike Stump9d54bd72009-04-08 02:07:04 +00005155 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005156
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005157 // FIXME: It's more complicated than this and we don't really support
5158 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005159 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005160 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005161 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005162
David Tweed8f676532012-10-25 13:33:01 +00005163 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005164 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005165 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005166 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005167 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005168 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005169 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005170
Tim Northover28fc0e12016-04-28 13:59:55 +00005171 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5172 ABI == "aapcs16")
5173 Builder.defineMacro("__ARM_PCS_VFP", "1");
5174
Daniel Dunbar893d4752009-12-19 04:15:38 +00005175 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005176 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005177
5178 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005179 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005180
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005181 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005182 Builder.defineMacro("__THUMBEL__");
5183 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005184 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005185 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005186 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005187
5188 // ACLE 6.4.9 32-bit SIMD instructions
5189 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5190 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5191
5192 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005193 if (((HWDiv & HWDivThumb) && isThumb()) ||
5194 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005195 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005196 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005197 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005198
5199 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005200 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005201
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005202 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005203 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005204 if (FPU & VFP2FPU)
5205 Builder.defineMacro("__ARM_VFPV2__");
5206 if (FPU & VFP3FPU)
5207 Builder.defineMacro("__ARM_VFPV3__");
5208 if (FPU & VFP4FPU)
5209 Builder.defineMacro("__ARM_VFPV4__");
5210 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005211
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005212 // This only gets set when Neon instructions are actually available, unlike
5213 // the VFP define, hence the soft float and arch check. This is subtly
5214 // different from gcc, we follow the intent which was that it should be set
5215 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005216 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005217 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005218 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005219 // current AArch32 NEON implementations do not support double-precision
5220 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005221 Builder.defineMacro("__ARM_NEON_FP",
5222 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005223 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005224
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005225 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5226 Opts.ShortWChar ? "2" : "4");
5227
5228 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5229 Opts.ShortEnums ? "1" : "4");
5230
Bradley Smithf4affc12016-03-03 13:52:22 +00005231 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005232 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5233 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5234 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5235 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5236 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005237
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005238 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005239 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005240 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005241 }
5242
5243 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005244 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005245 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5246 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005247 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005248 }
5249
5250 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005251 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005252 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005253
5254 if (Opts.UnsafeFPMath)
5255 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005256
5257 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5258 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005259 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005260
Craig Topper6c03a542015-10-19 04:51:35 +00005261 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5262 return llvm::makeArrayRef(BuiltinInfo,
5263 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005264 }
Craig Topper3164f332014-03-11 03:39:26 +00005265 bool isCLZForZeroUndef() const override { return false; }
5266 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005267 return IsAAPCS
5268 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005269 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5270 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005271 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005272 ArrayRef<const char *> getGCCRegNames() const override;
5273 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005274 bool validateAsmConstraint(const char *&Name,
5275 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005276 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005277 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005278 case 'l': // r0-r7
5279 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005280 case 't': // VFP Floating point register single precision
5281 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005282 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005283 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005284 case 'I':
5285 case 'J':
5286 case 'K':
5287 case 'L':
5288 case 'M':
5289 // FIXME
5290 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005291 case 'Q': // A memory address that is a single base register.
5292 Info.setAllowsMemory();
5293 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005294 case 'U': // a memory reference...
5295 switch (Name[1]) {
5296 case 'q': // ...ARMV4 ldrsb
5297 case 'v': // ...VFP load/store (reg+constant offset)
5298 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005299 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005300 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005301 case 'n': // valid address for Neon doubleword vector load/store
5302 case 'm': // valid address for Neon element and structure load/store
5303 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005304 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005305 Info.setAllowsMemory();
5306 Name++;
5307 return true;
5308 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005309 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005310 return false;
5311 }
Craig Topper3164f332014-03-11 03:39:26 +00005312 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005313 std::string R;
5314 switch (*Constraint) {
5315 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005316 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005317 Constraint++;
5318 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005319 case 'p': // 'p' should be translated to 'r' by default.
5320 R = std::string("r");
5321 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005322 default:
5323 return std::string(1, *Constraint);
5324 }
5325 return R;
5326 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005327 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005328 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005329 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005330 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005331 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005332
Bill Wendling9d1ee112012-10-25 23:28:48 +00005333 // Strip off constraint modifiers.
5334 while (Constraint[0] == '=' ||
5335 Constraint[0] == '+' ||
5336 Constraint[0] == '&')
5337 Constraint = Constraint.substr(1);
5338
5339 switch (Constraint[0]) {
5340 default: break;
5341 case 'r': {
5342 switch (Modifier) {
5343 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005344 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005345 case 'q':
5346 // A register of size 32 cannot fit a vector type.
5347 return false;
5348 }
5349 }
5350 }
5351
5352 return true;
5353 }
Craig Topper3164f332014-03-11 03:39:26 +00005354 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005355 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005356 return "";
5357 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005358
Craig Topper3164f332014-03-11 03:39:26 +00005359 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005360 switch (CC) {
5361 case CC_AAPCS:
5362 case CC_AAPCS_VFP:
5363 case CC_Swift:
5364 return CCCR_OK;
5365 default:
5366 return CCCR_Warning;
5367 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005368 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005369
Craig Topper3164f332014-03-11 03:39:26 +00005370 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005371 if (RegNo == 0) return 0;
5372 if (RegNo == 1) return 1;
5373 return -1;
5374 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005375
5376 bool hasSjLjLowering() const override {
5377 return true;
5378 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005379};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005380
Rafael Espindolaeb265472013-08-21 21:59:03 +00005381bool ARMTargetInfo::setFPMath(StringRef Name) {
5382 if (Name == "neon") {
5383 FPMath = FP_Neon;
5384 return true;
5385 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5386 Name == "vfp4") {
5387 FPMath = FP_VFP;
5388 return true;
5389 }
5390 return false;
5391}
5392
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005393const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005394 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005395 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005396 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5397
5398 // Float registers
5399 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5400 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5401 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005402 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005403
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005404 // Double registers
5405 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5406 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005407 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5408 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005409
5410 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005411 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5412 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005413};
5414
Craig Topperf054e3a2015-10-19 03:52:27 +00005415ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5416 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005417}
5418
5419const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005420 { { "a1" }, "r0" },
5421 { { "a2" }, "r1" },
5422 { { "a3" }, "r2" },
5423 { { "a4" }, "r3" },
5424 { { "v1" }, "r4" },
5425 { { "v2" }, "r5" },
5426 { { "v3" }, "r6" },
5427 { { "v4" }, "r7" },
5428 { { "v5" }, "r8" },
5429 { { "v6", "rfp" }, "r9" },
5430 { { "sl" }, "r10" },
5431 { { "fp" }, "r11" },
5432 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005433 { { "r13" }, "sp" },
5434 { { "r14" }, "lr" },
5435 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005436 // The S, D and Q registers overlap, but aren't really aliases; we
5437 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005438};
5439
Craig Topperf054e3a2015-10-19 03:52:27 +00005440ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5441 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005442}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005443
5444const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005445#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005446 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005447#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5448 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005449#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005450
Craig Topper07d3b622015-08-07 05:14:44 +00005451#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005452 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005453#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005454 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005455#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5456 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005457#include "clang/Basic/BuiltinsARM.def"
5458};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005459
5460class ARMleTargetInfo : public ARMTargetInfo {
5461public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005462 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5463 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005464 void getTargetDefines(const LangOptions &Opts,
5465 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005466 Builder.defineMacro("__ARMEL__");
5467 ARMTargetInfo::getTargetDefines(Opts, Builder);
5468 }
5469};
5470
5471class ARMbeTargetInfo : public ARMTargetInfo {
5472public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005473 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5474 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005475 void getTargetDefines(const LangOptions &Opts,
5476 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005477 Builder.defineMacro("__ARMEB__");
5478 Builder.defineMacro("__ARM_BIG_ENDIAN");
5479 ARMTargetInfo::getTargetDefines(Opts, Builder);
5480 }
5481};
Chris Lattner17df24e2008-04-21 18:56:49 +00005482
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005483class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5484 const llvm::Triple Triple;
5485public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005486 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5487 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005488 WCharType = UnsignedShort;
5489 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005490 }
5491 void getVisualStudioDefines(const LangOptions &Opts,
5492 MacroBuilder &Builder) const {
5493 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5494
5495 // FIXME: this is invalid for WindowsCE
5496 Builder.defineMacro("_M_ARM_NT", "1");
5497 Builder.defineMacro("_M_ARMT", "_M_ARM");
5498 Builder.defineMacro("_M_THUMB", "_M_ARM");
5499
5500 assert((Triple.getArch() == llvm::Triple::arm ||
5501 Triple.getArch() == llvm::Triple::thumb) &&
5502 "invalid architecture for Windows ARM target info");
5503 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5504 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5505
5506 // TODO map the complete set of values
5507 // 31: VFPv3 40: VFPv4
5508 Builder.defineMacro("_M_ARM_FP", "31");
5509 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005510 BuiltinVaListKind getBuiltinVaListKind() const override {
5511 return TargetInfo::CharPtrBuiltinVaList;
5512 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005513 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5514 switch (CC) {
5515 case CC_X86StdCall:
5516 case CC_X86ThisCall:
5517 case CC_X86FastCall:
5518 case CC_X86VectorCall:
5519 return CCCR_Ignore;
5520 case CC_C:
5521 return CCCR_OK;
5522 default:
5523 return CCCR_Warning;
5524 }
5525 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005526};
5527
5528// Windows ARM + Itanium C++ ABI Target
5529class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5530public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005531 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5532 const TargetOptions &Opts)
5533 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005534 TheCXXABI.set(TargetCXXABI::GenericARM);
5535 }
5536
5537 void getTargetDefines(const LangOptions &Opts,
5538 MacroBuilder &Builder) const override {
5539 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5540
5541 if (Opts.MSVCCompat)
5542 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5543 }
5544};
5545
5546// Windows ARM, MS (C++) ABI
5547class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5548public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005549 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5550 const TargetOptions &Opts)
5551 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005552 TheCXXABI.set(TargetCXXABI::Microsoft);
5553 }
5554
5555 void getTargetDefines(const LangOptions &Opts,
5556 MacroBuilder &Builder) const override {
5557 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5558 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5559 }
5560};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005561
Yaron Keren321249c2015-07-15 13:32:23 +00005562// ARM MinGW target
5563class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5564public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005565 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5566 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005567 TheCXXABI.set(TargetCXXABI::GenericARM);
5568 }
5569
5570 void getTargetDefines(const LangOptions &Opts,
5571 MacroBuilder &Builder) const override {
5572 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5573 DefineStd(Builder, "WIN32", Opts);
5574 DefineStd(Builder, "WINNT", Opts);
5575 Builder.defineMacro("_ARM_");
5576 addMinGWDefines(Opts, Builder);
5577 }
5578};
5579
5580// ARM Cygwin target
5581class CygwinARMTargetInfo : public ARMleTargetInfo {
5582public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005583 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5584 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005585 TLSSupported = false;
5586 WCharType = UnsignedShort;
5587 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005588 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005589 }
5590 void getTargetDefines(const LangOptions &Opts,
5591 MacroBuilder &Builder) const override {
5592 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5593 Builder.defineMacro("_ARM_");
5594 Builder.defineMacro("__CYGWIN__");
5595 Builder.defineMacro("__CYGWIN32__");
5596 DefineStd(Builder, "unix", Opts);
5597 if (Opts.CPlusPlus)
5598 Builder.defineMacro("_GNU_SOURCE");
5599 }
5600};
5601
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005602class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005603protected:
Craig Topper3164f332014-03-11 03:39:26 +00005604 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5605 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005606 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005607 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005608
Torok Edwinb2b37c62009-06-30 17:10:35 +00005609public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005610 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5611 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005612 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005613 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005614 // FIXME: This should be based off of the target features in
5615 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005616 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005617
Tim Northoverd88ecb32016-01-27 19:32:40 +00005618 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005619 // Darwin on iOS uses a variant of the ARM C++ ABI.
5620 TheCXXABI.set(TargetCXXABI::WatchOS);
5621
5622 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5623 // size_t is long, it's a bit weird for it to be int.
5624 PtrDiffType = SignedLong;
5625
5626 // BOOL should be a real boolean on the new ABI
5627 UseSignedCharForObjCBool = false;
5628 } else
5629 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005630 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005631};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005632
Tim Northover573cbee2014-05-24 12:52:07 +00005633class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005634 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005635 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5636 static const char *const GCCRegNames[];
5637
James Molloy75f5f9e2014-04-16 15:33:48 +00005638 enum FPUModeEnum {
5639 FPUMode,
5640 NeonMode
5641 };
5642
5643 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005644 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005645 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005646 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005647 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005648
Tim Northovera2ee4332014-03-29 15:09:45 +00005649 static const Builtin::Info BuiltinInfo[];
5650
5651 std::string ABI;
5652
5653public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005654 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005655 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005656 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5657 WCharType = SignedInt;
5658
5659 // NetBSD apparently prefers consistency across ARM targets to consistency
5660 // across 64-bit targets.
5661 Int64Type = SignedLongLong;
5662 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005663 } else {
5664 WCharType = UnsignedInt;
5665 Int64Type = SignedLong;
5666 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005667 }
5668
Tim Northovera2ee4332014-03-29 15:09:45 +00005669 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005670 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005671 MaxAtomicInlineWidth = 128;
5672 MaxAtomicPromoteWidth = 128;
5673
Tim Northovera6a19f12015-02-06 01:25:07 +00005674 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005675 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5676
Tim Northovera2ee4332014-03-29 15:09:45 +00005677 // {} in inline assembly are neon specifiers, not assembly variant
5678 // specifiers.
5679 NoAsmVariants = true;
5680
Tim Northover7ad87af2015-01-16 18:44:04 +00005681 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5682 // contributes to the alignment of the containing aggregate in the same way
5683 // a plain (non bit-field) member of that type would, without exception for
5684 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005685 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005686 UseZeroLengthBitfieldAlignment = true;
5687
Tim Northover573cbee2014-05-24 12:52:07 +00005688 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005689 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005690
5691 if (Triple.getOS() == llvm::Triple::Linux ||
5692 Triple.getOS() == llvm::Triple::UnknownOS)
5693 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005694 }
5695
Alp Toker4925ba72014-06-07 23:30:42 +00005696 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005697 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005698 if (Name != "aapcs" && Name != "darwinpcs")
5699 return false;
5700
5701 ABI = Name;
5702 return true;
5703 }
5704
David Blaikie1cbb9712014-11-14 19:09:44 +00005705 bool setCPU(const std::string &Name) override {
Renato Golin3b8709c2016-05-25 12:36:31 +00005706 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5707 .Case("generic", true)
5708 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5709 "cortex-a35", "exynos-m1", true)
Sjoerd Meijer90df4a72016-06-02 10:48:37 +00005710 .Case("cortex-a73", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005711 .Case("cyclone", true)
5712 .Case("kryo", true)
5713 .Default(false);
5714 return CPUKnown;
Tim Northovera2ee4332014-03-29 15:09:45 +00005715 }
5716
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005717 void getTargetDefines(const LangOptions &Opts,
5718 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005719 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005720 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005721
5722 // Target properties.
5723 Builder.defineMacro("_LP64");
5724 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005725
5726 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5727 Builder.defineMacro("__ARM_ACLE", "200");
5728 Builder.defineMacro("__ARM_ARCH", "8");
5729 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5730
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005731 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005732 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005733 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005734
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005735 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5736 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5737 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5738 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005739 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005740 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5741 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005742
5743 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5744
5745 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005746 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005747
5748 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5749 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005750 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5751 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005752
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005753 if (Opts.UnsafeFPMath)
5754 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005755
5756 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5757
5758 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5759 Opts.ShortEnums ? "1" : "4");
5760
James Molloy75f5f9e2014-04-16 15:33:48 +00005761 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005762 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005763 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005764 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005765 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005766
Bradley Smith418c5932014-05-02 15:17:51 +00005767 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005768 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005769
James Molloy75f5f9e2014-04-16 15:33:48 +00005770 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005771 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5772
5773 if (Unaligned)
5774 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005775
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005776 if (V8_1A)
5777 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5778
Reid Klecknerd167d422015-05-06 15:31:46 +00005779 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5780 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5781 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5782 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5783 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005784 }
5785
Craig Topper6c03a542015-10-19 04:51:35 +00005786 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5787 return llvm::makeArrayRef(BuiltinInfo,
5788 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005789 }
5790
David Blaikie1cbb9712014-11-14 19:09:44 +00005791 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005792 return Feature == "aarch64" ||
5793 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005794 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005795 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005796 }
5797
James Molloy5e73df52014-04-16 15:06:20 +00005798 bool handleTargetFeatures(std::vector<std::string> &Features,
5799 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005800 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005801 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005802 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005803 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005804 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005805
Eric Christopher610fe112015-08-26 08:21:55 +00005806 for (const auto &Feature : Features) {
5807 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005808 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005809 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005810 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005811 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005812 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005813 if (Feature == "+strict-align")
5814 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005815 if (Feature == "+v8.1a")
5816 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005817 }
5818
James Y Knightb214cbc2016-03-04 19:00:41 +00005819 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005820
5821 return true;
5822 }
5823
John McCall477f2bb2016-03-03 06:39:32 +00005824 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5825 switch (CC) {
5826 case CC_C:
5827 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005828 case CC_PreserveMost:
5829 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005830 return CCCR_OK;
5831 default:
5832 return CCCR_Warning;
5833 }
5834 }
5835
David Blaikie1cbb9712014-11-14 19:09:44 +00005836 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005837
David Blaikie1cbb9712014-11-14 19:09:44 +00005838 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005839 return TargetInfo::AArch64ABIBuiltinVaList;
5840 }
5841
Craig Topperf054e3a2015-10-19 03:52:27 +00005842 ArrayRef<const char *> getGCCRegNames() const override;
5843 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005844
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005845 bool validateAsmConstraint(const char *&Name,
5846 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005847 switch (*Name) {
5848 default:
5849 return false;
5850 case 'w': // Floating point and SIMD registers (V0-V31)
5851 Info.setAllowsRegister();
5852 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005853 case 'I': // Constant that can be used with an ADD instruction
5854 case 'J': // Constant that can be used with a SUB instruction
5855 case 'K': // Constant that can be used with a 32-bit logical instruction
5856 case 'L': // Constant that can be used with a 64-bit logical instruction
5857 case 'M': // Constant that can be used as a 32-bit MOV immediate
5858 case 'N': // Constant that can be used as a 64-bit MOV immediate
5859 case 'Y': // Floating point constant zero
5860 case 'Z': // Integer constant zero
5861 return true;
5862 case 'Q': // A memory reference with base register and no offset
5863 Info.setAllowsMemory();
5864 return true;
5865 case 'S': // A symbolic address
5866 Info.setAllowsRegister();
5867 return true;
5868 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005869 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5870 // Utf: A memory address suitable for ldp/stp in TF mode.
5871 // Usa: An absolute symbolic address.
5872 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5873 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005874 case 'z': // Zero register, wzr or xzr
5875 Info.setAllowsRegister();
5876 return true;
5877 case 'x': // Floating point and SIMD registers (V0-V15)
5878 Info.setAllowsRegister();
5879 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005880 }
5881 return false;
5882 }
5883
Akira Hatanaka987f1862014-08-22 06:05:21 +00005884 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005885 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005886 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005887 // Strip off constraint modifiers.
5888 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5889 Constraint = Constraint.substr(1);
5890
5891 switch (Constraint[0]) {
5892 default:
5893 return true;
5894 case 'z':
5895 case 'r': {
5896 switch (Modifier) {
5897 case 'x':
5898 case 'w':
5899 // For now assume that the person knows what they're
5900 // doing with the modifier.
5901 return true;
5902 default:
5903 // By default an 'r' constraint will be in the 'x'
5904 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005905 if (Size == 64)
5906 return true;
5907
5908 SuggestedModifier = "w";
5909 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005910 }
5911 }
5912 }
5913 }
5914
David Blaikie1cbb9712014-11-14 19:09:44 +00005915 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005916
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005917 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005918 if (RegNo == 0)
5919 return 0;
5920 if (RegNo == 1)
5921 return 1;
5922 return -1;
5923 }
5924};
5925
Tim Northover573cbee2014-05-24 12:52:07 +00005926const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005927 // 32-bit Integer registers
5928 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5929 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5930 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5931
5932 // 64-bit Integer registers
5933 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5934 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5935 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5936
5937 // 32-bit floating point regsisters
5938 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5939 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5940 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5941
5942 // 64-bit floating point regsisters
5943 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5944 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5945 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5946
5947 // Vector registers
5948 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5949 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5950 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5951};
5952
Craig Topperf054e3a2015-10-19 03:52:27 +00005953ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5954 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005955}
5956
Tim Northover573cbee2014-05-24 12:52:07 +00005957const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005958 { { "w31" }, "wsp" },
5959 { { "x29" }, "fp" },
5960 { { "x30" }, "lr" },
5961 { { "x31" }, "sp" },
5962 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5963 // don't want to substitute one of these for a different-sized one.
5964};
5965
Craig Topperf054e3a2015-10-19 03:52:27 +00005966ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5967 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005968}
5969
Tim Northover573cbee2014-05-24 12:52:07 +00005970const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005971#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005972 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005973#include "clang/Basic/BuiltinsNEON.def"
5974
5975#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005976 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005977#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005978};
James Molloy5e73df52014-04-16 15:06:20 +00005979
Tim Northover573cbee2014-05-24 12:52:07 +00005980class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005981 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005982 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005983 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005984 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005985 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005986 }
5987
5988public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005989 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5990 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00005991 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005992 }
James Molloy5e73df52014-04-16 15:06:20 +00005993 void getTargetDefines(const LangOptions &Opts,
5994 MacroBuilder &Builder) const override {
5995 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005996 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005997 }
5998};
5999
Tim Northover573cbee2014-05-24 12:52:07 +00006000class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006001 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006002 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00006003 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006004 }
6005
6006public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006007 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6008 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006009 void getTargetDefines(const LangOptions &Opts,
6010 MacroBuilder &Builder) const override {
6011 Builder.defineMacro("__AARCH64EB__");
6012 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6013 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006014 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006015 }
6016};
Tim Northovera2ee4332014-03-29 15:09:45 +00006017
Tim Northover573cbee2014-05-24 12:52:07 +00006018class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006019protected:
6020 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6021 MacroBuilder &Builder) const override {
6022 Builder.defineMacro("__AARCH64_SIMD__");
6023 Builder.defineMacro("__ARM64_ARCH_8__");
6024 Builder.defineMacro("__ARM_NEON__");
6025 Builder.defineMacro("__LITTLE_ENDIAN__");
6026 Builder.defineMacro("__REGISTER_PREFIX__", "");
6027 Builder.defineMacro("__arm64", "1");
6028 Builder.defineMacro("__arm64__", "1");
6029
6030 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6031 }
6032
Tim Northovera2ee4332014-03-29 15:09:45 +00006033public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006034 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6035 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006036 Int64Type = SignedLongLong;
6037 WCharType = SignedInt;
6038 UseSignedCharForObjCBool = false;
6039
Tim Northovera6a19f12015-02-06 01:25:07 +00006040 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006041 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6042
6043 TheCXXABI.set(TargetCXXABI::iOS64);
6044 }
6045
David Blaikie1cbb9712014-11-14 19:09:44 +00006046 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006047 return TargetInfo::CharPtrBuiltinVaList;
6048 }
6049};
Tim Northovera2ee4332014-03-29 15:09:45 +00006050
Tony Linthicum76329bf2011-12-12 21:14:55 +00006051// Hexagon abstract base class
6052class HexagonTargetInfo : public TargetInfo {
6053 static const Builtin::Info BuiltinInfo[];
6054 static const char * const GCCRegNames[];
6055 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6056 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006057 bool HasHVX, HasHVXDouble;
6058
Tony Linthicum76329bf2011-12-12 21:14:55 +00006059public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006060 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6061 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006062 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006063 // Specify the vector alignment explicitly. For v512x1, the calculated
6064 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6065 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006066 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006067 "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 +00006068 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006069 SizeType = UnsignedInt;
6070 PtrDiffType = SignedInt;
6071 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006072
6073 // {} in inline assembly are packet specifiers, not assembly variant
6074 // specifiers.
6075 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006076
6077 LargeArrayMinWidth = 64;
6078 LargeArrayAlign = 64;
6079 UseBitFieldTypeAlignment = true;
6080 ZeroLengthBitfieldBoundary = 32;
6081 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006082 }
6083
Craig Topper6c03a542015-10-19 04:51:35 +00006084 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6085 return llvm::makeArrayRef(BuiltinInfo,
6086 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006087 }
6088
Craig Topper3164f332014-03-11 03:39:26 +00006089 bool validateAsmConstraint(const char *&Name,
6090 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006091 switch (*Name) {
6092 case 'v':
6093 case 'q':
6094 if (HasHVX) {
6095 Info.setAllowsRegister();
6096 return true;
6097 }
6098 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006099 case 's':
6100 // Relocatable constant.
6101 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006102 }
6103 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006104 }
6105
Craig Topper3164f332014-03-11 03:39:26 +00006106 void getTargetDefines(const LangOptions &Opts,
6107 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006108
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006109 bool isCLZForZeroUndef() const override { return false; }
6110
Craig Topper3164f332014-03-11 03:39:26 +00006111 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006112 return llvm::StringSwitch<bool>(Feature)
6113 .Case("hexagon", true)
6114 .Case("hvx", HasHVX)
6115 .Case("hvx-double", HasHVXDouble)
6116 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006117 }
Craig Topper3164f332014-03-11 03:39:26 +00006118
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006119 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6120 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6121 const override;
6122
6123 bool handleTargetFeatures(std::vector<std::string> &Features,
6124 DiagnosticsEngine &Diags) override;
6125
Craig Topper3164f332014-03-11 03:39:26 +00006126 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006127 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006128 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006129 ArrayRef<const char *> getGCCRegNames() const override;
6130 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006131 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006132 return "";
6133 }
Sebastian Pop86500282012-01-13 20:37:10 +00006134
6135 static const char *getHexagonCPUSuffix(StringRef Name) {
6136 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006137 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006138 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006139 .Case("hexagonv55", "55")
6140 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006141 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006142 }
6143
Craig Topper3164f332014-03-11 03:39:26 +00006144 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006145 if (!getHexagonCPUSuffix(Name))
6146 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006147 CPU = Name;
6148 return true;
6149 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006150
6151 int getEHDataRegisterNumber(unsigned RegNo) const override {
6152 return RegNo < 2 ? RegNo : -1;
6153 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006154};
6155
6156void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006157 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006158 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006159 Builder.defineMacro("__hexagon__", "1");
6160
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006161 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006162 Builder.defineMacro("__HEXAGON_V4__");
6163 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006164 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006165 Builder.defineMacro("__QDSP6_V4__");
6166 Builder.defineMacro("__QDSP6_ARCH__", "4");
6167 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006168 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006169 Builder.defineMacro("__HEXAGON_V5__");
6170 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6171 if(Opts.HexagonQdsp6Compat) {
6172 Builder.defineMacro("__QDSP6_V5__");
6173 Builder.defineMacro("__QDSP6_ARCH__", "5");
6174 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006175 } else if (CPU == "hexagonv55") {
6176 Builder.defineMacro("__HEXAGON_V55__");
6177 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6178 Builder.defineMacro("__QDSP6_V55__");
6179 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006180 } else if (CPU == "hexagonv60") {
6181 Builder.defineMacro("__HEXAGON_V60__");
6182 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6183 Builder.defineMacro("__QDSP6_V60__");
6184 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006185 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006186
6187 if (hasFeature("hvx")) {
6188 Builder.defineMacro("__HVX__");
6189 if (hasFeature("hvx-double"))
6190 Builder.defineMacro("__HVXDBL__");
6191 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006192}
6193
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006194bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6195 DiagnosticsEngine &Diags) {
6196 for (auto &F : Features) {
6197 if (F == "+hvx")
6198 HasHVX = true;
6199 else if (F == "-hvx")
6200 HasHVX = HasHVXDouble = false;
6201 else if (F == "+hvx-double")
6202 HasHVX = HasHVXDouble = true;
6203 else if (F == "-hvx-double")
6204 HasHVXDouble = false;
6205 }
6206 return true;
6207}
6208
6209bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6210 DiagnosticsEngine &Diags, StringRef CPU,
6211 const std::vector<std::string> &FeaturesVec) const {
6212 // Default for v60: -hvx, -hvx-double.
6213 Features["hvx"] = false;
6214 Features["hvx-double"] = false;
6215
6216 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6217}
6218
6219
6220const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006221 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6222 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6223 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6224 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6225 "p0", "p1", "p2", "p3",
6226 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6227};
6228
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006229ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006230 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006231}
6232
Tony Linthicum76329bf2011-12-12 21:14:55 +00006233const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6234 { { "sp" }, "r29" },
6235 { { "fp" }, "r30" },
6236 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006237};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006238
Craig Topperf054e3a2015-10-19 03:52:27 +00006239ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6240 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006241}
6242
6243
6244const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006245#define BUILTIN(ID, TYPE, ATTRS) \
6246 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6247#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6248 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006249#include "clang/Basic/BuiltinsHexagon.def"
6250};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006251
Jacques Pienaard964cc22016-03-28 21:02:54 +00006252class LanaiTargetInfo : public TargetInfo {
6253 // Class for Lanai (32-bit).
6254 // The CPU profiles supported by the Lanai backend
6255 enum CPUKind {
6256 CK_NONE,
6257 CK_V11,
6258 } CPU;
6259
6260 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6261 static const char *const GCCRegNames[];
6262
6263public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006264 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6265 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006266 // Description string has to be kept in sync with backend.
6267 resetDataLayout("E" // Big endian
6268 "-m:e" // ELF name manging
6269 "-p:32:32" // 32 bit pointers, 32 bit aligned
6270 "-i64:64" // 64 bit integers, 64 bit aligned
6271 "-a:0:32" // 32 bit alignment of objects of aggregate type
6272 "-n32" // 32 bit native integer width
6273 "-S64" // 64 bit natural stack alignment
6274 );
6275
6276 // Setting RegParmMax equal to what mregparm was set to in the old
6277 // toolchain
6278 RegParmMax = 4;
6279
6280 // Set the default CPU to V11
6281 CPU = CK_V11;
6282
6283 // Temporary approach to make everything at least word-aligned and allow for
6284 // safely casting between pointers with different alignment requirements.
6285 // TODO: Remove this when there are no more cast align warnings on the
6286 // firmware.
6287 MinGlobalAlign = 32;
6288 }
6289
6290 void getTargetDefines(const LangOptions &Opts,
6291 MacroBuilder &Builder) const override {
6292 // Define __lanai__ when building for target lanai.
6293 Builder.defineMacro("__lanai__");
6294
6295 // Set define for the CPU specified.
6296 switch (CPU) {
6297 case CK_V11:
6298 Builder.defineMacro("__LANAI_V11__");
6299 break;
6300 case CK_NONE:
6301 llvm_unreachable("Unhandled target CPU");
6302 }
6303 }
6304
6305 bool setCPU(const std::string &Name) override {
6306 CPU = llvm::StringSwitch<CPUKind>(Name)
6307 .Case("v11", CK_V11)
6308 .Default(CK_NONE);
6309
6310 return CPU != CK_NONE;
6311 }
6312
6313 bool hasFeature(StringRef Feature) const override {
6314 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6315 }
6316
6317 ArrayRef<const char *> getGCCRegNames() const override;
6318
6319 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6320
6321 BuiltinVaListKind getBuiltinVaListKind() const override {
6322 return TargetInfo::VoidPtrBuiltinVaList;
6323 }
6324
6325 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6326
6327 bool validateAsmConstraint(const char *&Name,
6328 TargetInfo::ConstraintInfo &info) const override {
6329 return false;
6330 }
6331
6332 const char *getClobbers() const override { return ""; }
6333};
6334
6335const char *const LanaiTargetInfo::GCCRegNames[] = {
6336 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6337 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6338 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6339
6340ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6341 return llvm::makeArrayRef(GCCRegNames);
6342}
6343
6344const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6345 {{"pc"}, "r2"},
6346 {{"sp"}, "r4"},
6347 {{"fp"}, "r5"},
6348 {{"rv"}, "r8"},
6349 {{"rr1"}, "r10"},
6350 {{"rr2"}, "r11"},
6351 {{"rca"}, "r15"},
6352};
6353
6354ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6355 return llvm::makeArrayRef(GCCRegAliases);
6356}
6357
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006358// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6359class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006360 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6361 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006362 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006363public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006364 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006365 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006366
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006367 int getEHDataRegisterNumber(unsigned RegNo) const override {
6368 if (RegNo == 0) return 24;
6369 if (RegNo == 1) return 25;
6370 return -1;
6371 }
6372
Craig Topper3164f332014-03-11 03:39:26 +00006373 bool handleTargetFeatures(std::vector<std::string> &Features,
6374 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006375 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006376 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6377 if (Feature != Features.end()) {
6378 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006379 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006380 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006381 }
Craig Topper3164f332014-03-11 03:39:26 +00006382 void getTargetDefines(const LangOptions &Opts,
6383 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006384 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006385 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006386
6387 if (SoftFloat)
6388 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006389 }
Craig Topper3164f332014-03-11 03:39:26 +00006390
6391 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006392 return llvm::StringSwitch<bool>(Feature)
6393 .Case("softfloat", SoftFloat)
6394 .Case("sparc", true)
6395 .Default(false);
6396 }
Craig Topper3164f332014-03-11 03:39:26 +00006397
Craig Topper6c03a542015-10-19 04:51:35 +00006398 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006399 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006400 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006401 }
Craig Topper3164f332014-03-11 03:39:26 +00006402 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006403 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006404 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006405 ArrayRef<const char *> getGCCRegNames() const override;
6406 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006407 bool validateAsmConstraint(const char *&Name,
6408 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006409 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006410 switch (*Name) {
6411 case 'I': // Signed 13-bit constant
6412 case 'J': // Zero
6413 case 'K': // 32-bit constant with the low 12 bits clear
6414 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6415 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6416 case 'N': // Same as 'K' but zext (required for SIMode)
6417 case 'O': // The constant 4096
6418 return true;
6419 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006420 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006421 }
Craig Topper3164f332014-03-11 03:39:26 +00006422 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006423 // FIXME: Implement!
6424 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006425 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006426
6427 // No Sparc V7 for now, the backend doesn't support it anyway.
6428 enum CPUKind {
6429 CK_GENERIC,
6430 CK_V8,
6431 CK_SUPERSPARC,
6432 CK_SPARCLITE,
6433 CK_F934,
6434 CK_HYPERSPARC,
6435 CK_SPARCLITE86X,
6436 CK_SPARCLET,
6437 CK_TSC701,
6438 CK_V9,
6439 CK_ULTRASPARC,
6440 CK_ULTRASPARC3,
6441 CK_NIAGARA,
6442 CK_NIAGARA2,
6443 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006444 CK_NIAGARA4,
6445 CK_MYRIAD2_1,
6446 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006447 } CPU = CK_GENERIC;
6448
6449 enum CPUGeneration {
6450 CG_V8,
6451 CG_V9,
6452 };
6453
6454 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6455 switch (Kind) {
6456 case CK_GENERIC:
6457 case CK_V8:
6458 case CK_SUPERSPARC:
6459 case CK_SPARCLITE:
6460 case CK_F934:
6461 case CK_HYPERSPARC:
6462 case CK_SPARCLITE86X:
6463 case CK_SPARCLET:
6464 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006465 case CK_MYRIAD2_1:
6466 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006467 return CG_V8;
6468 case CK_V9:
6469 case CK_ULTRASPARC:
6470 case CK_ULTRASPARC3:
6471 case CK_NIAGARA:
6472 case CK_NIAGARA2:
6473 case CK_NIAGARA3:
6474 case CK_NIAGARA4:
6475 return CG_V9;
6476 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006477 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006478 }
6479
6480 CPUKind getCPUKind(StringRef Name) const {
6481 return llvm::StringSwitch<CPUKind>(Name)
6482 .Case("v8", CK_V8)
6483 .Case("supersparc", CK_SUPERSPARC)
6484 .Case("sparclite", CK_SPARCLITE)
6485 .Case("f934", CK_F934)
6486 .Case("hypersparc", CK_HYPERSPARC)
6487 .Case("sparclite86x", CK_SPARCLITE86X)
6488 .Case("sparclet", CK_SPARCLET)
6489 .Case("tsc701", CK_TSC701)
6490 .Case("v9", CK_V9)
6491 .Case("ultrasparc", CK_ULTRASPARC)
6492 .Case("ultrasparc3", CK_ULTRASPARC3)
6493 .Case("niagara", CK_NIAGARA)
6494 .Case("niagara2", CK_NIAGARA2)
6495 .Case("niagara3", CK_NIAGARA3)
6496 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006497 .Case("myriad2", CK_MYRIAD2_1)
6498 .Case("myriad2.1", CK_MYRIAD2_1)
6499 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006500 .Default(CK_GENERIC);
6501 }
6502
6503 bool setCPU(const std::string &Name) override {
6504 CPU = getCPUKind(Name);
6505 return CPU != CK_GENERIC;
6506 }
Gabor Greif49991682008-02-21 16:29:08 +00006507};
6508
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006509const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006510 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6511 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6512 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6513 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6514};
6515
Craig Topperf054e3a2015-10-19 03:52:27 +00006516ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6517 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006518}
6519
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006520const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006521 { { "g0" }, "r0" },
6522 { { "g1" }, "r1" },
6523 { { "g2" }, "r2" },
6524 { { "g3" }, "r3" },
6525 { { "g4" }, "r4" },
6526 { { "g5" }, "r5" },
6527 { { "g6" }, "r6" },
6528 { { "g7" }, "r7" },
6529 { { "o0" }, "r8" },
6530 { { "o1" }, "r9" },
6531 { { "o2" }, "r10" },
6532 { { "o3" }, "r11" },
6533 { { "o4" }, "r12" },
6534 { { "o5" }, "r13" },
6535 { { "o6", "sp" }, "r14" },
6536 { { "o7" }, "r15" },
6537 { { "l0" }, "r16" },
6538 { { "l1" }, "r17" },
6539 { { "l2" }, "r18" },
6540 { { "l3" }, "r19" },
6541 { { "l4" }, "r20" },
6542 { { "l5" }, "r21" },
6543 { { "l6" }, "r22" },
6544 { { "l7" }, "r23" },
6545 { { "i0" }, "r24" },
6546 { { "i1" }, "r25" },
6547 { { "i2" }, "r26" },
6548 { { "i3" }, "r27" },
6549 { { "i4" }, "r28" },
6550 { { "i5" }, "r29" },
6551 { { "i6", "fp" }, "r30" },
6552 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006553};
6554
Craig Topperf054e3a2015-10-19 03:52:27 +00006555ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6556 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006557}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006558
6559// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6560class SparcV8TargetInfo : public SparcTargetInfo {
6561public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006562 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6563 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006564 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006565 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6566 switch (getTriple().getOS()) {
6567 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006568 SizeType = UnsignedInt;
6569 IntPtrType = SignedInt;
6570 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006571 break;
6572 case llvm::Triple::NetBSD:
6573 case llvm::Triple::OpenBSD:
6574 SizeType = UnsignedLong;
6575 IntPtrType = SignedLong;
6576 PtrDiffType = SignedLong;
6577 break;
Brad Smith56495d52015-08-13 22:00:53 +00006578 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006579 }
6580
Craig Topper3164f332014-03-11 03:39:26 +00006581 void getTargetDefines(const LangOptions &Opts,
6582 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006583 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006584 switch (getCPUGeneration(CPU)) {
6585 case CG_V8:
6586 Builder.defineMacro("__sparcv8");
6587 if (getTriple().getOS() != llvm::Triple::Solaris)
6588 Builder.defineMacro("__sparcv8__");
6589 break;
6590 case CG_V9:
6591 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006592 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006593 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006594 Builder.defineMacro("__sparc_v9__");
6595 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006596 break;
6597 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006598 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6599 switch (CPU) {
6600 case CK_MYRIAD2_1:
6601 Builder.defineMacro("__myriad2", "1");
6602 Builder.defineMacro("__myriad2__", "1");
6603 break;
6604 case CK_MYRIAD2_2:
6605 Builder.defineMacro("__myriad2", "2");
6606 Builder.defineMacro("__myriad2__", "2");
6607 break;
6608 default:
6609 break;
6610 }
6611 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006612 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006613
6614 bool hasSjLjLowering() const override {
6615 return true;
6616 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006617};
6618
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006619// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6620class SparcV8elTargetInfo : public SparcV8TargetInfo {
6621 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006622 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6623 : SparcV8TargetInfo(Triple, Opts) {
6624 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6625 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006626 }
6627};
6628
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006629// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6630class SparcV9TargetInfo : public SparcTargetInfo {
6631public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006632 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6633 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006634 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006635 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006636 // This is an LP64 platform.
6637 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006638
6639 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006640 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006641 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006642 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006643 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006644 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006645
6646 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6647 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6648 LongDoubleWidth = 128;
6649 LongDoubleAlign = 128;
6650 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006651 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006652 }
6653
Craig Topper3164f332014-03-11 03:39:26 +00006654 void getTargetDefines(const LangOptions &Opts,
6655 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006656 SparcTargetInfo::getTargetDefines(Opts, Builder);
6657 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006658 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006659 // Solaris doesn't need these variants, but the BSDs do.
6660 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006661 Builder.defineMacro("__sparc64__");
6662 Builder.defineMacro("__sparc_v9__");
6663 Builder.defineMacro("__sparcv9__");
6664 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006665 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006666
Craig Topper3164f332014-03-11 03:39:26 +00006667 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006668 if (!SparcTargetInfo::setCPU(Name))
6669 return false;
6670 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006671 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006672};
6673
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006674class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006675 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006676 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006677 std::string CPU;
6678 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006679 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006680
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006681public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006682 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006683 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6684 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006685 IntMaxType = SignedLong;
6686 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006687 TLSSupported = true;
6688 IntWidth = IntAlign = 32;
6689 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6690 PointerWidth = PointerAlign = 64;
6691 LongDoubleWidth = 128;
6692 LongDoubleAlign = 64;
6693 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006694 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006695 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006696 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 +00006697 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6698 }
6699 void getTargetDefines(const LangOptions &Opts,
6700 MacroBuilder &Builder) const override {
6701 Builder.defineMacro("__s390__");
6702 Builder.defineMacro("__s390x__");
6703 Builder.defineMacro("__zarch__");
6704 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006705
6706 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6707 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6708 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6709 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6710
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006711 if (HasTransactionalExecution)
6712 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006713 if (Opts.ZVector)
6714 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006715 }
Craig Topper6c03a542015-10-19 04:51:35 +00006716 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6717 return llvm::makeArrayRef(BuiltinInfo,
6718 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006719 }
6720
Craig Topperf054e3a2015-10-19 03:52:27 +00006721 ArrayRef<const char *> getGCCRegNames() const override;
6722 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006723 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006724 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006725 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006726 bool validateAsmConstraint(const char *&Name,
6727 TargetInfo::ConstraintInfo &info) const override;
6728 const char *getClobbers() const override {
6729 // FIXME: Is this really right?
6730 return "";
6731 }
6732 BuiltinVaListKind getBuiltinVaListKind() const override {
6733 return TargetInfo::SystemZBuiltinVaList;
6734 }
6735 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006736 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006737 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6738 .Case("z10", true)
6739 .Case("z196", true)
6740 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006741 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006742 .Default(false);
6743
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006744 return CPUKnown;
6745 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006746 bool
6747 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6748 StringRef CPU,
6749 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006750 if (CPU == "zEC12")
6751 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006752 if (CPU == "z13") {
6753 Features["transactional-execution"] = true;
6754 Features["vector"] = true;
6755 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006756 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006757 }
6758
6759 bool handleTargetFeatures(std::vector<std::string> &Features,
6760 DiagnosticsEngine &Diags) override {
6761 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006762 for (const auto &Feature : Features) {
6763 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006764 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006765 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006766 HasVector = true;
6767 }
6768 // If we use the vector ABI, vector types are 64-bit aligned.
6769 if (HasVector) {
6770 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006771 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6772 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006773 }
6774 return true;
6775 }
6776
6777 bool hasFeature(StringRef Feature) const override {
6778 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006779 .Case("systemz", true)
6780 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006781 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006782 .Default(false);
6783 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006784
Bryan Chane3f1ed52016-04-28 13:56:43 +00006785 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6786 switch (CC) {
6787 case CC_C:
6788 case CC_Swift:
6789 return CCCR_OK;
6790 default:
6791 return CCCR_Warning;
6792 }
6793 }
6794
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006795 StringRef getABI() const override {
6796 if (HasVector)
6797 return "vector";
6798 return "";
6799 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006800
6801 bool useFloat128ManglingForLongDouble() const override {
6802 return true;
6803 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006804};
6805
6806const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6807#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006808 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006809#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6810 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006811#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006812};
6813
6814const char *const SystemZTargetInfo::GCCRegNames[] = {
6815 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6816 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6817 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6818 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6819};
6820
Craig Topperf054e3a2015-10-19 03:52:27 +00006821ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6822 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006823}
6824
6825bool SystemZTargetInfo::
6826validateAsmConstraint(const char *&Name,
6827 TargetInfo::ConstraintInfo &Info) const {
6828 switch (*Name) {
6829 default:
6830 return false;
6831
6832 case 'a': // Address register
6833 case 'd': // Data register (equivalent to 'r')
6834 case 'f': // Floating-point register
6835 Info.setAllowsRegister();
6836 return true;
6837
6838 case 'I': // Unsigned 8-bit constant
6839 case 'J': // Unsigned 12-bit constant
6840 case 'K': // Signed 16-bit constant
6841 case 'L': // Signed 20-bit displacement (on all targets we support)
6842 case 'M': // 0x7fffffff
6843 return true;
6844
6845 case 'Q': // Memory with base and unsigned 12-bit displacement
6846 case 'R': // Likewise, plus an index
6847 case 'S': // Memory with base and signed 20-bit displacement
6848 case 'T': // Likewise, plus an index
6849 Info.setAllowsMemory();
6850 return true;
6851 }
6852}
Ulrich Weigand47445072013-05-06 16:26:41 +00006853
Eric Christopherc48497a2015-09-18 21:26:24 +00006854class MSP430TargetInfo : public TargetInfo {
6855 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006856
Eric Christopherc48497a2015-09-18 21:26:24 +00006857public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006858 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6859 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006860 BigEndian = false;
6861 TLSSupported = false;
6862 IntWidth = 16;
6863 IntAlign = 16;
6864 LongWidth = 32;
6865 LongLongWidth = 64;
6866 LongAlign = LongLongAlign = 16;
6867 PointerWidth = 16;
6868 PointerAlign = 16;
6869 SuitableAlign = 16;
6870 SizeType = UnsignedInt;
6871 IntMaxType = SignedLongLong;
6872 IntPtrType = SignedInt;
6873 PtrDiffType = SignedInt;
6874 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006875 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006876 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006877 void getTargetDefines(const LangOptions &Opts,
6878 MacroBuilder &Builder) const override {
6879 Builder.defineMacro("MSP430");
6880 Builder.defineMacro("__MSP430__");
6881 // FIXME: defines for different 'flavours' of MCU
6882 }
Craig Topper6c03a542015-10-19 04:51:35 +00006883 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006884 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006885 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006886 }
6887 bool hasFeature(StringRef Feature) const override {
6888 return Feature == "msp430";
6889 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006890 ArrayRef<const char *> getGCCRegNames() const override;
6891 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006892 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006893 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006894 }
6895 bool validateAsmConstraint(const char *&Name,
6896 TargetInfo::ConstraintInfo &info) const override {
6897 // FIXME: implement
6898 switch (*Name) {
6899 case 'K': // the constant 1
6900 case 'L': // constant -1^20 .. 1^19
6901 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006902 return true;
6903 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006904 // No target constraints for now.
6905 return false;
6906 }
6907 const char *getClobbers() const override {
6908 // FIXME: Is this really right?
6909 return "";
6910 }
6911 BuiltinVaListKind getBuiltinVaListKind() const override {
6912 // FIXME: implement
6913 return TargetInfo::CharPtrBuiltinVaList;
6914 }
6915};
6916
6917const char *const MSP430TargetInfo::GCCRegNames[] = {
6918 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6919 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6920
Craig Topperf054e3a2015-10-19 03:52:27 +00006921ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6922 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006923}
6924
6925// LLVM and Clang cannot be used directly to output native binaries for
6926// target, but is used to compile C code to llvm bitcode with correct
6927// type and alignment information.
6928//
6929// TCE uses the llvm bitcode as input and uses it for generating customized
6930// target processor and program binary. TCE co-design environment is
6931// publicly available in http://tce.cs.tut.fi
6932
6933static const unsigned TCEOpenCLAddrSpaceMap[] = {
6934 3, // opencl_global
6935 4, // opencl_local
6936 5, // opencl_constant
6937 // FIXME: generic has to be added to the target
6938 0, // opencl_generic
6939 0, // cuda_device
6940 0, // cuda_constant
6941 0 // cuda_shared
6942};
6943
6944class TCETargetInfo : public TargetInfo {
6945public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006946 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6947 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006948 TLSSupported = false;
6949 IntWidth = 32;
6950 LongWidth = LongLongWidth = 32;
6951 PointerWidth = 32;
6952 IntAlign = 32;
6953 LongAlign = LongLongAlign = 32;
6954 PointerAlign = 32;
6955 SuitableAlign = 32;
6956 SizeType = UnsignedInt;
6957 IntMaxType = SignedLong;
6958 IntPtrType = SignedInt;
6959 PtrDiffType = SignedInt;
6960 FloatWidth = 32;
6961 FloatAlign = 32;
6962 DoubleWidth = 32;
6963 DoubleAlign = 32;
6964 LongDoubleWidth = 32;
6965 LongDoubleAlign = 32;
6966 FloatFormat = &llvm::APFloat::IEEEsingle;
6967 DoubleFormat = &llvm::APFloat::IEEEsingle;
6968 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006969 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6970 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006971 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6972 UseAddrSpaceMapMangling = true;
6973 }
6974
6975 void getTargetDefines(const LangOptions &Opts,
6976 MacroBuilder &Builder) const override {
6977 DefineStd(Builder, "tce", Opts);
6978 Builder.defineMacro("__TCE__");
6979 Builder.defineMacro("__TCE_V1__");
6980 }
6981 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6982
Craig Topper6c03a542015-10-19 04:51:35 +00006983 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006984 const char *getClobbers() const override { return ""; }
6985 BuiltinVaListKind getBuiltinVaListKind() const override {
6986 return TargetInfo::VoidPtrBuiltinVaList;
6987 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006988 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006989 bool validateAsmConstraint(const char *&Name,
6990 TargetInfo::ConstraintInfo &info) const override {
6991 return true;
6992 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006993 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6994 return None;
6995 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006996};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006997
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006998class BPFTargetInfo : public TargetInfo {
6999public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007000 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7001 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007002 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7003 SizeType = UnsignedLong;
7004 PtrDiffType = SignedLong;
7005 IntPtrType = SignedLong;
7006 IntMaxType = SignedLong;
7007 Int64Type = SignedLong;
7008 RegParmMax = 5;
7009 if (Triple.getArch() == llvm::Triple::bpfeb) {
7010 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007011 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007012 } else {
7013 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00007014 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007015 }
7016 MaxAtomicPromoteWidth = 64;
7017 MaxAtomicInlineWidth = 64;
7018 TLSSupported = false;
7019 }
7020 void getTargetDefines(const LangOptions &Opts,
7021 MacroBuilder &Builder) const override {
7022 DefineStd(Builder, "bpf", Opts);
7023 Builder.defineMacro("__BPF__");
7024 }
7025 bool hasFeature(StringRef Feature) const override {
7026 return Feature == "bpf";
7027 }
7028
Craig Topper6c03a542015-10-19 04:51:35 +00007029 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007030 const char *getClobbers() const override {
7031 return "";
7032 }
7033 BuiltinVaListKind getBuiltinVaListKind() const override {
7034 return TargetInfo::VoidPtrBuiltinVaList;
7035 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007036 ArrayRef<const char *> getGCCRegNames() const override {
7037 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007038 }
7039 bool validateAsmConstraint(const char *&Name,
7040 TargetInfo::ConstraintInfo &info) const override {
7041 return true;
7042 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007043 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7044 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007045 }
7046};
7047
Daniel Sanders4672af62016-05-27 11:51:02 +00007048class MipsTargetInfo : public TargetInfo {
7049 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007050 StringRef Layout;
7051
7052 if (ABI == "o32")
7053 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7054 else if (ABI == "n32")
7055 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7056 else if (ABI == "n64")
7057 Layout = "m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7058 else
7059 llvm_unreachable("Invalid ABI");
7060
7061 if (BigEndian)
7062 resetDataLayout(("E-" + Layout).str());
7063 else
7064 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007065 }
7066
Akira Hatanaka9064e362013-10-29 18:30:33 +00007067
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007068 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007069 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007070 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007071 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007072 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007073 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007074 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007075 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007076 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007077 enum DspRevEnum {
7078 NoDSP, DSP1, DSP2
7079 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007080 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007081
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007082protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007083 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007084 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007085
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007086public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007087 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007088 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7089 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7090 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007091 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007092 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7093 getTriple().getArch() == llvm::Triple::mips64;
7094
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007095 setABI((getTriple().getArch() == llvm::Triple::mips ||
7096 getTriple().getArch() == llvm::Triple::mipsel)
7097 ? "o32"
7098 : "n64");
7099
7100 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007101 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007102
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007103 bool isNaN2008Default() const {
7104 return CPU == "mips32r6" || CPU == "mips64r6";
7105 }
7106
7107 bool isFP64Default() const {
7108 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7109 }
7110
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007111 bool isNan2008() const override {
7112 return IsNan2008;
7113 }
7114
Alp Toker4925ba72014-06-07 23:30:42 +00007115 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007116 bool setABI(const std::string &Name) override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007117 // FIXME: The Arch component on the triple actually has no bearing on
7118 // whether the ABI is valid or not. It's features of the CPU that
7119 // matters and the size of the GPR's in particular.
7120 // However, we can't allow O32 on 64-bit processors just yet because
7121 // the backend still checks the Arch component instead of the ABI in
7122 // a few places.
Daniel Sanders4672af62016-05-27 11:51:02 +00007123 if (getTriple().getArch() == llvm::Triple::mips ||
7124 getTriple().getArch() == llvm::Triple::mipsel) {
Daniel Sanders07c86542016-05-27 14:30:23 +00007125 if (Name == "o32") {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007126 setO32ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007127 ABI = Name;
7128 return true;
7129 }
7130 }
7131 if (getTriple().getArch() == llvm::Triple::mips64 ||
7132 getTriple().getArch() == llvm::Triple::mips64el) {
7133 if (Name == "n32") {
7134 setN32ABITypes();
7135 ABI = Name;
7136 return true;
7137 }
7138 if (Name == "n64") {
7139 setN64ABITypes();
7140 ABI = Name;
7141 return true;
7142 }
7143 }
7144 return false;
7145 }
7146
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007147 void setO32ABITypes() {
7148 Int64Type = SignedLongLong;
7149 IntMaxType = Int64Type;
7150 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7151 LongDoubleWidth = LongDoubleAlign = 64;
7152 LongWidth = LongAlign = 32;
7153 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7154 PointerWidth = PointerAlign = 32;
7155 PtrDiffType = SignedInt;
7156 SizeType = UnsignedInt;
7157 SuitableAlign = 64;
7158 }
7159
7160 void setN32N64ABITypes() {
7161 LongDoubleWidth = LongDoubleAlign = 128;
7162 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7163 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7164 LongDoubleWidth = LongDoubleAlign = 64;
7165 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7166 }
7167 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7168 SuitableAlign = 128;
7169 }
7170
Daniel Sanders4672af62016-05-27 11:51:02 +00007171 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007172 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007173 Int64Type = SignedLong;
7174 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007175 LongWidth = LongAlign = 64;
7176 PointerWidth = PointerAlign = 64;
7177 PtrDiffType = SignedLong;
7178 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007179 }
7180
7181 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007182 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007183 Int64Type = SignedLongLong;
7184 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007185 LongWidth = LongAlign = 32;
7186 PointerWidth = PointerAlign = 32;
7187 PtrDiffType = SignedInt;
7188 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007189 }
7190
Craig Topper3164f332014-03-11 03:39:26 +00007191 bool setCPU(const std::string &Name) override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007192 bool GPR64Required = ABI == "n32" || ABI == "n64";
Eric Christopher0b26a612010-03-02 02:41:08 +00007193 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007194 return llvm::StringSwitch<bool>(Name)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007195 .Case("mips1", !GPR64Required)
7196 .Case("mips2", !GPR64Required)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007197 .Case("mips3", true)
7198 .Case("mips4", true)
7199 .Case("mips5", true)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007200 .Case("mips32", !GPR64Required)
7201 .Case("mips32r2", !GPR64Required)
7202 .Case("mips32r3", !GPR64Required)
7203 .Case("mips32r5", !GPR64Required)
7204 .Case("mips32r6", !GPR64Required)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007205 .Case("mips64", true)
7206 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007207 .Case("mips64r3", true)
7208 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007209 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007210 .Case("octeon", true)
Daniel Sanders28d86372016-06-06 09:47:32 +00007211 .Case("p5600", !GPR64Required)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007212 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007213 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007214 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007215 bool
7216 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7217 StringRef CPU,
7218 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007219 if (CPU.empty())
7220 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007221 if (CPU == "octeon")
7222 Features["mips64r2"] = Features["cnmips"] = true;
7223 else
7224 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007225 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007226 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007227
Craig Topper3164f332014-03-11 03:39:26 +00007228 void getTargetDefines(const LangOptions &Opts,
7229 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007230 if (BigEndian) {
7231 DefineStd(Builder, "MIPSEB", Opts);
7232 Builder.defineMacro("_MIPSEB");
7233 } else {
7234 DefineStd(Builder, "MIPSEL", Opts);
7235 Builder.defineMacro("_MIPSEL");
7236 }
7237
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007238 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007239 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007240 if (Opts.GNUMode)
7241 Builder.defineMacro("mips");
7242
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007243 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007244 Builder.defineMacro("__mips", "32");
7245 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7246 } else {
7247 Builder.defineMacro("__mips", "64");
7248 Builder.defineMacro("__mips64");
7249 Builder.defineMacro("__mips64__");
7250 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7251 }
7252
7253 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7254 .Cases("mips32", "mips64", "1")
7255 .Cases("mips32r2", "mips64r2", "2")
7256 .Cases("mips32r3", "mips64r3", "3")
7257 .Cases("mips32r5", "mips64r5", "5")
7258 .Cases("mips32r6", "mips64r6", "6")
7259 .Default("");
7260 if (!ISARev.empty())
7261 Builder.defineMacro("__mips_isa_rev", ISARev);
7262
7263 if (ABI == "o32") {
7264 Builder.defineMacro("__mips_o32");
7265 Builder.defineMacro("_ABIO32", "1");
7266 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007267 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007268 Builder.defineMacro("__mips_n32");
7269 Builder.defineMacro("_ABIN32", "2");
7270 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7271 } else if (ABI == "n64") {
7272 Builder.defineMacro("__mips_n64");
7273 Builder.defineMacro("_ABI64", "3");
7274 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7275 } else
7276 llvm_unreachable("Invalid ABI.");
7277
Simon Atanasyan683535b2012-08-29 19:14:58 +00007278 Builder.defineMacro("__REGISTER_PREFIX__", "");
7279
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007280 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007281 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007282 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007283 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007284 case SoftFloat:
7285 Builder.defineMacro("__mips_soft_float", Twine(1));
7286 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007287 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007288
Simon Atanasyan16071912013-04-14 14:07:30 +00007289 if (IsSingleFloat)
7290 Builder.defineMacro("__mips_single_float", Twine(1));
7291
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007292 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7293 Builder.defineMacro("_MIPS_FPSET",
7294 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7295
Simon Atanasyan72244b62012-07-05 16:06:06 +00007296 if (IsMips16)
7297 Builder.defineMacro("__mips16", Twine(1));
7298
Simon Atanasyan60777612013-04-14 14:07:51 +00007299 if (IsMicromips)
7300 Builder.defineMacro("__mips_micromips", Twine(1));
7301
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007302 if (IsNan2008)
7303 Builder.defineMacro("__mips_nan2008", Twine(1));
7304
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007305 switch (DspRev) {
7306 default:
7307 break;
7308 case DSP1:
7309 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7310 Builder.defineMacro("__mips_dsp", Twine(1));
7311 break;
7312 case DSP2:
7313 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7314 Builder.defineMacro("__mips_dspr2", Twine(1));
7315 Builder.defineMacro("__mips_dsp", Twine(1));
7316 break;
7317 }
7318
Jack Carter44ff1e52013-08-12 17:20:29 +00007319 if (HasMSA)
7320 Builder.defineMacro("__mips_msa", Twine(1));
7321
Simon Atanasyan26f19672012-04-05 19:28:31 +00007322 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7323 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7324 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007325
7326 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7327 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007328
7329 // These shouldn't be defined for MIPS-I but there's no need to check
7330 // for that since MIPS-I isn't supported.
7331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7333 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007334
7335 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7336 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7337 // the instructions exist but using them violates the ABI since they
7338 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7339 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007340 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007341 }
7342
Craig Topper6c03a542015-10-19 04:51:35 +00007343 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7344 return llvm::makeArrayRef(BuiltinInfo,
7345 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007346 }
Craig Topper3164f332014-03-11 03:39:26 +00007347 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007348 return llvm::StringSwitch<bool>(Feature)
7349 .Case("mips", true)
7350 .Case("fp64", HasFP64)
7351 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007352 }
Craig Topper3164f332014-03-11 03:39:26 +00007353 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007354 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007355 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007356 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007357 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007358 // CPU register names
7359 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007360 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7361 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7362 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007363 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7364 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007365 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7366 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7367 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7368 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007369 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007370 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007371 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7372 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007373 // MSA register names
7374 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7375 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7376 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7377 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7378 // MSA control register names
7379 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7380 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007381 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007382 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007383 }
Craig Topper3164f332014-03-11 03:39:26 +00007384 bool validateAsmConstraint(const char *&Name,
7385 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007386 switch (*Name) {
7387 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007388 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007389 case 'r': // CPU registers.
7390 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007391 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007392 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007393 case 'c': // $25 for indirect jumps
7394 case 'l': // lo register
7395 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007396 Info.setAllowsRegister();
7397 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007398 case 'I': // Signed 16-bit constant
7399 case 'J': // Integer 0
7400 case 'K': // Unsigned 16-bit constant
7401 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7402 case 'M': // Constants not loadable via lui, addiu, or ori
7403 case 'N': // Constant -1 to -65535
7404 case 'O': // A signed 15-bit constant
7405 case 'P': // A constant between 1 go 65535
7406 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007407 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007408 Info.setAllowsMemory();
7409 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007410 case 'Z':
7411 if (Name[1] == 'C') { // An address usable by ll, and sc.
7412 Info.setAllowsMemory();
7413 Name++; // Skip over 'Z'.
7414 return true;
7415 }
7416 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007417 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007418 }
7419
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007420 std::string convertConstraint(const char *&Constraint) const override {
7421 std::string R;
7422 switch (*Constraint) {
7423 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7424 if (Constraint[1] == 'C') {
7425 R = std::string("^") + std::string(Constraint, 2);
7426 Constraint++;
7427 return R;
7428 }
7429 break;
7430 }
7431 return TargetInfo::convertConstraint(Constraint);
7432 }
7433
Craig Topper3164f332014-03-11 03:39:26 +00007434 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007435 // In GCC, $1 is not widely used in generated code (it's used only in a few
7436 // specific situations), so there is no real need for users to add it to
7437 // the clobbers list if they want to use it in their inline assembly code.
7438 //
7439 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7440 // code generation, so using it in inline assembly without adding it to the
7441 // clobbers list can cause conflicts between the inline assembly code and
7442 // the surrounding generated code.
7443 //
7444 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7445 // operands, which will conflict with the ".set at" assembler option (which
7446 // we use only for inline assembly, in order to maintain compatibility with
7447 // GCC) and will also conflict with the user's usage of $1.
7448 //
7449 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7450 // register for generated code is to automatically clobber $1 for all inline
7451 // assembly code.
7452 //
7453 // FIXME: We should automatically clobber $1 only for inline assembly code
7454 // which actually uses it. This would allow LLVM to use $1 for inline
7455 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007456 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007457 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007458
Craig Topper3164f332014-03-11 03:39:26 +00007459 bool handleTargetFeatures(std::vector<std::string> &Features,
7460 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007461 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007462 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007463 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007464 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007465 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007466 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007467 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007468
Eric Christopher610fe112015-08-26 08:21:55 +00007469 for (const auto &Feature : Features) {
7470 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007471 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007472 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007473 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007474 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007475 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007476 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007477 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007478 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007479 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007480 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007481 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007482 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007483 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007484 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007485 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007486 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007487 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007488 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007489 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007490 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007491 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007492 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007493
James Y Knightb214cbc2016-03-04 19:00:41 +00007494 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007495
Rafael Espindolaeb265472013-08-21 21:59:03 +00007496 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007497 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007498
Craig Topper3164f332014-03-11 03:39:26 +00007499 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007500 if (RegNo == 0) return 4;
7501 if (RegNo == 1) return 5;
7502 return -1;
7503 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007504
7505 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007506
7507 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7508 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7509 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7510 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7511 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7512 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7513 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7514 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7515 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7516 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7517 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7518 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7519 {{"ra"}, "$31"}};
7520 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7521 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7522 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7523 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7524 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7525 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7526 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7527 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7528 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7529 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7530 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7531 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007532 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007533 return llvm::makeArrayRef(O32RegAliases);
7534 return llvm::makeArrayRef(NewABIRegAliases);
7535 }
7536
7537 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007538 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007539 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007540};
7541
Daniel Sanders4672af62016-05-27 11:51:02 +00007542const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007543#define BUILTIN(ID, TYPE, ATTRS) \
7544 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7545#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7546 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007547#include "clang/Basic/BuiltinsMips.def"
7548};
7549
Ivan Krasindd7403e2011-08-24 20:22:22 +00007550class PNaClTargetInfo : public TargetInfo {
7551public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007552 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7553 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007554 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007555 this->LongAlign = 32;
7556 this->LongWidth = 32;
7557 this->PointerAlign = 32;
7558 this->PointerWidth = 32;
7559 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007560 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007561 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007562 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007563 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007564 this->SizeType = TargetInfo::UnsignedInt;
7565 this->PtrDiffType = TargetInfo::SignedInt;
7566 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007567 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007568 }
7569
Craig Toppere6f17d02014-03-11 04:07:52 +00007570 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007571 Builder.defineMacro("__le32__");
7572 Builder.defineMacro("__pnacl__");
7573 }
Craig Topper3164f332014-03-11 03:39:26 +00007574 void getTargetDefines(const LangOptions &Opts,
7575 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007576 getArchDefines(Opts, Builder);
7577 }
Craig Topper3164f332014-03-11 03:39:26 +00007578 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007579 return Feature == "pnacl";
7580 }
Craig Topper6c03a542015-10-19 04:51:35 +00007581 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007582 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007583 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007584 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007585 ArrayRef<const char *> getGCCRegNames() const override;
7586 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007587 bool validateAsmConstraint(const char *&Name,
7588 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007589 return false;
7590 }
7591
Craig Topper3164f332014-03-11 03:39:26 +00007592 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007593 return "";
7594 }
7595};
7596
Craig Topperf054e3a2015-10-19 03:52:27 +00007597ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7598 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007599}
7600
Craig Topperf054e3a2015-10-19 03:52:27 +00007601ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7602 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007603}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007604
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007605// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007606class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007607public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007608 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7609 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007610
7611 BuiltinVaListKind getBuiltinVaListKind() const override {
7612 return TargetInfo::PNaClABIBuiltinVaList;
7613 }
7614};
7615
JF Bastien643817d2014-09-12 17:52:47 +00007616class Le64TargetInfo : public TargetInfo {
7617 static const Builtin::Info BuiltinInfo[];
7618
7619public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007620 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7621 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007622 BigEndian = false;
7623 NoAsmVariants = true;
7624 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7625 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007626 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007627 }
7628
7629 void getTargetDefines(const LangOptions &Opts,
7630 MacroBuilder &Builder) const override {
7631 DefineStd(Builder, "unix", Opts);
7632 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7633 Builder.defineMacro("__ELF__");
7634 }
Craig Topper6c03a542015-10-19 04:51:35 +00007635 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7636 return llvm::makeArrayRef(BuiltinInfo,
7637 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007638 }
7639 BuiltinVaListKind getBuiltinVaListKind() const override {
7640 return TargetInfo::PNaClABIBuiltinVaList;
7641 }
7642 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007643 ArrayRef<const char *> getGCCRegNames() const override {
7644 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007645 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007646 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7647 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007648 }
7649 bool validateAsmConstraint(const char *&Name,
7650 TargetInfo::ConstraintInfo &Info) const override {
7651 return false;
7652 }
7653
7654 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007655};
Dan Gohmanc2853072015-09-03 22:51:53 +00007656
7657class WebAssemblyTargetInfo : public TargetInfo {
7658 static const Builtin::Info BuiltinInfo[];
7659
7660 enum SIMDEnum {
7661 NoSIMD,
7662 SIMD128,
7663 } SIMDLevel;
7664
7665public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007666 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007667 : TargetInfo(T), SIMDLevel(NoSIMD) {
7668 BigEndian = false;
7669 NoAsmVariants = true;
7670 SuitableAlign = 128;
7671 LargeArrayMinWidth = 128;
7672 LargeArrayAlign = 128;
7673 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007674 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007675 LongDoubleWidth = LongDoubleAlign = 128;
7676 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007677 }
7678
7679protected:
7680 void getTargetDefines(const LangOptions &Opts,
7681 MacroBuilder &Builder) const override {
7682 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7683 if (SIMDLevel >= SIMD128)
7684 Builder.defineMacro("__wasm_simd128__");
7685 }
7686
7687private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007688 bool
7689 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7690 StringRef CPU,
7691 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007692 if (CPU == "bleeding-edge")
7693 Features["simd128"] = true;
7694 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7695 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007696 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007697 return llvm::StringSwitch<bool>(Feature)
7698 .Case("simd128", SIMDLevel >= SIMD128)
7699 .Default(false);
7700 }
7701 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007702 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007703 for (const auto &Feature : Features) {
7704 if (Feature == "+simd128") {
7705 SIMDLevel = std::max(SIMDLevel, SIMD128);
7706 continue;
7707 }
7708 if (Feature == "-simd128") {
7709 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7710 continue;
7711 }
7712
7713 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7714 << "-target-feature";
7715 return false;
7716 }
7717 return true;
7718 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007719 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007720 return llvm::StringSwitch<bool>(Name)
7721 .Case("mvp", true)
7722 .Case("bleeding-edge", true)
7723 .Case("generic", true)
7724 .Default(false);
7725 }
Craig Topper6c03a542015-10-19 04:51:35 +00007726 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7727 return llvm::makeArrayRef(BuiltinInfo,
7728 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007729 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007730 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007731 return VoidPtrBuiltinVaList;
7732 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007733 ArrayRef<const char *> getGCCRegNames() const final {
7734 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007735 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007736 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7737 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007738 }
7739 bool
7740 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007741 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007742 return false;
7743 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007744 const char *getClobbers() const final { return ""; }
7745 bool isCLZForZeroUndef() const final { return false; }
7746 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007747 IntType getIntTypeByWidth(unsigned BitWidth,
7748 bool IsSigned) const final {
7749 // WebAssembly prefers long long for explicitly 64-bit integers.
7750 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7751 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7752 }
7753 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7754 bool IsSigned) const final {
7755 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7756 return BitWidth == 64
7757 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7758 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7759 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007760};
7761
7762const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7763#define BUILTIN(ID, TYPE, ATTRS) \
7764 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7765#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7766 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7767#include "clang/Basic/BuiltinsWebAssembly.def"
7768};
7769
7770class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7771public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007772 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7773 const TargetOptions &Opts)
7774 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007775 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007776 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007777 }
7778
7779protected:
7780 void getTargetDefines(const LangOptions &Opts,
7781 MacroBuilder &Builder) const override {
7782 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7783 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7784 }
7785};
7786
7787class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7788public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007789 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7790 const TargetOptions &Opts)
7791 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007792 LongAlign = LongWidth = 64;
7793 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007794 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007795 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007796 }
7797
7798protected:
7799 void getTargetDefines(const LangOptions &Opts,
7800 MacroBuilder &Builder) const override {
7801 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7802 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7803 }
7804};
7805
JF Bastien643817d2014-09-12 17:52:47 +00007806const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7807#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007808 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007809#include "clang/Basic/BuiltinsLe64.def"
7810};
7811
Eric Christopherc48497a2015-09-18 21:26:24 +00007812static const unsigned SPIRAddrSpaceMap[] = {
7813 1, // opencl_global
7814 3, // opencl_local
7815 2, // opencl_constant
7816 4, // opencl_generic
7817 0, // cuda_device
7818 0, // cuda_constant
7819 0 // cuda_shared
7820};
7821class SPIRTargetInfo : public TargetInfo {
7822public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007823 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7824 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007825 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7826 "SPIR target must use unknown OS");
7827 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7828 "SPIR target must use unknown environment type");
7829 BigEndian = false;
7830 TLSSupported = false;
7831 LongWidth = LongAlign = 64;
7832 AddrSpaceMap = &SPIRAddrSpaceMap;
7833 UseAddrSpaceMapMangling = true;
7834 // Define available target features
7835 // These must be defined in sorted order!
7836 NoAsmVariants = true;
7837 }
7838 void getTargetDefines(const LangOptions &Opts,
7839 MacroBuilder &Builder) const override {
7840 DefineStd(Builder, "SPIR", Opts);
7841 }
7842 bool hasFeature(StringRef Feature) const override {
7843 return Feature == "spir";
7844 }
Craig Topper3164f332014-03-11 03:39:26 +00007845
Craig Topper6c03a542015-10-19 04:51:35 +00007846 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007847 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007848 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007849 bool validateAsmConstraint(const char *&Name,
7850 TargetInfo::ConstraintInfo &info) const override {
7851 return true;
7852 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007853 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7854 return None;
7855 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007856 BuiltinVaListKind getBuiltinVaListKind() const override {
7857 return TargetInfo::VoidPtrBuiltinVaList;
7858 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007859
Eric Christopherc48497a2015-09-18 21:26:24 +00007860 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7861 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7862 : CCCR_Warning;
7863 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007864
Eric Christopherc48497a2015-09-18 21:26:24 +00007865 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7866 return CC_SpirFunction;
7867 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007868
7869 void setSupportedOpenCLOpts() override {
7870 // Assume all OpenCL extensions and optional core features are supported
7871 // for SPIR since it is a generic target.
7872 getSupportedOpenCLOpts().setAll();
7873 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007874};
Guy Benyeib798fc92012-12-11 21:38:14 +00007875
Eric Christopherc48497a2015-09-18 21:26:24 +00007876class SPIR32TargetInfo : public SPIRTargetInfo {
7877public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007878 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7879 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007880 PointerWidth = PointerAlign = 32;
7881 SizeType = TargetInfo::UnsignedInt;
7882 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007883 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7884 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007885 }
7886 void getTargetDefines(const LangOptions &Opts,
7887 MacroBuilder &Builder) const override {
7888 DefineStd(Builder, "SPIR32", Opts);
7889 }
7890};
Guy Benyeib798fc92012-12-11 21:38:14 +00007891
Eric Christopherc48497a2015-09-18 21:26:24 +00007892class SPIR64TargetInfo : public SPIRTargetInfo {
7893public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007894 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7895 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007896 PointerWidth = PointerAlign = 64;
7897 SizeType = TargetInfo::UnsignedLong;
7898 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007899 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7900 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007901 }
7902 void getTargetDefines(const LangOptions &Opts,
7903 MacroBuilder &Builder) const override {
7904 DefineStd(Builder, "SPIR64", Opts);
7905 }
7906};
Guy Benyeib798fc92012-12-11 21:38:14 +00007907
Robert Lytton0e076492013-08-13 09:43:10 +00007908class XCoreTargetInfo : public TargetInfo {
7909 static const Builtin::Info BuiltinInfo[];
7910public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007911 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7912 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007913 BigEndian = false;
7914 NoAsmVariants = true;
7915 LongLongAlign = 32;
7916 SuitableAlign = 32;
7917 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007918 SizeType = UnsignedInt;
7919 PtrDiffType = SignedInt;
7920 IntPtrType = SignedInt;
7921 WCharType = UnsignedChar;
7922 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007923 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007924 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7925 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007926 }
Craig Topper3164f332014-03-11 03:39:26 +00007927 void getTargetDefines(const LangOptions &Opts,
7928 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007929 Builder.defineMacro("__XS1B__");
7930 }
Craig Topper6c03a542015-10-19 04:51:35 +00007931 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7932 return llvm::makeArrayRef(BuiltinInfo,
7933 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007934 }
Craig Topper3164f332014-03-11 03:39:26 +00007935 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007936 return TargetInfo::VoidPtrBuiltinVaList;
7937 }
Craig Topper3164f332014-03-11 03:39:26 +00007938 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007939 return "";
7940 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007941 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007942 static const char * const GCCRegNames[] = {
7943 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7944 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7945 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007946 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007947 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007948 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7949 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007950 }
Craig Topper3164f332014-03-11 03:39:26 +00007951 bool validateAsmConstraint(const char *&Name,
7952 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007953 return false;
7954 }
Craig Topper3164f332014-03-11 03:39:26 +00007955 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007956 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7957 return (RegNo < 2)? RegNo : -1;
7958 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007959 bool allowsLargerPreferedTypeAlignment() const override {
7960 return false;
7961 }
Robert Lytton0e076492013-08-13 09:43:10 +00007962};
7963
7964const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007965#define BUILTIN(ID, TYPE, ATTRS) \
7966 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7967#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7968 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007969#include "clang/Basic/BuiltinsXCore.def"
7970};
Robert Lytton0e076492013-08-13 09:43:10 +00007971
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007972// x86_32 Android target
7973class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7974public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007975 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7976 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007977 SuitableAlign = 32;
7978 LongDoubleWidth = 64;
7979 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7980 }
7981};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007982
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007983// x86_64 Android target
7984class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7985public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007986 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7987 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007988 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7989 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007990
7991 bool useFloat128ManglingForLongDouble() const override {
7992 return true;
7993 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007994};
7995} // end anonymous namespace
7996
Chris Lattner5ba61f02006-10-14 07:39:34 +00007997//===----------------------------------------------------------------------===//
7998// Driver code
7999//===----------------------------------------------------------------------===//
8000
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008001static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8002 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008003 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008004
Daniel Dunbar52322032009-08-18 05:47:58 +00008005 switch (Triple.getArch()) {
8006 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008007 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008008
Tim Northover2a0783d2014-05-30 14:14:07 +00008009 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008010 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008011
8012 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008013 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008014
Jacques Pienaard964cc22016-03-28 21:02:54 +00008015 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008016 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008017
Tim Northover2a0783d2014-05-30 14:14:07 +00008018 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008019 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008020 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008021
8022 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008023 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008024 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008025 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008026 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008027 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008028 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008029 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008030 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008031 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008032 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008033 }
8034
Christian Pirker9b019ae2014-02-25 13:51:00 +00008035 case llvm::Triple::aarch64_be:
8036 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008037 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008038 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008039 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008040 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008041 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008042 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008043 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008044 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008045 }
8046
Daniel Dunbar52322032009-08-18 05:47:58 +00008047 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008048 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008049 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008050 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008051
Daniel Dunbar52322032009-08-18 05:47:58 +00008052 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008053 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008054 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008055 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008056 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008057 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008058 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008059 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008060 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008061 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008062 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008063 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008064 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008065 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008066 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008067 case llvm::Triple::Win32:
8068 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008069 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008070 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008071 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008072 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008073 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008074 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008075 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008076 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008077 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008078 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008079 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008080 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008081 }
8082
8083 case llvm::Triple::armeb:
8084 case llvm::Triple::thumbeb:
8085 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008086 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008087
8088 switch (os) {
8089 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008090 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008091 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008092 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008093 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008094 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008095 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008096 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008097 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008098 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008099 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008100 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008101 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008102 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008103 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008104 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008105 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008106
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008107 case llvm::Triple::bpfeb:
8108 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008109 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008110
Daniel Dunbar52322032009-08-18 05:47:58 +00008111 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008112 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008113
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008114 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008115 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008116 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008117 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008118 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008119 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008120 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008121 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008122 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008123 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008124 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008125 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008126 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008127
8128 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008129 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008130 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008131 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008132 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008133 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008134 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008135 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008136 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008137 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008138 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008139 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008140 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008141 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008142 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008143
Akira Hatanakabef17452011-09-20 19:21:49 +00008144 case llvm::Triple::mips64:
8145 switch (os) {
8146 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008147 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008148 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008149 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008150 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008151 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008152 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008153 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008154 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008155 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008156 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008157 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008158 }
8159
8160 case llvm::Triple::mips64el:
8161 switch (os) {
8162 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008163 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008164 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008165 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008166 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008167 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008168 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008169 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008170 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008171 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008172 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008173 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008174 }
8175
Ivan Krasindd7403e2011-08-24 20:22:22 +00008176 case llvm::Triple::le32:
8177 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008178 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008179 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008180 default:
8181 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008182 }
8183
JF Bastien643817d2014-09-12 17:52:47 +00008184 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008185 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008186
Daniel Dunbar52322032009-08-18 05:47:58 +00008187 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008188 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008189 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008190 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008191 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008192 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008193 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008194 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008195 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008196 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008197 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008198 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008199 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008200 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008201 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008202 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008203 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008204
8205 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008206 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008207 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008208 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008209 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008210 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008211 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008212 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008213 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008214 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008215 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008216 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008217 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008218 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008219 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008220
Bill Schmidt778d3872013-07-26 01:36:11 +00008221 case llvm::Triple::ppc64le:
8222 switch (os) {
8223 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008224 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008225 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008226 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008227 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008228 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008229 }
8230
Peter Collingbournec947aae2012-05-20 23:28:41 +00008231 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008232 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008233 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008234 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008235
Tom Stellardd8e38a32015-01-06 20:34:47 +00008236 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008237 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008238 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008239
Daniel Dunbar52322032009-08-18 05:47:58 +00008240 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008241 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008242 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008243 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008244 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008245 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008246 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008247 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008248 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008249 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008250 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008251 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008252 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008253 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008254 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008255
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008256 // The 'sparcel' architecture copies all the above cases except for Solaris.
8257 case llvm::Triple::sparcel:
8258 switch (os) {
8259 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008260 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008261 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008262 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008263 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008264 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008265 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008266 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008267 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008268 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008269 }
8270
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008271 case llvm::Triple::sparcv9:
8272 switch (os) {
8273 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008274 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008275 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008276 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008277 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008278 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008279 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008280 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008281 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008282 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008283 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008284 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008285 }
8286
Ulrich Weigand47445072013-05-06 16:26:41 +00008287 case llvm::Triple::systemz:
8288 switch (os) {
8289 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008290 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008291 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008292 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008293 }
8294
Eli Friedmana9c3d712009-08-19 20:47:07 +00008295 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008296 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008297
Daniel Dunbar52322032009-08-18 05:47:58 +00008298 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008299 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008300 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008301
Daniel Dunbar52322032009-08-18 05:47:58 +00008302 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008303 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008304 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008305 case llvm::Triple::Linux: {
8306 switch (Triple.getEnvironment()) {
8307 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008308 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008309 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008310 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008311 }
8312 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008313 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008314 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008315 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008316 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008317 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008318 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008319 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008320 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008321 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008322 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008323 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008324 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008325 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008326 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008327 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008328 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008329 case llvm::Triple::Win32: {
8330 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008331 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008332 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008333 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008334 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008335 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008336 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008337 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008338 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008339 }
8340 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008341 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008342 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008343 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008344 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008345 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008346 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008347 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008348 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008349 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008350 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008351 }
8352
8353 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008354 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008355 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008356
Daniel Dunbar52322032009-08-18 05:47:58 +00008357 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008358 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008359 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008360 case llvm::Triple::Linux: {
8361 switch (Triple.getEnvironment()) {
8362 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008363 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008364 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008365 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008366 }
8367 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008368 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008370 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008371 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008372 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008373 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008374 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008375 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008376 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008377 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008378 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008379 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008380 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008381 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008382 case llvm::Triple::Win32: {
8383 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008384 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008385 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008386 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008387 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008388 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008389 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008391 }
8392 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008393 case llvm::Triple::Haiku:
8394 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008395 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008396 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008397 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008398 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008399 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008400 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008401 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008402
Douglas Katzman78d7c542015-05-12 21:18:10 +00008403 case llvm::Triple::spir: {
8404 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8405 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8406 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008407 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008408 }
8409 case llvm::Triple::spir64: {
8410 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8411 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8412 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008413 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008414 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008415 case llvm::Triple::wasm32:
8416 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8417 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008418 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008419 case llvm::Triple::wasm64:
8420 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8421 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008422 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008423 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008424}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008425
8426/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008427/// options.
Alp Toker80758082014-07-06 05:26:44 +00008428TargetInfo *
8429TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008430 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008431 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008432
8433 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008434 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008435 if (!Target) {
8436 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008437 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008438 }
Alp Toker80758082014-07-06 05:26:44 +00008439 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008440
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008441 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008442 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8443 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008444 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008445 }
8446
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008447 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008448 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8449 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008450 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008451 }
8452
Rafael Espindolaeb265472013-08-21 21:59:03 +00008453 // Set the fp math unit.
8454 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8455 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008456 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008457 }
8458
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008459 // Compute the default target features, we need the target to handle this
8460 // because features may have dependencies on one another.
8461 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008462 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8463 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008464 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008465
8466 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008467 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008468 for (const auto &F : Features)
8469 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8470
Eric Christopher3ff21b32013-10-16 21:26:26 +00008471 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008472 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008473
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008474 Target->setSupportedOpenCLOpts();
8475
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008476 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008477}