blob: 063a9be9a9586091acdab65480e73af6932f7242 [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-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 Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikove7772382009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek38591a22007-12-12 18:05:32 +000011// target triple.
Chris Lattner4b009652007-07-25 00:24:17 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner4b009652007-07-25 00:24:17 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarca3e9912009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerddae7102008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carrutha088d5b2010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarca3e9912009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedmand4011892008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar8dd8f262009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Stephen Hines176edba2014-12-01 14:53:08 -080024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar0433a022009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar8dd8f262009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattnerf54f2212009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner43954312009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie9fe8c742011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerf8a85782010-01-09 18:20:57 +000030#include <algorithm>
Stephen Hines651f13c2014-04-23 16:59:28 -070031#include <memory>
Chris Lattner4b009652007-07-25 00:24:17 +000032using namespace clang;
33
Chris Lattner4b009652007-07-25 00:24:17 +000034//===----------------------------------------------------------------------===//
35// Common code shared among targets.
36//===----------------------------------------------------------------------===//
37
Chris Lattnerc345a802009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner5f9e2722011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattnerc345a802009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikove7772382009-05-03 13:42:53 +000044
Chris Lattnerc345a802009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikove7772382009-05-03 13:42:53 +000049
Chris Lattnerc345a802009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikove7772382009-05-03 13:42:53 +000052
Chris Lattnerc345a802009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerc345a802009-03-20 16:06:38 +000055}
56
Benjamin Kramer448f68d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattnerbd00eb82008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner43954312009-08-10 19:03:04 +000068
Edwin Török36565e52009-06-30 17:10:35 +000069namespace {
Douglas Gregor937331f2009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Edwin Török36565e52009-06-30 17:10:35 +000072protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Edwin Török36565e52009-06-30 17:10:35 +000075public:
Benjamin Kramer9df08232013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -070077 void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000079 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Edwin Török2d98f9f2009-06-30 17:00:25 +000081 }
Edwin Török36565e52009-06-30 17:10:35 +000082
83};
Chris Lattnerf54f2212009-08-12 06:24:27 +000084} // end anonymous namespace
Edwin Török2d98f9f2009-06-30 17:00:25 +000085
Chris Lattner43954312009-08-10 19:03:04 +000086
Daniel Dunbareab96a22010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner5f9e2722011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilsond588f5c2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenko087c65f2012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Stephen Hines176edba2014-12-01 14:53:08 -080096 if (Opts.Sanitize.has(SanitizerKind::Address))
97 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikove7772382009-05-03 13:42:53 +000098
John McCall098df7f2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCallf85e1932011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000102
John McCallf85e1932011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregore289d812011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCallf85e1932011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +0000108
John McCallf85e1932011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCallf85e1932011-06-15 23:02:42 +0000113 }
Eric Christopher7c9adf92011-07-07 22:55:26 +0000114
Eli Friedmaneff0a422009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmaneff0a422009-06-04 23:00:29 +0000117 else
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar93f64532009-04-10 19:52:24 +0000122
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar93f64532009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson48b68a02012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000128 } else {
Bob Wilson48b68a02012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000131 }
Daniel Dunbareab96a22010-01-26 01:44:04 +0000132
Sebastian Pop9ec60df2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopher895d4222011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierd9259f32011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Stephen Hines651f13c2014-04-23 16:59:28 -0700141 // Set the appropriate OS version define.
142 if (Triple.isiOS()) {
143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
152 Str);
153 } else if (Triple.isMacOSX()) {
154 // Note that the Driver allows versions which aren't representable in the
155 // define (because we only get a single digit for the minor and micro
156 // revision numbers). So, we limit them to the maximum representable
157 // version.
158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Stephen Hines176edba2014-12-01 14:53:08 -0800159 char Str[7];
160 if (Maj < 10 || (Maj == 10 && Min < 10)) {
161 Str[0] = '0' + (Maj / 10);
162 Str[1] = '0' + (Maj % 10);
163 Str[2] = '0' + std::min(Min, 9U);
164 Str[3] = '0' + std::min(Rev, 9U);
165 Str[4] = '\0';
166 } else {
167 // Handle versions > 10.9.
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
170 Str[2] = '0' + (Min / 10);
171 Str[3] = '0' + (Min % 10);
172 Str[4] = '0' + (Rev / 10);
173 Str[5] = '0' + (Rev % 10);
174 Str[6] = '\0';
175 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700176 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar93f64532009-04-10 19:52:24 +0000177 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000178
Stephen Hines651f13c2014-04-23 16:59:28 -0700179 // Tell users about the kernel if there is one.
180 if (Triple.isOSDarwin())
181 Builder.defineMacro("__MACH__");
182
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000183 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman872996c2008-08-20 02:34:37 +0000184}
Chris Lattner4b009652007-07-25 00:24:17 +0000185
Chris Lattner43954312009-08-10 19:03:04 +0000186namespace {
Edwin Török36565e52009-06-30 17:10:35 +0000187template<typename Target>
188class DarwinTargetInfo : public OSTargetInfo<Target> {
189protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700190 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
191 MacroBuilder &Builder) const override {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000192 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000193 this->PlatformMinVersion);
Edwin Török36565e52009-06-30 17:10:35 +0000194 }
Mike Stump25cf7602009-09-09 15:08:12 +0000195
Edwin Török36565e52009-06-30 17:10:35 +0000196public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000197 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
198 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
199 this->MCountName = "\01mcount";
200 }
Edwin Török36565e52009-06-30 17:10:35 +0000201
Stephen Hines651f13c2014-04-23 16:59:28 -0700202 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner43954312009-08-10 19:03:04 +0000203 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000204 StringRef Segment, Section;
Chris Lattner43954312009-08-10 19:03:04 +0000205 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000206 bool HasTAA;
Chris Lattner43954312009-08-10 19:03:04 +0000207 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000208 TAA, HasTAA, StubSize);
Chris Lattner43954312009-08-10 19:03:04 +0000209 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000210
Stephen Hines651f13c2014-04-23 16:59:28 -0700211 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson608b5792010-06-08 22:47:50 +0000212 // FIXME: We should return 0 when building kexts.
213 return "__TEXT,__StaticInit,regular,pure_instructions";
214 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000215
John McCall41887602012-01-29 01:20:30 +0000216 /// Darwin does not support protected visibility. Darwin's "default"
217 /// is very similar to ELF's "protected"; Darwin requires a "weak"
218 /// attribute on declarations that can be dynamically replaced.
Stephen Hines651f13c2014-04-23 16:59:28 -0700219 bool hasProtectedVisibility() const override {
John McCall41887602012-01-29 01:20:30 +0000220 return false;
221 }
Edwin Török36565e52009-06-30 17:10:35 +0000222};
223
Chris Lattner43954312009-08-10 19:03:04 +0000224
Edwin Török36565e52009-06-30 17:10:35 +0000225// DragonFlyBSD Target
226template<typename Target>
227class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
228protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700229 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
230 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000231 // DragonFly defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000232 Builder.defineMacro("__DragonFly__");
233 Builder.defineMacro("__DragonFly_cc_version", "100001");
234 Builder.defineMacro("__ELF__");
235 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
236 Builder.defineMacro("__tune_i386__");
237 DefineStd(Builder, "unix", Opts);
Edwin Török36565e52009-06-30 17:10:35 +0000238 }
239public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000240 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
241 : OSTargetInfo<Target>(Triple) {
242 this->UserLabelPrefix = "";
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000243
Benjamin Kramer9df08232013-06-29 16:37:14 +0000244 switch (Triple.getArch()) {
245 default:
246 case llvm::Triple::x86:
247 case llvm::Triple::x86_64:
248 this->MCountName = ".mcount";
249 break;
250 }
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000251 }
Edwin Török36565e52009-06-30 17:10:35 +0000252};
253
254// FreeBSD Target
255template<typename Target>
256class FreeBSDTargetInfo : public OSTargetInfo<Target> {
257protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700258 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
259 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000260 // FreeBSD defines; list based off of gcc output
261
Benjamin Kramer474202f2011-10-18 10:10:08 +0000262 unsigned Release = Triple.getOSMajorVersion();
263 if (Release == 0U)
264 Release = 8;
Edwin Török36565e52009-06-30 17:10:35 +0000265
Benjamin Kramer474202f2011-10-18 10:10:08 +0000266 Builder.defineMacro("__FreeBSD__", Twine(Release));
267 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000268 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
269 DefineStd(Builder, "unix", Opts);
270 Builder.defineMacro("__ELF__");
Ed Schouten5ada7a52013-09-29 07:54:52 +0000271
272 // On FreeBSD, wchar_t contains the number of the code point as
273 // used by the character set of the locale. These character sets are
274 // not necessarily a superset of ASCII.
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700275 //
276 // FIXME: This is wrong; the macro refers to the numerical values
277 // of wchar_t *literals*, which are not locale-dependent. However,
278 // FreeBSD systems apparently depend on us getting this wrong, and
279 // setting this to 1 is conforming even if all the basic source
280 // character literals have the same encoding as char and wchar_t.
Ed Schouten5ada7a52013-09-29 07:54:52 +0000281 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Edwin Török36565e52009-06-30 17:10:35 +0000282 }
283public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000284 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
285 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000286
Benjamin Kramer9df08232013-06-29 16:37:14 +0000287 switch (Triple.getArch()) {
288 default:
289 case llvm::Triple::x86:
290 case llvm::Triple::x86_64:
291 this->MCountName = ".mcount";
292 break;
293 case llvm::Triple::mips:
294 case llvm::Triple::mipsel:
295 case llvm::Triple::ppc:
296 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000297 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000298 this->MCountName = "_mcount";
299 break;
300 case llvm::Triple::arm:
301 this->MCountName = "__mcount";
302 break;
Duncan Sandscd2cb662009-07-08 13:55:08 +0000303 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000304 }
Edwin Török36565e52009-06-30 17:10:35 +0000305};
306
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000307// GNU/kFreeBSD Target
308template<typename Target>
309class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
310protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700311 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
312 MacroBuilder &Builder) const override {
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000313 // GNU/kFreeBSD defines; list based off of gcc output
314
315 DefineStd(Builder, "unix", Opts);
316 Builder.defineMacro("__FreeBSD_kernel__");
317 Builder.defineMacro("__GLIBC__");
318 Builder.defineMacro("__ELF__");
319 if (Opts.POSIXThreads)
320 Builder.defineMacro("_REENTRANT");
321 if (Opts.CPlusPlus)
322 Builder.defineMacro("_GNU_SOURCE");
323 }
324public:
Stephen Hines176edba2014-12-01 14:53:08 -0800325 KFreeBSDTargetInfo(const llvm::Triple &Triple)
326 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000327 this->UserLabelPrefix = "";
328 }
329};
330
Chris Lattner6f4bed52010-07-07 16:01:42 +0000331// Minix Target
332template<typename Target>
333class MinixTargetInfo : public OSTargetInfo<Target> {
334protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700335 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
336 MacroBuilder &Builder) const override {
Chris Lattner6f4bed52010-07-07 16:01:42 +0000337 // Minix defines
338
339 Builder.defineMacro("__minix", "3");
340 Builder.defineMacro("_EM_WSIZE", "4");
341 Builder.defineMacro("_EM_PSIZE", "4");
342 Builder.defineMacro("_EM_SSIZE", "2");
343 Builder.defineMacro("_EM_LSIZE", "4");
344 Builder.defineMacro("_EM_FSIZE", "4");
345 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000346 Builder.defineMacro("__ELF__");
Chris Lattner6f4bed52010-07-07 16:01:42 +0000347 DefineStd(Builder, "unix", Opts);
348 }
349public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000350 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
351 this->UserLabelPrefix = "";
352 }
Chris Lattner6f4bed52010-07-07 16:01:42 +0000353};
354
Edwin Török36565e52009-06-30 17:10:35 +0000355// Linux target
356template<typename Target>
357class LinuxTargetInfo : public OSTargetInfo<Target> {
358protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700359 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
360 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000361 // Linux defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000362 DefineStd(Builder, "unix", Opts);
363 DefineStd(Builder, "linux", Opts);
364 Builder.defineMacro("__gnu_linux__");
365 Builder.defineMacro("__ELF__");
Logan Chien94a71422012-09-02 09:30:11 +0000366 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov32064032012-04-26 12:08:09 +0000367 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000368 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000369 Builder.defineMacro("_REENTRANT");
Douglas Gregor9b22a172010-04-21 05:52:38 +0000370 if (Opts.CPlusPlus)
371 Builder.defineMacro("_GNU_SOURCE");
Edwin Török36565e52009-06-30 17:10:35 +0000372 }
373public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000374 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edwin Török36565e52009-06-30 17:10:35 +0000375 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000376 this->WIntType = TargetInfo::UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -0700377
378 switch (Triple.getArch()) {
379 default:
380 break;
381 case llvm::Triple::ppc:
382 case llvm::Triple::ppc64:
383 case llvm::Triple::ppc64le:
384 this->MCountName = "_mcount";
385 break;
386 }
Edwin Török36565e52009-06-30 17:10:35 +0000387 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000388
Stephen Hines651f13c2014-04-23 16:59:28 -0700389 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000390 return ".text.startup";
391 }
Edwin Török36565e52009-06-30 17:10:35 +0000392};
393
Chris Lattner25fff082009-07-13 20:29:08 +0000394// NetBSD Target
395template<typename Target>
396class NetBSDTargetInfo : public OSTargetInfo<Target> {
397protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700398 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
399 MacroBuilder &Builder) const override {
Chris Lattner25fff082009-07-13 20:29:08 +0000400 // NetBSD defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000401 Builder.defineMacro("__NetBSD__");
402 Builder.defineMacro("__unix__");
403 Builder.defineMacro("__ELF__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000404 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000405 Builder.defineMacro("_POSIX_THREADS");
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700406
407 switch (Triple.getArch()) {
408 default:
409 break;
410 case llvm::Triple::arm:
411 case llvm::Triple::armeb:
412 case llvm::Triple::thumb:
413 case llvm::Triple::thumbeb:
414 Builder.defineMacro("__ARM_DWARF_EH__");
415 break;
416 }
Chris Lattner25fff082009-07-13 20:29:08 +0000417 }
418public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000419 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
420 this->UserLabelPrefix = "";
421 }
Chris Lattner25fff082009-07-13 20:29:08 +0000422};
423
Edwin Török36565e52009-06-30 17:10:35 +0000424// OpenBSD Target
425template<typename Target>
426class OpenBSDTargetInfo : public OSTargetInfo<Target> {
427protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700428 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
429 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000430 // OpenBSD defines; list based off of gcc output
431
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000432 Builder.defineMacro("__OpenBSD__");
433 DefineStd(Builder, "unix", Opts);
434 Builder.defineMacro("__ELF__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000435 if (Opts.POSIXThreads)
Chris Lattner4ddcf3b2012-04-25 06:12:24 +0000436 Builder.defineMacro("_REENTRANT");
Edwin Török36565e52009-06-30 17:10:35 +0000437 }
438public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000439 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
440 this->UserLabelPrefix = "";
441 this->TLSSupported = false;
Eli Friedman62d829a2011-12-15 02:15:56 +0000442
Eli Friedman62d829a2011-12-15 02:15:56 +0000443 switch (Triple.getArch()) {
444 default:
445 case llvm::Triple::x86:
446 case llvm::Triple::x86_64:
447 case llvm::Triple::arm:
Eric Christopher825d3862012-11-14 22:08:59 +0000448 case llvm::Triple::sparc:
Eli Friedman62d829a2011-12-15 02:15:56 +0000449 this->MCountName = "__mcount";
450 break;
451 case llvm::Triple::mips64:
452 case llvm::Triple::mips64el:
453 case llvm::Triple::ppc:
Eric Christopher825d3862012-11-14 22:08:59 +0000454 case llvm::Triple::sparcv9:
Eli Friedman62d829a2011-12-15 02:15:56 +0000455 this->MCountName = "_mcount";
456 break;
457 }
458 }
Edwin Török36565e52009-06-30 17:10:35 +0000459};
460
Eli Friedman42f74f22012-08-08 23:57:20 +0000461// Bitrig Target
462template<typename Target>
463class BitrigTargetInfo : public OSTargetInfo<Target> {
464protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700465 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
466 MacroBuilder &Builder) const override {
Eli Friedman42f74f22012-08-08 23:57:20 +0000467 // Bitrig defines; list based off of gcc output
468
469 Builder.defineMacro("__Bitrig__");
470 DefineStd(Builder, "unix", Opts);
471 Builder.defineMacro("__ELF__");
472 if (Opts.POSIXThreads)
473 Builder.defineMacro("_REENTRANT");
474 }
475public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000476 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
477 this->UserLabelPrefix = "";
Benjamin Kramer9df08232013-06-29 16:37:14 +0000478 this->MCountName = "__mcount";
Eli Friedman42f74f22012-08-08 23:57:20 +0000479 }
480};
481
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000482// PSP Target
483template<typename Target>
484class PSPTargetInfo : public OSTargetInfo<Target> {
485protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700486 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
487 MacroBuilder &Builder) const override {
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000488 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000489 Builder.defineMacro("PSP");
490 Builder.defineMacro("_PSP");
491 Builder.defineMacro("__psp__");
492 Builder.defineMacro("__ELF__");
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000493 }
494public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000495 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000496 this->UserLabelPrefix = "";
497 }
498};
499
John Thompsoned7bdbc2009-11-19 17:18:50 +0000500// PS3 PPU Target
501template<typename Target>
502class PS3PPUTargetInfo : public OSTargetInfo<Target> {
503protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700504 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
505 MacroBuilder &Builder) const override {
John Thompsoned7bdbc2009-11-19 17:18:50 +0000506 // PS3 PPU defines.
John Thompsonfdd2fc32010-03-25 16:18:32 +0000507 Builder.defineMacro("__PPC__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000508 Builder.defineMacro("__PPU__");
509 Builder.defineMacro("__CELLOS_LV2__");
510 Builder.defineMacro("__ELF__");
511 Builder.defineMacro("__LP32__");
John Thompson1deeb9f2010-06-24 22:44:13 +0000512 Builder.defineMacro("_ARCH_PPC64");
513 Builder.defineMacro("__powerpc64__");
John Thompsoned7bdbc2009-11-19 17:18:50 +0000514 }
515public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000516 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsoned7bdbc2009-11-19 17:18:50 +0000517 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000518 this->LongWidth = this->LongAlign = 32;
519 this->PointerWidth = this->PointerAlign = 32;
John Thompson1deeb9f2010-06-24 22:44:13 +0000520 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson1deeb9f2010-06-24 22:44:13 +0000521 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson4c3bd3f2009-12-18 14:21:08 +0000522 this->SizeType = TargetInfo::UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -0700523 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsoned7bdbc2009-11-19 17:18:50 +0000524 }
525};
526
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700527template <typename Target>
528class PS4OSTargetInfo : public OSTargetInfo<Target> {
529protected:
530 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
531 MacroBuilder &Builder) const override {
532 Builder.defineMacro("__FreeBSD__", "9");
533 Builder.defineMacro("__FreeBSD_cc_version", "900001");
534 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
535 DefineStd(Builder, "unix", Opts);
536 Builder.defineMacro("__ELF__");
537 Builder.defineMacro("__PS4__");
538 }
539public:
540 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
541 this->WCharType = this->UnsignedShort;
542
543 this->UserLabelPrefix = "";
544
545 switch (Triple.getArch()) {
546 default:
547 case llvm::Triple::x86_64:
548 this->MCountName = ".mcount";
549 break;
550 }
551 }
552};
553
Edwin Török36565e52009-06-30 17:10:35 +0000554// Solaris target
555template<typename Target>
556class SolarisTargetInfo : public OSTargetInfo<Target> {
557protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700558 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
559 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000560 DefineStd(Builder, "sun", Opts);
561 DefineStd(Builder, "unix", Opts);
562 Builder.defineMacro("__ELF__");
563 Builder.defineMacro("__svr4__");
564 Builder.defineMacro("__SVR4");
David Chisnall165329c2012-02-28 17:10:04 +0000565 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
566 // newer, but to 500 for everything else. feature_test.h has a check to
567 // ensure that you are not using C99 with an old version of X/Open or C89
Stephen Hines176edba2014-12-01 14:53:08 -0800568 // with a new version.
569 if (Opts.C99)
David Chisnall165329c2012-02-28 17:10:04 +0000570 Builder.defineMacro("_XOPEN_SOURCE", "600");
571 else
572 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnallb4f0bd62012-03-02 10:49:52 +0000573 if (Opts.CPlusPlus)
David Chisnall165329c2012-02-28 17:10:04 +0000574 Builder.defineMacro("__C99FEATURES__");
David Chisnall48fad492012-02-17 18:35:11 +0000575 Builder.defineMacro("_LARGEFILE_SOURCE");
576 Builder.defineMacro("_LARGEFILE64_SOURCE");
577 Builder.defineMacro("__EXTENSIONS__");
David Chisnall165329c2012-02-28 17:10:04 +0000578 Builder.defineMacro("_REENTRANT");
Edwin Török36565e52009-06-30 17:10:35 +0000579 }
580public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000581 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edwin Török36565e52009-06-30 17:10:35 +0000582 this->UserLabelPrefix = "";
David Chisnallfb027842012-03-28 18:04:14 +0000583 this->WCharType = this->SignedInt;
Edwin Török36565e52009-06-30 17:10:35 +0000584 // FIXME: WIntType should be SignedLong
585 }
586};
Michael J. Spencer01e70082010-10-21 05:21:48 +0000587
588// Windows target
589template<typename Target>
590class WindowsTargetInfo : public OSTargetInfo<Target> {
591protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700592 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
593 MacroBuilder &Builder) const override {
Michael J. Spencer4fb461c2010-10-21 08:22:51 +0000594 Builder.defineMacro("_WIN32");
595 }
596 void getVisualStudioDefines(const LangOptions &Opts,
597 MacroBuilder &Builder) const {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000598 if (Opts.CPlusPlus) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700599 if (Opts.RTTIData)
Michael J. Spencer01e70082010-10-21 05:21:48 +0000600 Builder.defineMacro("_CPPRTTI");
601
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700602 if (Opts.CXXExceptions)
Michael J. Spencer01e70082010-10-21 05:21:48 +0000603 Builder.defineMacro("_CPPUNWIND");
604 }
605
606 if (!Opts.CharIsSigned)
607 Builder.defineMacro("_CHAR_UNSIGNED");
608
609 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
610 // but it works for now.
611 if (Opts.POSIXThreads)
612 Builder.defineMacro("_MT");
Michael J. Spencer4fb461c2010-10-21 08:22:51 +0000613
Stephen Hines176edba2014-12-01 14:53:08 -0800614 if (Opts.MSCompatibilityVersion) {
615 Builder.defineMacro("_MSC_VER",
616 Twine(Opts.MSCompatibilityVersion / 100000));
617 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700618 // FIXME We cannot encode the revision information into 32-bits
619 Builder.defineMacro("_MSC_BUILD", Twine(1));
620 }
Michael J. Spencer01e70082010-10-21 05:21:48 +0000621
Francois Pichet62ec1f22011-09-17 17:15:52 +0000622 if (Opts.MicrosoftExt) {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000623 Builder.defineMacro("_MSC_EXTENSIONS");
624
Richard Smith80ad52f2013-01-02 11:42:31 +0000625 if (Opts.CPlusPlus11) {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000626 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
627 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
628 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
629 }
630 }
631
632 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer01e70082010-10-21 05:21:48 +0000633 }
634
Michael J. Spencer01e70082010-10-21 05:21:48 +0000635public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000636 WindowsTargetInfo(const llvm::Triple &Triple)
637 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer01e70082010-10-21 05:21:48 +0000638};
639
Derek Schuff7da46f92012-10-11 16:55:58 +0000640template <typename Target>
641class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramer9df08232013-06-29 16:37:14 +0000642protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700643 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
644 MacroBuilder &Builder) const override {
Derek Schuff7da46f92012-10-11 16:55:58 +0000645 if (Opts.POSIXThreads)
646 Builder.defineMacro("_REENTRANT");
647 if (Opts.CPlusPlus)
648 Builder.defineMacro("_GNU_SOURCE");
649
650 DefineStd(Builder, "unix", Opts);
651 Builder.defineMacro("__ELF__");
652 Builder.defineMacro("__native_client__");
653 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000654
655public:
656 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff7da46f92012-10-11 16:55:58 +0000657 this->UserLabelPrefix = "";
658 this->LongAlign = 32;
659 this->LongWidth = 32;
660 this->PointerAlign = 32;
661 this->PointerWidth = 32;
662 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff7da46f92012-10-11 16:55:58 +0000663 this->Int64Type = TargetInfo::SignedLongLong;
664 this->DoubleAlign = 64;
665 this->LongDoubleWidth = 64;
666 this->LongDoubleAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -0700667 this->LongLongWidth = 64;
668 this->LongLongAlign = 64;
Derek Schuff7da46f92012-10-11 16:55:58 +0000669 this->SizeType = TargetInfo::UnsignedInt;
670 this->PtrDiffType = TargetInfo::SignedInt;
671 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000672 // RegParmMax is inherited from the underlying architecture
Derek Schuff7da46f92012-10-11 16:55:58 +0000673 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Stephen Hines651f13c2014-04-23 16:59:28 -0700674 if (Triple.getArch() == llvm::Triple::arm) {
Stephen Hines176edba2014-12-01 14:53:08 -0800675 this->DescriptionString =
676 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Stephen Hines651f13c2014-04-23 16:59:28 -0700677 } else if (Triple.getArch() == llvm::Triple::x86) {
678 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
679 } else if (Triple.getArch() == llvm::Triple::x86_64) {
680 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
681 } else if (Triple.getArch() == llvm::Triple::mipsel) {
682 // Handled on mips' setDescriptionString.
683 } else {
684 assert(Triple.getArch() == llvm::Triple::le32);
685 this->DescriptionString = "e-p:32:32-i64:64";
686 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000687 }
688};
Mike Stump25cf7602009-09-09 15:08:12 +0000689} // end anonymous namespace.
Edwin Török36565e52009-06-30 17:10:35 +0000690
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000691//===----------------------------------------------------------------------===//
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000692// Specific target implementations.
693//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000694
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000695namespace {
696// PPC abstract base class
697class PPCTargetInfo : public TargetInfo {
698 static const Builtin::Info BuiltinInfo[];
699 static const char * const GCCRegNames[];
700 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel02a84272012-06-11 22:35:19 +0000701 std::string CPU;
Eric Christopher16543202013-10-16 21:19:26 +0000702
703 // Target cpu features.
704 bool HasVSX;
Stephen Hines176edba2014-12-01 14:53:08 -0800705 bool HasP8Vector;
706
707protected:
708 std::string ABI;
Eric Christopher16543202013-10-16 21:19:26 +0000709
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000710public:
Eric Christopher16543202013-10-16 21:19:26 +0000711 PPCTargetInfo(const llvm::Triple &Triple)
Stephen Hines176edba2014-12-01 14:53:08 -0800712 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000713 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000714 LongDoubleWidth = LongDoubleAlign = 128;
715 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
716 }
Eli Friedmand9389be2009-06-05 07:05:05 +0000717
Hal Finkel39d5fa12012-07-03 16:51:04 +0000718 /// \brief Flags for architecture specific defines.
719 typedef enum {
720 ArchDefineNone = 0,
721 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
722 ArchDefinePpcgr = 1 << 1,
723 ArchDefinePpcsq = 1 << 2,
724 ArchDefine440 = 1 << 3,
725 ArchDefine603 = 1 << 4,
726 ArchDefine604 = 1 << 5,
727 ArchDefinePwr4 = 1 << 6,
Bill Schmidt2821e182013-02-01 20:23:10 +0000728 ArchDefinePwr5 = 1 << 7,
729 ArchDefinePwr5x = 1 << 8,
730 ArchDefinePwr6 = 1 << 9,
731 ArchDefinePwr6x = 1 << 10,
732 ArchDefinePwr7 = 1 << 11,
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700733 ArchDefinePwr8 = 1 << 12,
734 ArchDefineA2 = 1 << 13,
735 ArchDefineA2q = 1 << 14
Hal Finkel39d5fa12012-07-03 16:51:04 +0000736 } ArchDefineTypes;
737
Bill Schmidt2821e182013-02-01 20:23:10 +0000738 // Note: GCC recognizes the following additional cpus:
739 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
740 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
741 // titan, rs64.
Stephen Hines651f13c2014-04-23 16:59:28 -0700742 bool setCPU(const std::string &Name) override {
Hal Finkel02a84272012-06-11 22:35:19 +0000743 bool CPUKnown = llvm::StringSwitch<bool>(Name)
744 .Case("generic", true)
745 .Case("440", true)
746 .Case("450", true)
747 .Case("601", true)
748 .Case("602", true)
749 .Case("603", true)
750 .Case("603e", true)
751 .Case("603ev", true)
752 .Case("604", true)
753 .Case("604e", true)
754 .Case("620", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000755 .Case("630", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000756 .Case("g3", true)
757 .Case("7400", true)
758 .Case("g4", true)
759 .Case("7450", true)
760 .Case("g4+", true)
761 .Case("750", true)
762 .Case("970", true)
763 .Case("g5", true)
764 .Case("a2", true)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000765 .Case("a2q", true)
Hal Finkel7de32962012-09-18 22:25:03 +0000766 .Case("e500mc", true)
767 .Case("e5500", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000768 .Case("power3", true)
769 .Case("pwr3", true)
770 .Case("power4", true)
771 .Case("pwr4", true)
772 .Case("power5", true)
773 .Case("pwr5", true)
774 .Case("power5x", true)
775 .Case("pwr5x", true)
776 .Case("power6", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000777 .Case("pwr6", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000778 .Case("power6x", true)
779 .Case("pwr6x", true)
780 .Case("power7", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000781 .Case("pwr7", true)
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700782 .Case("power8", true)
783 .Case("pwr8", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000784 .Case("powerpc", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000785 .Case("ppc", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000786 .Case("powerpc64", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000787 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000788 .Case("powerpc64le", true)
789 .Case("ppc64le", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000790 .Default(false);
791
792 if (CPUKnown)
793 CPU = Name;
794
795 return CPUKnown;
796 }
797
Stephen Hines176edba2014-12-01 14:53:08 -0800798
799 StringRef getABI() const override { return ABI; }
800
Stephen Hines651f13c2014-04-23 16:59:28 -0700801 void getTargetBuiltins(const Builtin::Info *&Records,
802 unsigned &NumRecords) const override {
Chris Lattner4b009652007-07-25 00:24:17 +0000803 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000804 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000805 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000806
Stephen Hines651f13c2014-04-23 16:59:28 -0700807 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000808
Stephen Hines651f13c2014-04-23 16:59:28 -0700809 void getTargetDefines(const LangOptions &Opts,
810 MacroBuilder &Builder) const override;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000811
Stephen Hines651f13c2014-04-23 16:59:28 -0700812 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt199402b2013-02-01 02:14:03 +0000813
Stephen Hines651f13c2014-04-23 16:59:28 -0700814 bool handleTargetFeatures(std::vector<std::string> &Features,
815 DiagnosticsEngine &Diags) override;
816 bool hasFeature(StringRef Feature) const override;
817
818 void getGCCRegNames(const char * const *&Names,
819 unsigned &NumNames) const override;
820 void getGCCRegAliases(const GCCRegAlias *&Aliases,
821 unsigned &NumAliases) const override;
822 bool validateAsmConstraint(const char *&Name,
823 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson36834a72009-02-28 17:11:49 +0000824 switch (*Name) {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000825 default: return false;
826 case 'O': // Zero
John Thompson1deeb9f2010-06-24 22:44:13 +0000827 break;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000828 case 'b': // Base register
829 case 'f': // Floating point register
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000830 Info.setAllowsRegister();
John Thompson1deeb9f2010-06-24 22:44:13 +0000831 break;
832 // FIXME: The following are added to allow parsing.
833 // I just took a guess at what the actions should be.
834 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000835 case 'd': // Floating point register (containing 64-bit value)
John Thompson1deeb9f2010-06-24 22:44:13 +0000836 case 'v': // Altivec vector register
837 Info.setAllowsRegister();
838 break;
839 case 'w':
840 switch (Name[1]) {
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000841 case 'd':// VSX vector register to hold vector double data
842 case 'f':// VSX vector register to hold vector float data
843 case 's':// VSX vector register to hold scalar float data
844 case 'a':// Any VSX register
Stephen Hines651f13c2014-04-23 16:59:28 -0700845 case 'c':// An individual CR bit
John Thompson1deeb9f2010-06-24 22:44:13 +0000846 break;
847 default:
848 return false;
849 }
850 Info.setAllowsRegister();
851 Name++; // Skip over 'w'.
852 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000853 case 'h': // `MQ', `CTR', or `LINK' register
854 case 'q': // `MQ' register
855 case 'c': // `CTR' register
856 case 'l': // `LINK' register
857 case 'x': // `CR' register (condition register) number 0
858 case 'y': // `CR' register (condition register)
859 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson1deeb9f2010-06-24 22:44:13 +0000860 Info.setAllowsRegister();
861 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000862 case 'I': // Signed 16-bit constant
John Thompson1deeb9f2010-06-24 22:44:13 +0000863 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000864 // (use `L' instead for SImode constants)
865 case 'K': // Unsigned 16-bit constant
866 case 'L': // Signed 16-bit constant shifted left 16 bits
867 case 'M': // Constant larger than 31
868 case 'N': // Exact power of 2
869 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson1deeb9f2010-06-24 22:44:13 +0000870 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000871 // register with one instruction per word
John Thompson1deeb9f2010-06-24 22:44:13 +0000872 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000873 // into a register using three instructions
John Thompson1deeb9f2010-06-24 22:44:13 +0000874 break;
875 case 'm': // Memory operand. Note that on PowerPC targets, m can
876 // include addresses that update the base register. It
877 // is therefore only safe to use `m' in an asm statement
878 // if that asm statement accesses the operand exactly once.
879 // The asm statement must also use `%U<opno>' as a
Sebastian Redl097ce222010-08-17 22:42:34 +0000880 // placeholder for the "update" flag in the corresponding
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000881 // load or store instruction. For example:
John Thompson1deeb9f2010-06-24 22:44:13 +0000882 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000883 // is correct but:
John Thompson1deeb9f2010-06-24 22:44:13 +0000884 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
885 // is not. Use es rather than m if you don't want the base
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000886 // register to be updated.
887 case 'e':
John Thompsone0a39472010-06-25 00:02:05 +0000888 if (Name[1] != 's')
889 return false;
Sebastian Redl097ce222010-08-17 22:42:34 +0000890 // es: A "stable" memory operand; that is, one which does not
John Thompson1deeb9f2010-06-24 22:44:13 +0000891 // include any automodification of the base register. Unlike
892 // `m', this constraint can be used in asm statements that
893 // might access the operand several times, or that might not
John Thompsone0a39472010-06-25 00:02:05 +0000894 // access it at all.
John Thompson1deeb9f2010-06-24 22:44:13 +0000895 Info.setAllowsMemory();
John Thompsone0a39472010-06-25 00:02:05 +0000896 Name++; // Skip over 'e'.
John Thompson1deeb9f2010-06-24 22:44:13 +0000897 break;
898 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000899 // usually better to use `m' or `es' in asm statements)
John Thompson1deeb9f2010-06-24 22:44:13 +0000900 case 'Z': // Memory operand that is an indexed or indirect from a
901 // register (it is usually better to use `m' or `es' in
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000902 // asm statements)
John Thompson1deeb9f2010-06-24 22:44:13 +0000903 Info.setAllowsMemory();
904 Info.setAllowsRegister();
905 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000906 case 'R': // AIX TOC entry
John Thompson1deeb9f2010-06-24 22:44:13 +0000907 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000908 // register (`p' is preferable for asm statements)
909 case 'S': // Constant suitable as a 64-bit mask operand
910 case 'T': // Constant suitable as a 32-bit mask operand
911 case 'U': // System V Release 4 small data area reference
John Thompson1deeb9f2010-06-24 22:44:13 +0000912 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000913 // instructions
914 case 'W': // Vector constant that does not require memory
915 case 'j': // Vector constant that is all zeros.
John Thompson1deeb9f2010-06-24 22:44:13 +0000916 break;
917 // End FIXME.
Anders Carlsson4ce42302007-11-27 04:11:28 +0000918 }
John Thompson1deeb9f2010-06-24 22:44:13 +0000919 return true;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000920 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700921 std::string convertConstraint(const char *&Constraint) const override {
922 std::string R;
923 switch (*Constraint) {
924 case 'e':
925 case 'w':
926 // Two-character constraint; add "^" hint for later parsing.
927 R = std::string("^") + std::string(Constraint, 2);
928 Constraint++;
929 break;
930 default:
931 return TargetInfo::convertConstraint(Constraint);
932 }
933 return R;
934 }
935 const char *getClobbers() const override {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000936 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000937 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700938 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanellab0fc94c2013-01-22 20:02:45 +0000939 if (RegNo == 0) return 3;
940 if (RegNo == 1) return 4;
941 return -1;
942 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000943};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000944
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000945const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000946#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000947#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000948 ALL_LANGUAGES },
Chris Lattner99ca9d62009-06-14 01:05:48 +0000949#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000950};
Anton Korobeynikove7772382009-05-03 13:42:53 +0000951
Stephen Hines176edba2014-12-01 14:53:08 -0800952/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher16543202013-10-16 21:19:26 +0000953/// configured set of features.
Eric Christopher3d11ced2013-10-16 21:26:26 +0000954bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher16543202013-10-16 21:19:26 +0000955 DiagnosticsEngine &Diags) {
Eric Christopher16543202013-10-16 21:19:26 +0000956 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
957 // Ignore disabled features.
958 if (Features[i][0] == '-')
959 continue;
960
961 StringRef Feature = StringRef(Features[i]).substr(1);
962
963 if (Feature == "vsx") {
964 HasVSX = true;
965 continue;
966 }
967
Stephen Hines176edba2014-12-01 14:53:08 -0800968 if (Feature == "power8-vector") {
969 HasP8Vector = true;
970 continue;
971 }
972
Eric Christopher16543202013-10-16 21:19:26 +0000973 // TODO: Finish this list and add an assert that we've handled them
974 // all.
975 }
976
977 return true;
978}
Anton Korobeynikove7772382009-05-03 13:42:53 +0000979
Chris Lattnerbef1d722009-03-02 22:27:17 +0000980/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
981/// #defines that are not tied to a specific subtarget.
Chris Lattner79682402009-03-20 15:52:06 +0000982void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000983 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +0000984 // Target identification.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000985 Builder.defineMacro("__ppc__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000986 Builder.defineMacro("__PPC__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000987 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerf8030412010-02-16 18:14:57 +0000988 Builder.defineMacro("__powerpc__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000989 Builder.defineMacro("__POWERPC__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000990 if (PointerWidth == 64) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000991 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerf8030412010-02-16 18:14:57 +0000992 Builder.defineMacro("__powerpc64__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000993 Builder.defineMacro("__ppc64__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000994 Builder.defineMacro("__PPC64__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000995 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000996
Chris Lattnerbef1d722009-03-02 22:27:17 +0000997 // Target properties.
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000998 if (getTriple().getArch() == llvm::Triple::ppc64le) {
999 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001000 } else {
1001 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1002 getTriple().getOS() != llvm::Triple::OpenBSD)
1003 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001004 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00001005
Stephen Hines176edba2014-12-01 14:53:08 -08001006 // ABI options.
1007 if (ABI == "elfv1")
1008 Builder.defineMacro("_CALL_ELF", "1");
1009 if (ABI == "elfv2")
1010 Builder.defineMacro("_CALL_ELF", "2");
1011
Chris Lattnerbef1d722009-03-02 22:27:17 +00001012 // Subtarget options.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001013 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1014 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikove7772382009-05-03 13:42:53 +00001015
Chris Lattnerbef1d722009-03-02 22:27:17 +00001016 // FIXME: Should be controlled by command line option.
Roman Divackyb2f6f472013-07-03 19:45:54 +00001017 if (LongDoubleWidth == 128)
1018 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencerd5513a32010-10-21 03:16:25 +00001019
John Thompsoned7bdbc2009-11-19 17:18:50 +00001020 if (Opts.AltiVec) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001021 Builder.defineMacro("__VEC__", "10206");
1022 Builder.defineMacro("__ALTIVEC__");
John Thompsoned7bdbc2009-11-19 17:18:50 +00001023 }
Hal Finkel02a84272012-06-11 22:35:19 +00001024
1025 // CPU identification.
Hal Finkel39d5fa12012-07-03 16:51:04 +00001026 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1027 .Case("440", ArchDefineName)
1028 .Case("450", ArchDefineName | ArchDefine440)
1029 .Case("601", ArchDefineName)
1030 .Case("602", ArchDefineName | ArchDefinePpcgr)
1031 .Case("603", ArchDefineName | ArchDefinePpcgr)
1032 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1033 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1034 .Case("604", ArchDefineName | ArchDefinePpcgr)
1035 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1036 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt2821e182013-02-01 20:23:10 +00001037 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001038 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1039 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1040 .Case("750", ArchDefineName | ArchDefinePpcgr)
1041 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1042 | ArchDefinePpcsq)
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001043 .Case("a2", ArchDefineA2)
1044 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt2821e182013-02-01 20:23:10 +00001045 .Case("pwr3", ArchDefinePpcgr)
1046 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1047 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
Hal Finkel39d5fa12012-07-03 16:51:04 +00001048 | ArchDefinePpcsq)
Bill Schmidt2821e182013-02-01 20:23:10 +00001049 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1050 | ArchDefinePpcgr | ArchDefinePpcsq)
1051 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1052 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1053 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1054 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1055 | ArchDefinePpcsq)
1056 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1057 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001058 | ArchDefinePpcgr | ArchDefinePpcsq)
1059 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1060 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1061 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt2821e182013-02-01 20:23:10 +00001062 .Case("power3", ArchDefinePpcgr)
1063 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1064 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1065 | ArchDefinePpcsq)
1066 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1067 | ArchDefinePpcgr | ArchDefinePpcsq)
1068 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1069 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1070 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1071 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1072 | ArchDefinePpcsq)
1073 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1074 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001075 | ArchDefinePpcgr | ArchDefinePpcsq)
1076 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1077 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1078 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001079 .Default(ArchDefineNone);
1080
1081 if (defs & ArchDefineName)
1082 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1083 if (defs & ArchDefinePpcgr)
1084 Builder.defineMacro("_ARCH_PPCGR");
1085 if (defs & ArchDefinePpcsq)
1086 Builder.defineMacro("_ARCH_PPCSQ");
1087 if (defs & ArchDefine440)
Hal Finkel02a84272012-06-11 22:35:19 +00001088 Builder.defineMacro("_ARCH_440");
Hal Finkel39d5fa12012-07-03 16:51:04 +00001089 if (defs & ArchDefine603)
1090 Builder.defineMacro("_ARCH_603");
1091 if (defs & ArchDefine604)
1092 Builder.defineMacro("_ARCH_604");
Bill Schmidt2821e182013-02-01 20:23:10 +00001093 if (defs & ArchDefinePwr4)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001094 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt2821e182013-02-01 20:23:10 +00001095 if (defs & ArchDefinePwr5)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001096 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt2821e182013-02-01 20:23:10 +00001097 if (defs & ArchDefinePwr5x)
1098 Builder.defineMacro("_ARCH_PWR5X");
1099 if (defs & ArchDefinePwr6)
Hal Finkel02a84272012-06-11 22:35:19 +00001100 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt2821e182013-02-01 20:23:10 +00001101 if (defs & ArchDefinePwr6x)
1102 Builder.defineMacro("_ARCH_PWR6X");
1103 if (defs & ArchDefinePwr7)
1104 Builder.defineMacro("_ARCH_PWR7");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001105 if (defs & ArchDefinePwr8)
1106 Builder.defineMacro("_ARCH_PWR8");
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001107 if (defs & ArchDefineA2)
1108 Builder.defineMacro("_ARCH_A2");
1109 if (defs & ArchDefineA2q) {
1110 Builder.defineMacro("_ARCH_A2Q");
1111 Builder.defineMacro("_ARCH_QP");
Hal Finkel02a84272012-06-11 22:35:19 +00001112 }
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001113
1114 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1115 Builder.defineMacro("__bg__");
1116 Builder.defineMacro("__THW_BLUEGENE__");
1117 Builder.defineMacro("__bgq__");
1118 Builder.defineMacro("__TOS_BGQ__");
1119 }
Bill Schmidt2821e182013-02-01 20:23:10 +00001120
Eric Christopher16543202013-10-16 21:19:26 +00001121 if (HasVSX)
1122 Builder.defineMacro("__VSX__");
Stephen Hines176edba2014-12-01 14:53:08 -08001123 if (HasP8Vector)
1124 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher16543202013-10-16 21:19:26 +00001125
Bill Schmidt2821e182013-02-01 20:23:10 +00001126 // FIXME: The following are not yet generated here by Clang, but are
1127 // generated by GCC:
1128 //
1129 // _SOFT_FLOAT_
1130 // __RECIP_PRECISION__
1131 // __APPLE_ALTIVEC__
Bill Schmidt2821e182013-02-01 20:23:10 +00001132 // __RECIP__
1133 // __RECIPF__
1134 // __RSQRTE__
1135 // __RSQRTEF__
1136 // _SOFT_DOUBLE_
1137 // __NO_LWSYNC__
1138 // __HAVE_BSWAP__
1139 // __LONGDOUBLE128
1140 // __CMODEL_MEDIUM__
1141 // __CMODEL_LARGE__
1142 // _CALL_SYSV
1143 // _CALL_DARWIN
1144 // __NO_FPRS__
Bill Schmidt199402b2013-02-01 02:14:03 +00001145}
1146
1147void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1148 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1149 .Case("7400", true)
1150 .Case("g4", true)
1151 .Case("7450", true)
1152 .Case("g4+", true)
1153 .Case("970", true)
1154 .Case("g5", true)
1155 .Case("pwr6", true)
1156 .Case("pwr7", true)
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001157 .Case("pwr8", true)
Bill Schmidt199402b2013-02-01 02:14:03 +00001158 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001159 .Case("ppc64le", true)
Bill Schmidt199402b2013-02-01 02:14:03 +00001160 .Default(false);
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001161
1162 Features["qpx"] = (CPU == "a2q");
Bill Schmidt199402b2013-02-01 02:14:03 +00001163}
1164
Douglas Gregore727d212012-01-30 06:38:25 +00001165bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Stephen Hines176edba2014-12-01 14:53:08 -08001166 return llvm::StringSwitch<bool>(Feature)
1167 .Case("powerpc", true)
1168 .Case("vsx", HasVSX)
1169 .Case("power8-vector", HasP8Vector)
1170 .Default(false);
Douglas Gregore727d212012-01-30 06:38:25 +00001171}
Chris Lattner9fd73612008-04-21 18:56:49 +00001172
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001173const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattner14d2bb72009-09-16 05:05:27 +00001174 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1175 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1176 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1177 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1178 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1179 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1180 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1181 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001182 "mq", "lr", "ctr", "ap",
Chris Lattner14d2bb72009-09-16 05:05:27 +00001183 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001184 "xer",
Chris Lattner14d2bb72009-09-16 05:05:27 +00001185 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1186 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1187 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1188 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001189 "vrsave", "vscr",
1190 "spe_acc", "spefscr",
1191 "sfp"
1192};
Chris Lattner4b009652007-07-25 00:24:17 +00001193
Anton Korobeynikove7772382009-05-03 13:42:53 +00001194void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001195 unsigned &NumNames) const {
1196 Names = GCCRegNames;
1197 NumNames = llvm::array_lengthof(GCCRegNames);
1198}
Chris Lattner4b009652007-07-25 00:24:17 +00001199
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001200const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1201 // While some of these aliases do map to different registers
1202 // they still share the same register name.
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001203 { { "0" }, "r0" },
1204 { { "1"}, "r1" },
1205 { { "2" }, "r2" },
1206 { { "3" }, "r3" },
1207 { { "4" }, "r4" },
1208 { { "5" }, "r5" },
1209 { { "6" }, "r6" },
1210 { { "7" }, "r7" },
1211 { { "8" }, "r8" },
1212 { { "9" }, "r9" },
1213 { { "10" }, "r10" },
1214 { { "11" }, "r11" },
1215 { { "12" }, "r12" },
1216 { { "13" }, "r13" },
1217 { { "14" }, "r14" },
1218 { { "15" }, "r15" },
1219 { { "16" }, "r16" },
1220 { { "17" }, "r17" },
1221 { { "18" }, "r18" },
1222 { { "19" }, "r19" },
1223 { { "20" }, "r20" },
1224 { { "21" }, "r21" },
1225 { { "22" }, "r22" },
1226 { { "23" }, "r23" },
1227 { { "24" }, "r24" },
1228 { { "25" }, "r25" },
1229 { { "26" }, "r26" },
1230 { { "27" }, "r27" },
1231 { { "28" }, "r28" },
1232 { { "29" }, "r29" },
1233 { { "30" }, "r30" },
1234 { { "31" }, "r31" },
1235 { { "fr0" }, "f0" },
1236 { { "fr1" }, "f1" },
1237 { { "fr2" }, "f2" },
1238 { { "fr3" }, "f3" },
1239 { { "fr4" }, "f4" },
1240 { { "fr5" }, "f5" },
1241 { { "fr6" }, "f6" },
1242 { { "fr7" }, "f7" },
1243 { { "fr8" }, "f8" },
1244 { { "fr9" }, "f9" },
Mike Stump369c21c2009-09-17 21:15:00 +00001245 { { "fr10" }, "f10" },
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001246 { { "fr11" }, "f11" },
1247 { { "fr12" }, "f12" },
1248 { { "fr13" }, "f13" },
1249 { { "fr14" }, "f14" },
1250 { { "fr15" }, "f15" },
1251 { { "fr16" }, "f16" },
1252 { { "fr17" }, "f17" },
1253 { { "fr18" }, "f18" },
1254 { { "fr19" }, "f19" },
1255 { { "fr20" }, "f20" },
1256 { { "fr21" }, "f21" },
1257 { { "fr22" }, "f22" },
1258 { { "fr23" }, "f23" },
1259 { { "fr24" }, "f24" },
1260 { { "fr25" }, "f25" },
1261 { { "fr26" }, "f26" },
1262 { { "fr27" }, "f27" },
1263 { { "fr28" }, "f28" },
1264 { { "fr29" }, "f29" },
1265 { { "fr30" }, "f30" },
1266 { { "fr31" }, "f31" },
1267 { { "cc" }, "cr0" },
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001268};
1269
Anton Korobeynikove7772382009-05-03 13:42:53 +00001270void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001271 unsigned &NumAliases) const {
1272 Aliases = GCCRegAliases;
1273 NumAliases = llvm::array_lengthof(GCCRegAliases);
1274}
1275} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00001276
1277namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001278class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00001279public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001280 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001281 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerf8030412010-02-16 18:14:57 +00001282
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001283 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +00001284 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001285 case llvm::Triple::FreeBSD:
1286 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001287 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +00001288 PtrDiffType = SignedInt;
1289 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001290 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +00001291 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001292 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001293 }
Roman Divackye3d175d2012-03-13 16:53:54 +00001294
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001295 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1296 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001297 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001298 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001299
1300 // PPC32 supports atomics up to 4 bytes.
1301 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001302 }
1303
Stephen Hines651f13c2014-04-23 16:59:28 -07001304 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001305 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Ingec5613b22012-06-16 03:34:49 +00001306 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman2b161652008-08-21 00:13:15 +00001307 }
Chris Lattner4b009652007-07-25 00:24:17 +00001308};
1309} // end anonymous namespace.
1310
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001311// Note: ABI differences may eventually require us to have a separate
1312// TargetInfo for little endian.
Chris Lattner4b009652007-07-25 00:24:17 +00001313namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001314class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00001315public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001316 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +00001317 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman38e31802009-07-01 03:36:11 +00001318 IntMaxType = SignedLong;
Eli Friedman38e31802009-07-01 03:36:11 +00001319 Int64Type = SignedLong;
Roman Divackye3d175d2012-03-13 16:53:54 +00001320
Stephen Hines176edba2014-12-01 14:53:08 -08001321 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1322 DescriptionString = "e-m:e-i64:64-n32:64";
1323 ABI = "elfv2";
1324 } else {
1325 DescriptionString = "E-m:e-i64:64-n32:64";
1326 ABI = "elfv1";
1327 }
1328
1329 switch (getTriple().getOS()) {
1330 case llvm::Triple::FreeBSD:
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001331 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001332 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Stephen Hines176edba2014-12-01 14:53:08 -08001333 break;
1334 case llvm::Triple::NetBSD:
1335 IntMaxType = SignedLongLong;
1336 Int64Type = SignedLongLong;
1337 break;
1338 default:
1339 break;
1340 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001341
1342 // PPC64 supports atomics up to 8 bytes.
1343 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnere5fde952008-05-09 06:17:04 +00001344 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001345 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00001346 return TargetInfo::CharPtrBuiltinVaList;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001347 }
Stephen Hines176edba2014-12-01 14:53:08 -08001348 // PPC64 Linux-specifc ABI options.
1349 bool setABI(const std::string &Name) override {
1350 if (Name == "elfv1" || Name == "elfv2") {
1351 ABI = Name;
1352 return true;
1353 }
1354 return false;
1355 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001356};
1357} // end anonymous namespace.
1358
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001359
1360namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001361class DarwinPPC32TargetInfo :
1362 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001363public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001364 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1365 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001366 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001367 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Stephen Hines176edba2014-12-01 14:53:08 -08001368 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001369 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001370 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07001371 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +00001372 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001373 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00001374 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001375 }
1376};
1377
1378class DarwinPPC64TargetInfo :
1379 public DarwinTargetInfo<PPC64TargetInfo> {
1380public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001381 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1382 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001383 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001384 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07001385 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001386 }
1387};
1388} // end anonymous namespace.
1389
Chris Lattner4b009652007-07-25 00:24:17 +00001390namespace {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001391 static const unsigned NVPTXAddrSpaceMap[] = {
1392 1, // opencl_global
1393 3, // opencl_local
1394 4, // opencl_constant
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001395 // FIXME: generic has to be added to the target
1396 0, // opencl_generic
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001397 1, // cuda_device
1398 4, // cuda_constant
1399 3, // cuda_shared
Justin Holewinski25bedca2011-10-03 17:28:37 +00001400 };
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001401 class NVPTXTargetInfo : public TargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001402 static const char * const GCCRegNames[];
1403 static const Builtin::Info BuiltinInfo[];
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001404
1405 // The GPU profiles supported by the NVPTX backend
1406 enum GPUKind {
1407 GK_NONE,
1408 GK_SM20,
1409 GK_SM21,
1410 GK_SM30,
1411 GK_SM35,
1412 } GPU;
1413
Justin Holewinski285dc652011-04-20 19:34:15 +00001414 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001415 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001416 BigEndian = false;
Justin Holewinski285dc652011-04-20 19:34:15 +00001417 TLSSupported = false;
1418 LongWidth = LongAlign = 64;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001419 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00001420 UseAddrSpaceMapMangling = true;
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001421 // Define available target features
Justin Holewinski2c585b92012-05-24 17:43:12 +00001422 // These must be defined in sorted order!
Justin Holewinski9903e942012-07-11 15:34:55 +00001423 NoAsmVariants = true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001424 // Set the default GPU to sm20
1425 GPU = GK_SM20;
Justin Holewinski285dc652011-04-20 19:34:15 +00001426 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001427 void getTargetDefines(const LangOptions &Opts,
1428 MacroBuilder &Builder) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001429 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001430 Builder.defineMacro("__NVPTX__");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001431 if (Opts.CUDAIsDevice) {
1432 // Set __CUDA_ARCH__ for the GPU specified.
1433 std::string CUDAArchCode;
1434 switch (GPU) {
1435 case GK_SM20:
1436 CUDAArchCode = "200";
1437 break;
1438 case GK_SM21:
1439 CUDAArchCode = "210";
1440 break;
1441 case GK_SM30:
1442 CUDAArchCode = "300";
1443 break;
1444 case GK_SM35:
1445 CUDAArchCode = "350";
1446 break;
1447 default:
1448 llvm_unreachable("Unhandled target CPU");
1449 }
1450 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1451 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001452 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001453 void getTargetBuiltins(const Builtin::Info *&Records,
1454 unsigned &NumRecords) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001455 Records = BuiltinInfo;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001456 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Justin Holewinski285dc652011-04-20 19:34:15 +00001457 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001458 bool hasFeature(StringRef Feature) const override {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001459 return Feature == "ptx" || Feature == "nvptx";
Douglas Gregore727d212012-01-30 06:38:25 +00001460 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001461
1462 void getGCCRegNames(const char * const *&Names,
1463 unsigned &NumNames) const override;
1464 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1465 unsigned &NumAliases) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001466 // No aliases.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001467 Aliases = nullptr;
Justin Holewinski285dc652011-04-20 19:34:15 +00001468 NumAliases = 0;
1469 }
Stephen Hines176edba2014-12-01 14:53:08 -08001470 bool
1471 validateAsmConstraint(const char *&Name,
1472 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski0ac428e2013-06-21 18:51:24 +00001473 switch (*Name) {
1474 default: return false;
1475 case 'c':
1476 case 'h':
1477 case 'r':
1478 case 'l':
1479 case 'f':
1480 case 'd':
1481 Info.setAllowsRegister();
1482 return true;
1483 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001484 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001485 const char *getClobbers() const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001486 // FIXME: Is this really right?
1487 return "";
1488 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001489 BuiltinVaListKind getBuiltinVaListKind() const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001490 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00001491 return TargetInfo::CharPtrBuiltinVaList;
Justin Holewinski285dc652011-04-20 19:34:15 +00001492 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001493 bool setCPU(const std::string &Name) override {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001494 GPU = llvm::StringSwitch<GPUKind>(Name)
1495 .Case("sm_20", GK_SM20)
1496 .Case("sm_21", GK_SM21)
1497 .Case("sm_30", GK_SM30)
1498 .Case("sm_35", GK_SM35)
1499 .Default(GK_NONE);
Justin Holewinskiaffa3af2013-03-30 14:38:26 +00001500
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001501 return GPU != GK_NONE;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001502 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001503 };
1504
Justin Holewinski2c585b92012-05-24 17:43:12 +00001505 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001506#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +00001507#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001508 ALL_LANGUAGES },
Justin Holewinski2c585b92012-05-24 17:43:12 +00001509#include "clang/Basic/BuiltinsNVPTX.def"
Justin Holewinski285dc652011-04-20 19:34:15 +00001510 };
1511
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001512 const char * const NVPTXTargetInfo::GCCRegNames[] = {
Justin Holewinski285dc652011-04-20 19:34:15 +00001513 "r0"
1514 };
1515
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001516 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
Justin Holewinski285dc652011-04-20 19:34:15 +00001517 unsigned &NumNames) const {
1518 Names = GCCRegNames;
1519 NumNames = llvm::array_lengthof(GCCRegNames);
1520 }
1521
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001522 class NVPTX32TargetInfo : public NVPTXTargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001523 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001524 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Justin Holewinski285dc652011-04-20 19:34:15 +00001525 PointerWidth = PointerAlign = 32;
Stephen Hines176edba2014-12-01 14:53:08 -08001526 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1527 IntPtrType = TargetInfo::SignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -07001528 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001529 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001530 };
1531
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001532 class NVPTX64TargetInfo : public NVPTXTargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001533 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001534 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Justin Holewinski285dc652011-04-20 19:34:15 +00001535 PointerWidth = PointerAlign = 64;
Stephen Hines176edba2014-12-01 14:53:08 -08001536 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1537 IntPtrType = TargetInfo::SignedLongLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07001538 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001539 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001540 };
1541}
1542
1543namespace {
Eli Friedman6505a292012-10-12 23:32:00 +00001544
1545static const unsigned R600AddrSpaceMap[] = {
1546 1, // opencl_global
1547 3, // opencl_local
1548 2, // opencl_constant
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001549 4, // opencl_generic
Eli Friedman6505a292012-10-12 23:32:00 +00001550 1, // cuda_device
1551 2, // cuda_constant
1552 3 // cuda_shared
1553};
1554
Stephen Hines176edba2014-12-01 14:53:08 -08001555// If you edit the description strings, make sure you update
1556// getPointerWidthV().
1557
Tom Stellardfd075912013-03-04 17:40:53 +00001558static const char *DescriptionStringR600 =
Stephen Hines651f13c2014-04-23 16:59:28 -07001559 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1560 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001561
1562static const char *DescriptionStringR600DoubleOps =
Stephen Hines651f13c2014-04-23 16:59:28 -07001563 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1564 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001565
1566static const char *DescriptionStringSI =
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001567 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Stephen Hines651f13c2014-04-23 16:59:28 -07001568 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1569 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001570
Eli Friedman6505a292012-10-12 23:32:00 +00001571class R600TargetInfo : public TargetInfo {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001572 static const Builtin::Info BuiltinInfo[];
1573
Tom Stellardfd075912013-03-04 17:40:53 +00001574 /// \brief The GPU profiles supported by the R600 target.
1575 enum GPUKind {
1576 GK_NONE,
1577 GK_R600,
1578 GK_R600_DOUBLE_OPS,
1579 GK_R700,
1580 GK_R700_DOUBLE_OPS,
1581 GK_EVERGREEN,
1582 GK_EVERGREEN_DOUBLE_OPS,
1583 GK_NORTHERN_ISLANDS,
1584 GK_CAYMAN,
Tom Stellard42317042013-10-29 16:38:29 +00001585 GK_SOUTHERN_ISLANDS,
1586 GK_SEA_ISLANDS
Tom Stellardfd075912013-03-04 17:40:53 +00001587 } GPU;
1588
Eli Friedman6505a292012-10-12 23:32:00 +00001589public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001590 R600TargetInfo(const llvm::Triple &Triple)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001591 : TargetInfo(Triple) {
1592
1593 if (Triple.getArch() == llvm::Triple::amdgcn) {
1594 DescriptionString = DescriptionStringSI;
1595 GPU = GK_SOUTHERN_ISLANDS;
1596 } else {
1597 DescriptionString = DescriptionStringR600;
1598 GPU = GK_R600;
1599 }
Eli Friedman6505a292012-10-12 23:32:00 +00001600 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00001601 UseAddrSpaceMapMangling = true;
Eli Friedman6505a292012-10-12 23:32:00 +00001602 }
1603
Stephen Hines176edba2014-12-01 14:53:08 -08001604 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1605 if (GPU <= GK_CAYMAN)
1606 return 32;
1607
1608 switch(AddrSpace) {
1609 default:
1610 return 64;
1611 case 0:
1612 case 3:
1613 case 5:
1614 return 32;
1615 }
1616 }
1617
Stephen Hines651f13c2014-04-23 16:59:28 -07001618 const char * getClobbers() const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001619 return "";
1620 }
1621
Stephen Hines651f13c2014-04-23 16:59:28 -07001622 void getGCCRegNames(const char * const *&Names,
1623 unsigned &numNames) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001624 Names = nullptr;
Eli Friedman6505a292012-10-12 23:32:00 +00001625 numNames = 0;
1626 }
1627
Stephen Hines651f13c2014-04-23 16:59:28 -07001628 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1629 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001630 Aliases = nullptr;
Eli Friedman6505a292012-10-12 23:32:00 +00001631 NumAliases = 0;
1632 }
1633
Stephen Hines651f13c2014-04-23 16:59:28 -07001634 bool validateAsmConstraint(const char *&Name,
1635 TargetInfo::ConstraintInfo &info) const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001636 return true;
1637 }
1638
Stephen Hines651f13c2014-04-23 16:59:28 -07001639 void getTargetBuiltins(const Builtin::Info *&Records,
1640 unsigned &NumRecords) const override {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001641 Records = BuiltinInfo;
1642 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedman6505a292012-10-12 23:32:00 +00001643 }
1644
Stephen Hines651f13c2014-04-23 16:59:28 -07001645 void getTargetDefines(const LangOptions &Opts,
1646 MacroBuilder &Builder) const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001647 Builder.defineMacro("__R600__");
1648 }
1649
Stephen Hines651f13c2014-04-23 16:59:28 -07001650 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001651 return TargetInfo::CharPtrBuiltinVaList;
1652 }
1653
Stephen Hines651f13c2014-04-23 16:59:28 -07001654 bool setCPU(const std::string &Name) override {
Tom Stellardfd075912013-03-04 17:40:53 +00001655 GPU = llvm::StringSwitch<GPUKind>(Name)
1656 .Case("r600" , GK_R600)
1657 .Case("rv610", GK_R600)
1658 .Case("rv620", GK_R600)
1659 .Case("rv630", GK_R600)
1660 .Case("rv635", GK_R600)
1661 .Case("rs780", GK_R600)
1662 .Case("rs880", GK_R600)
1663 .Case("rv670", GK_R600_DOUBLE_OPS)
1664 .Case("rv710", GK_R700)
1665 .Case("rv730", GK_R700)
1666 .Case("rv740", GK_R700_DOUBLE_OPS)
1667 .Case("rv770", GK_R700_DOUBLE_OPS)
1668 .Case("palm", GK_EVERGREEN)
1669 .Case("cedar", GK_EVERGREEN)
1670 .Case("sumo", GK_EVERGREEN)
1671 .Case("sumo2", GK_EVERGREEN)
1672 .Case("redwood", GK_EVERGREEN)
1673 .Case("juniper", GK_EVERGREEN)
1674 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1675 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1676 .Case("barts", GK_NORTHERN_ISLANDS)
1677 .Case("turks", GK_NORTHERN_ISLANDS)
1678 .Case("caicos", GK_NORTHERN_ISLANDS)
1679 .Case("cayman", GK_CAYMAN)
1680 .Case("aruba", GK_CAYMAN)
Tom Stellard3b848ec2013-04-01 20:56:49 +00001681 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001682 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1683 .Case("verde", GK_SOUTHERN_ISLANDS)
1684 .Case("oland", GK_SOUTHERN_ISLANDS)
Stephen Hines176edba2014-12-01 14:53:08 -08001685 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard42317042013-10-29 16:38:29 +00001686 .Case("bonaire", GK_SEA_ISLANDS)
1687 .Case("kabini", GK_SEA_ISLANDS)
1688 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard0de6bc82013-11-14 23:45:53 +00001689 .Case("hawaii", GK_SEA_ISLANDS)
Stephen Hines176edba2014-12-01 14:53:08 -08001690 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001691 .Default(GK_NONE);
1692
1693 if (GPU == GK_NONE) {
1694 return false;
1695 }
1696
1697 // Set the correct data layout
1698 switch (GPU) {
1699 case GK_NONE:
1700 case GK_R600:
1701 case GK_R700:
1702 case GK_EVERGREEN:
1703 case GK_NORTHERN_ISLANDS:
1704 DescriptionString = DescriptionStringR600;
1705 break;
1706 case GK_R600_DOUBLE_OPS:
1707 case GK_R700_DOUBLE_OPS:
1708 case GK_EVERGREEN_DOUBLE_OPS:
1709 case GK_CAYMAN:
1710 DescriptionString = DescriptionStringR600DoubleOps;
1711 break;
1712 case GK_SOUTHERN_ISLANDS:
Tom Stellard42317042013-10-29 16:38:29 +00001713 case GK_SEA_ISLANDS:
Tom Stellardfd075912013-03-04 17:40:53 +00001714 DescriptionString = DescriptionStringSI;
1715 break;
1716 }
1717
1718 return true;
1719 }
Eli Friedman6505a292012-10-12 23:32:00 +00001720};
1721
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001722const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1723#define BUILTIN(ID, TYPE, ATTRS) \
1724 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1725#include "clang/Basic/BuiltinsR600.def"
1726};
1727
Eli Friedman6505a292012-10-12 23:32:00 +00001728} // end anonymous namespace
1729
1730namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00001731// Namespace for x86 abstract base class
1732const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001733#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001734#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001735 ALL_LANGUAGES },
Chris Lattner99ca9d62009-06-14 01:05:48 +00001736#include "clang/Basic/BuiltinsX86.def"
Eli Friedman872996c2008-08-20 02:34:37 +00001737};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001738
Nuno Lopesad1010d2009-12-23 17:49:57 +00001739static const char* const GCCRegNames[] = {
Eli Friedman872996c2008-08-20 02:34:37 +00001740 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1741 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001742 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman872996c2008-08-20 02:34:37 +00001743 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1744 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1745 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001746 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001747 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1748 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman872996c2008-08-20 02:34:37 +00001749};
1750
Eric Christophercfd323d2011-06-21 00:05:20 +00001751const TargetInfo::AddlRegName AddlRegNames[] = {
1752 { { "al", "ah", "eax", "rax" }, 0 },
1753 { { "bl", "bh", "ebx", "rbx" }, 3 },
1754 { { "cl", "ch", "ecx", "rcx" }, 2 },
1755 { { "dl", "dh", "edx", "rdx" }, 1 },
1756 { { "esi", "rsi" }, 4 },
1757 { { "edi", "rdi" }, 5 },
1758 { { "esp", "rsp" }, 7 },
1759 { { "ebp", "rbp" }, 6 },
Eli Friedman872996c2008-08-20 02:34:37 +00001760};
1761
1762// X86 target abstract base class; x86-32 and x86-64 are very close, so
1763// most of the implementation can be shared.
1764class X86TargetInfo : public TargetInfo {
Chris Lattner715fe4c2009-03-02 22:40:39 +00001765 enum X86SSEEnum {
Craig Topperb7a95d22013-08-21 03:59:22 +00001766 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner715fe4c2009-03-02 22:40:39 +00001767 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001768 enum MMX3DNowEnum {
1769 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1770 } MMX3DNowLevel;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001771 enum XOPEnum {
1772 NoXOP,
1773 SSE4A,
1774 FMA4,
1775 XOP
1776 } XOPLevel;
Anders Carlssone5e222f2010-01-27 03:47:49 +00001777
Eric Christopher6c4e7872010-04-02 23:50:19 +00001778 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001779 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001780 bool HasLZCNT;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001781 bool HasRDRND;
Stephen Hines176edba2014-12-01 14:53:08 -08001782 bool HasFSGSBASE;
Craig Topper31ceea02011-12-25 05:06:45 +00001783 bool HasBMI;
1784 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001785 bool HasPOPCNT;
Michael Liao463eb892012-11-10 05:17:46 +00001786 bool HasRTM;
Michael Liao72339a02013-03-26 17:52:08 +00001787 bool HasPRFCHW;
Michael Liao1bfc28c2013-03-29 05:17:55 +00001788 bool HasRDSEED;
Stephen Hines176edba2014-12-01 14:53:08 -08001789 bool HasADX;
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00001790 bool HasTBM;
Craig Topper2ae95072012-06-03 21:46:30 +00001791 bool HasFMA;
Manman Ren146e5a42012-10-11 00:59:55 +00001792 bool HasF16C;
Stephen Hines176edba2014-12-01 14:53:08 -08001793 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1794 HasAVX512VL;
Ben Langmuirb83f5a72013-09-19 13:22:04 +00001795 bool HasSHA;
Nick Lewyckyaf945462013-10-05 20:14:27 +00001796 bool HasCX16;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00001797
Chandler Carruth499d9722011-09-28 08:55:34 +00001798 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1799 ///
1800 /// Each enumeration represents a particular CPU supported by Clang. These
1801 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1802 enum CPUKind {
1803 CK_Generic,
1804
1805 /// \name i386
1806 /// i386-generation processors.
1807 //@{
1808 CK_i386,
1809 //@}
1810
1811 /// \name i486
1812 /// i486-generation processors.
1813 //@{
1814 CK_i486,
1815 CK_WinChipC6,
1816 CK_WinChip2,
1817 CK_C3,
1818 //@}
1819
1820 /// \name i586
1821 /// i586-generation processors, P5 microarchitecture based.
1822 //@{
1823 CK_i586,
1824 CK_Pentium,
1825 CK_PentiumMMX,
1826 //@}
1827
1828 /// \name i686
1829 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1830 //@{
1831 CK_i686,
1832 CK_PentiumPro,
1833 CK_Pentium2,
1834 CK_Pentium3,
1835 CK_Pentium3M,
1836 CK_PentiumM,
1837 CK_C3_2,
1838
1839 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1840 /// Clang however has some logic to suport this.
1841 // FIXME: Warn, deprecate, and potentially remove this.
1842 CK_Yonah,
1843 //@}
1844
1845 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001846 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001847 //@{
1848 CK_Pentium4,
1849 CK_Pentium4M,
1850 CK_Prescott,
1851 CK_Nocona,
1852 //@}
1853
1854 /// \name Core
1855 /// Core microarchitecture based processors.
1856 //@{
1857 CK_Core2,
1858
1859 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1860 /// codename which GCC no longer accepts as an option to -march, but Clang
1861 /// has some logic for recognizing it.
1862 // FIXME: Warn, deprecate, and potentially remove this.
1863 CK_Penryn,
1864 //@}
1865
1866 /// \name Atom
1867 /// Atom processors
1868 //@{
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001869 CK_Bonnell,
Preston Gurdc57ea682013-09-13 19:27:17 +00001870 CK_Silvermont,
Chandler Carruth499d9722011-09-28 08:55:34 +00001871 //@}
1872
1873 /// \name Nehalem
1874 /// Nehalem microarchitecture based processors.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001875 CK_Nehalem,
1876
1877 /// \name Westmere
1878 /// Westmere microarchitecture based processors.
1879 CK_Westmere,
1880
1881 /// \name Sandy Bridge
1882 /// Sandy Bridge microarchitecture based processors.
1883 CK_SandyBridge,
1884
1885 /// \name Ivy Bridge
1886 /// Ivy Bridge microarchitecture based processors.
1887 CK_IvyBridge,
1888
1889 /// \name Haswell
1890 /// Haswell microarchitecture based processors.
1891 CK_Haswell,
1892
1893 /// \name Broadwell
1894 /// Broadwell microarchitecture based processors.
Stephen Hines176edba2014-12-01 14:53:08 -08001895 CK_Broadwell,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001896
1897 /// \name Skylake
1898 /// Skylake microarchitecture based processors.
1899 CK_Skylake,
Chandler Carruth499d9722011-09-28 08:55:34 +00001900
Craig Topper10c2c682013-08-20 07:09:39 +00001901 /// \name Knights Landing
1902 /// Knights Landing processor.
1903 CK_KNL,
1904
Chandler Carruth499d9722011-09-28 08:55:34 +00001905 /// \name K6
1906 /// K6 architecture processors.
1907 //@{
1908 CK_K6,
1909 CK_K6_2,
1910 CK_K6_3,
1911 //@}
1912
1913 /// \name K7
1914 /// K7 architecture processors.
1915 //@{
1916 CK_Athlon,
1917 CK_AthlonThunderbird,
1918 CK_Athlon4,
1919 CK_AthlonXP,
1920 CK_AthlonMP,
1921 //@}
1922
1923 /// \name K8
1924 /// K8 architecture processors.
1925 //@{
1926 CK_Athlon64,
1927 CK_Athlon64SSE3,
1928 CK_AthlonFX,
1929 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001930 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001931 CK_Opteron,
1932 CK_OpteronSSE3,
Roman Divackyf051cde2011-10-30 07:48:46 +00001933 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001934 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001935
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001936 /// \name Bobcat
1937 /// Bobcat architecture processors.
1938 //@{
1939 CK_BTVER1,
Benjamin Kramer63063f52013-05-03 10:47:15 +00001940 CK_BTVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001941 //@}
1942
1943 /// \name Bulldozer
1944 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001945 //@{
1946 CK_BDVER1,
1947 CK_BDVER2,
Benjamin Kramera2420962013-11-04 10:29:51 +00001948 CK_BDVER3,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001949 CK_BDVER4,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001950 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001951
Chandler Carruth499d9722011-09-28 08:55:34 +00001952 /// This specification is deprecated and will be removed in the future.
1953 /// Users should prefer \see CK_K8.
1954 // FIXME: Warn on this when the CPU is set to it.
Stephen Hines176edba2014-12-01 14:53:08 -08001955 //@{
Chandler Carruth499d9722011-09-28 08:55:34 +00001956 CK_x86_64,
1957 //@}
1958
1959 /// \name Geode
1960 /// Geode processors.
1961 //@{
1962 CK_Geode
1963 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001964 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001965
Rafael Espindola5389b842013-08-21 21:59:03 +00001966 enum FPMathKind {
1967 FP_Default,
1968 FP_SSE,
1969 FP_387
1970 } FPMath;
1971
Eli Friedman872996c2008-08-20 02:34:37 +00001972public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001973 X86TargetInfo(const llvm::Triple &Triple)
1974 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001975 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Stephen Hines176edba2014-12-01 14:53:08 -08001976 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1977 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1978 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1979 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1980 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1981 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001982 BigEndian = false;
Eli Friedman872996c2008-08-20 02:34:37 +00001983 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +00001984 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001985 unsigned getFloatEvalMethod() const override {
Benjamin Kramerb4066692011-12-28 15:47:06 +00001986 // X87 evaluates with 80 bits "long double" precision.
1987 return SSELevel == NoSSE ? 2 : 0;
1988 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001989 void getTargetBuiltins(const Builtin::Info *&Records,
1990 unsigned &NumRecords) const override {
Eli Friedman872996c2008-08-20 02:34:37 +00001991 Records = BuiltinInfo;
1992 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +00001993 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001994 void getGCCRegNames(const char * const *&Names,
1995 unsigned &NumNames) const override {
Eli Friedman872996c2008-08-20 02:34:37 +00001996 Names = GCCRegNames;
1997 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +00001998 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001999 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2000 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002001 Aliases = nullptr;
Eric Christophercfd323d2011-06-21 00:05:20 +00002002 NumAliases = 0;
2003 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002004 void getGCCAddlRegNames(const AddlRegName *&Names,
2005 unsigned &NumNames) const override {
Eric Christophercfd323d2011-06-21 00:05:20 +00002006 Names = AddlRegNames;
2007 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +00002008 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002009 bool validateAsmConstraint(const char *&Name,
Stephen Hines176edba2014-12-01 14:53:08 -08002010 TargetInfo::ConstraintInfo &info) const override;
2011
2012 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2013
2014 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2015
2016 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2017
Stephen Hines651f13c2014-04-23 16:59:28 -07002018 std::string convertConstraint(const char *&Constraint) const override;
2019 const char *getClobbers() const override {
Eli Friedman872996c2008-08-20 02:34:37 +00002020 return "~{dirflag},~{fpsr},~{flags}";
2021 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002022 void getTargetDefines(const LangOptions &Opts,
2023 MacroBuilder &Builder) const override;
Craig Topper319d81f2013-09-17 04:12:55 +00002024 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2025 bool Enabled);
2026 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2027 bool Enabled);
2028 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2029 bool Enabled);
Stephen Hines651f13c2014-04-23 16:59:28 -07002030 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2031 StringRef Name, bool Enabled) const override {
Craig Topper85bfef62013-09-17 04:51:29 +00002032 setFeatureEnabledImpl(Features, Name, Enabled);
2033 }
2034 // This exists purely to cut down on the number of virtual calls in
2035 // getDefaultFeatures which calls this repeatedly.
2036 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2037 StringRef Name, bool Enabled);
Stephen Hines651f13c2014-04-23 16:59:28 -07002038 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2039 bool hasFeature(StringRef Feature) const override;
2040 bool handleTargetFeatures(std::vector<std::string> &Features,
2041 DiagnosticsEngine &Diags) override;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07002042 StringRef getABI() const override {
Derek Schuffbabaf312012-10-11 15:52:22 +00002043 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00002044 return "avx";
Derek Schuffbabaf312012-10-11 15:52:22 +00002045 else if (getTriple().getArch() == llvm::Triple::x86 &&
2046 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanee1ad992011-12-02 00:11:43 +00002047 return "no-mmx";
2048 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002049 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002050 bool setCPU(const std::string &Name) override {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002051 CPU = llvm::StringSwitch<CPUKind>(Name)
2052 .Case("i386", CK_i386)
2053 .Case("i486", CK_i486)
2054 .Case("winchip-c6", CK_WinChipC6)
2055 .Case("winchip2", CK_WinChip2)
2056 .Case("c3", CK_C3)
2057 .Case("i586", CK_i586)
2058 .Case("pentium", CK_Pentium)
2059 .Case("pentium-mmx", CK_PentiumMMX)
2060 .Case("i686", CK_i686)
2061 .Case("pentiumpro", CK_PentiumPro)
2062 .Case("pentium2", CK_Pentium2)
2063 .Case("pentium3", CK_Pentium3)
2064 .Case("pentium3m", CK_Pentium3M)
2065 .Case("pentium-m", CK_PentiumM)
2066 .Case("c3-2", CK_C3_2)
2067 .Case("yonah", CK_Yonah)
2068 .Case("pentium4", CK_Pentium4)
2069 .Case("pentium4m", CK_Pentium4M)
2070 .Case("prescott", CK_Prescott)
2071 .Case("nocona", CK_Nocona)
2072 .Case("core2", CK_Core2)
2073 .Case("penryn", CK_Penryn)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002074 .Case("bonnell", CK_Bonnell)
2075 .Case("atom", CK_Bonnell) // Legacy name.
2076 .Case("silvermont", CK_Silvermont)
2077 .Case("slm", CK_Silvermont) // Legacy name.
2078 .Case("nehalem", CK_Nehalem)
2079 .Case("corei7", CK_Nehalem) // Legacy name.
2080 .Case("westmere", CK_Westmere)
2081 .Case("sandybridge", CK_SandyBridge)
2082 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2083 .Case("ivybridge", CK_IvyBridge)
2084 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2085 .Case("haswell", CK_Haswell)
2086 .Case("core-avx2", CK_Haswell) // Legacy name.
Stephen Hines176edba2014-12-01 14:53:08 -08002087 .Case("broadwell", CK_Broadwell)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002088 .Case("skylake", CK_Skylake)
2089 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper10c2c682013-08-20 07:09:39 +00002090 .Case("knl", CK_KNL)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002091 .Case("k6", CK_K6)
2092 .Case("k6-2", CK_K6_2)
2093 .Case("k6-3", CK_K6_3)
2094 .Case("athlon", CK_Athlon)
2095 .Case("athlon-tbird", CK_AthlonThunderbird)
2096 .Case("athlon-4", CK_Athlon4)
2097 .Case("athlon-xp", CK_AthlonXP)
2098 .Case("athlon-mp", CK_AthlonMP)
2099 .Case("athlon64", CK_Athlon64)
2100 .Case("athlon64-sse3", CK_Athlon64SSE3)
2101 .Case("athlon-fx", CK_AthlonFX)
2102 .Case("k8", CK_K8)
2103 .Case("k8-sse3", CK_K8SSE3)
2104 .Case("opteron", CK_Opteron)
2105 .Case("opteron-sse3", CK_OpteronSSE3)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002106 .Case("barcelona", CK_AMDFAM10)
Roman Divackyf051cde2011-10-30 07:48:46 +00002107 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002108 .Case("btver1", CK_BTVER1)
Benjamin Kramer63063f52013-05-03 10:47:15 +00002109 .Case("btver2", CK_BTVER2)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002110 .Case("bdver1", CK_BDVER1)
2111 .Case("bdver2", CK_BDVER2)
Benjamin Kramera2420962013-11-04 10:29:51 +00002112 .Case("bdver3", CK_BDVER3)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002113 .Case("bdver4", CK_BDVER4)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002114 .Case("x86-64", CK_x86_64)
2115 .Case("geode", CK_Geode)
2116 .Default(CK_Generic);
2117
Chandler Carruth26a39142011-09-28 09:45:08 +00002118 // Perform any per-CPU checks necessary to determine if this CPU is
2119 // acceptable.
2120 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2121 // invalid without explaining *why*.
2122 switch (CPU) {
2123 case CK_Generic:
2124 // No processor selected!
2125 return false;
2126
2127 case CK_i386:
2128 case CK_i486:
2129 case CK_WinChipC6:
2130 case CK_WinChip2:
2131 case CK_C3:
2132 case CK_i586:
2133 case CK_Pentium:
2134 case CK_PentiumMMX:
2135 case CK_i686:
2136 case CK_PentiumPro:
2137 case CK_Pentium2:
2138 case CK_Pentium3:
2139 case CK_Pentium3M:
2140 case CK_PentiumM:
2141 case CK_Yonah:
2142 case CK_C3_2:
2143 case CK_Pentium4:
2144 case CK_Pentium4M:
2145 case CK_Prescott:
2146 case CK_K6:
2147 case CK_K6_2:
2148 case CK_K6_3:
2149 case CK_Athlon:
2150 case CK_AthlonThunderbird:
2151 case CK_Athlon4:
2152 case CK_AthlonXP:
2153 case CK_AthlonMP:
2154 case CK_Geode:
2155 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffbabaf312012-10-11 15:52:22 +00002156 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth26a39142011-09-28 09:45:08 +00002157 return false;
2158
2159 // Fallthrough
2160 case CK_Nocona:
2161 case CK_Core2:
2162 case CK_Penryn:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002163 case CK_Bonnell:
Preston Gurdc57ea682013-09-13 19:27:17 +00002164 case CK_Silvermont:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002165 case CK_Nehalem:
2166 case CK_Westmere:
2167 case CK_SandyBridge:
2168 case CK_IvyBridge:
2169 case CK_Haswell:
Stephen Hines176edba2014-12-01 14:53:08 -08002170 case CK_Broadwell:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002171 case CK_Skylake:
Craig Topper10c2c682013-08-20 07:09:39 +00002172 case CK_KNL:
Chandler Carruth26a39142011-09-28 09:45:08 +00002173 case CK_Athlon64:
2174 case CK_Athlon64SSE3:
2175 case CK_AthlonFX:
2176 case CK_K8:
2177 case CK_K8SSE3:
2178 case CK_Opteron:
2179 case CK_OpteronSSE3:
Roman Divackyf051cde2011-10-30 07:48:46 +00002180 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002181 case CK_BTVER1:
Benjamin Kramer63063f52013-05-03 10:47:15 +00002182 case CK_BTVER2:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002183 case CK_BDVER1:
2184 case CK_BDVER2:
Benjamin Kramera2420962013-11-04 10:29:51 +00002185 case CK_BDVER3:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002186 case CK_BDVER4:
Chandler Carruth26a39142011-09-28 09:45:08 +00002187 case CK_x86_64:
2188 return true;
2189 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00002190 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002191 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00002192
Stephen Hines651f13c2014-04-23 16:59:28 -07002193 bool setFPMath(StringRef Name) override;
Rafael Espindola5389b842013-08-21 21:59:03 +00002194
Stephen Hines651f13c2014-04-23 16:59:28 -07002195 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballman82bfa192012-10-02 14:26:08 +00002196 // We accept all non-ARM calling conventions
2197 return (CC == CC_X86ThisCall ||
2198 CC == CC_X86FastCall ||
Stephen Hines176edba2014-12-01 14:53:08 -08002199 CC == CC_X86StdCall ||
2200 CC == CC_X86VectorCall ||
2201 CC == CC_C ||
Guy Benyei38980082012-12-25 08:53:55 +00002202 CC == CC_X86Pascal ||
2203 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002204 }
2205
Stephen Hines651f13c2014-04-23 16:59:28 -07002206 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballmanfff32482012-12-09 17:45:41 +00002207 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002208 }
Chris Lattner4b009652007-07-25 00:24:17 +00002209};
Chris Lattner7d6220c2009-03-02 22:20:04 +00002210
Rafael Espindola5389b842013-08-21 21:59:03 +00002211bool X86TargetInfo::setFPMath(StringRef Name) {
2212 if (Name == "387") {
2213 FPMath = FP_387;
2214 return true;
2215 }
2216 if (Name == "sse") {
2217 FPMath = FP_SSE;
2218 return true;
2219 }
2220 return false;
2221}
Anton Korobeynikove7772382009-05-03 13:42:53 +00002222
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002223void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar07181d72009-05-06 03:16:41 +00002224 // FIXME: This *really* should not be here.
2225
2226 // X86_64 always has SSE2.
Derek Schuffbabaf312012-10-11 15:52:22 +00002227 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper85bfef62013-09-17 04:51:29 +00002228 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar07181d72009-05-06 03:16:41 +00002229
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002230 switch (CPU) {
2231 case CK_Generic:
2232 case CK_i386:
2233 case CK_i486:
2234 case CK_i586:
2235 case CK_Pentium:
2236 case CK_i686:
2237 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002238 break;
2239 case CK_PentiumMMX:
2240 case CK_Pentium2:
Stephen Hines176edba2014-12-01 14:53:08 -08002241 case CK_K6:
2242 case CK_WinChipC6:
Craig Topper85bfef62013-09-17 04:51:29 +00002243 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002244 break;
2245 case CK_Pentium3:
2246 case CK_Pentium3M:
Stephen Hines176edba2014-12-01 14:53:08 -08002247 case CK_C3_2:
Craig Topper85bfef62013-09-17 04:51:29 +00002248 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002249 break;
2250 case CK_PentiumM:
2251 case CK_Pentium4:
2252 case CK_Pentium4M:
2253 case CK_x86_64:
Craig Topper85bfef62013-09-17 04:51:29 +00002254 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002255 break;
2256 case CK_Yonah:
2257 case CK_Prescott:
2258 case CK_Nocona:
Craig Topper85bfef62013-09-17 04:51:29 +00002259 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002260 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002261 break;
2262 case CK_Core2:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002263 case CK_Bonnell:
Craig Topper85bfef62013-09-17 04:51:29 +00002264 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002265 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002266 break;
2267 case CK_Penryn:
Craig Topper85bfef62013-09-17 04:51:29 +00002268 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002269 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002270 break;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002271 case CK_Skylake:
Stephen Hines176edba2014-12-01 14:53:08 -08002272 setFeatureEnabledImpl(Features, "avx512f", true);
2273 setFeatureEnabledImpl(Features, "avx512cd", true);
2274 setFeatureEnabledImpl(Features, "avx512dq", true);
2275 setFeatureEnabledImpl(Features, "avx512bw", true);
2276 setFeatureEnabledImpl(Features, "avx512vl", true);
2277 // FALLTHROUGH
2278 case CK_Broadwell:
2279 setFeatureEnabledImpl(Features, "rdseed", true);
2280 setFeatureEnabledImpl(Features, "adx", true);
2281 // FALLTHROUGH
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002282 case CK_Haswell:
Craig Topper85bfef62013-09-17 04:51:29 +00002283 setFeatureEnabledImpl(Features, "avx2", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002284 setFeatureEnabledImpl(Features, "lzcnt", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002285 setFeatureEnabledImpl(Features, "bmi", true);
2286 setFeatureEnabledImpl(Features, "bmi2", true);
2287 setFeatureEnabledImpl(Features, "rtm", true);
2288 setFeatureEnabledImpl(Features, "fma", true);
Stephen Hines176edba2014-12-01 14:53:08 -08002289 // FALLTHROUGH
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002290 case CK_IvyBridge:
Stephen Hines176edba2014-12-01 14:53:08 -08002291 setFeatureEnabledImpl(Features, "rdrnd", true);
2292 setFeatureEnabledImpl(Features, "f16c", true);
2293 setFeatureEnabledImpl(Features, "fsgsbase", true);
2294 // FALLTHROUGH
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002295 case CK_SandyBridge:
Stephen Hines176edba2014-12-01 14:53:08 -08002296 setFeatureEnabledImpl(Features, "avx", true);
2297 // FALLTHROUGH
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002298 case CK_Westmere:
Stephen Hines176edba2014-12-01 14:53:08 -08002299 case CK_Silvermont:
2300 setFeatureEnabledImpl(Features, "aes", true);
2301 setFeatureEnabledImpl(Features, "pclmul", true);
2302 // FALLTHROUGH
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002303 case CK_Nehalem:
Stephen Hines176edba2014-12-01 14:53:08 -08002304 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002305 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002306 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002307 case CK_KNL:
Craig Topper85bfef62013-09-17 04:51:29 +00002308 setFeatureEnabledImpl(Features, "avx512f", true);
2309 setFeatureEnabledImpl(Features, "avx512cd", true);
2310 setFeatureEnabledImpl(Features, "avx512er", true);
2311 setFeatureEnabledImpl(Features, "avx512pf", true);
Stephen Hines176edba2014-12-01 14:53:08 -08002312 setFeatureEnabledImpl(Features, "rdseed", true);
2313 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002314 setFeatureEnabledImpl(Features, "lzcnt", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002315 setFeatureEnabledImpl(Features, "bmi", true);
2316 setFeatureEnabledImpl(Features, "bmi2", true);
2317 setFeatureEnabledImpl(Features, "rtm", true);
2318 setFeatureEnabledImpl(Features, "fma", true);
Stephen Hines176edba2014-12-01 14:53:08 -08002319 setFeatureEnabledImpl(Features, "rdrnd", true);
2320 setFeatureEnabledImpl(Features, "f16c", true);
2321 setFeatureEnabledImpl(Features, "fsgsbase", true);
2322 setFeatureEnabledImpl(Features, "aes", true);
2323 setFeatureEnabledImpl(Features, "pclmul", true);
2324 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002325 break;
2326 case CK_K6_2:
2327 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002328 case CK_WinChip2:
2329 case CK_C3:
Craig Topper85bfef62013-09-17 04:51:29 +00002330 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002331 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00002332 case CK_Athlon:
2333 case CK_AthlonThunderbird:
2334 case CK_Geode:
Craig Topper85bfef62013-09-17 04:51:29 +00002335 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00002336 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002337 case CK_Athlon4:
2338 case CK_AthlonXP:
2339 case CK_AthlonMP:
Craig Topper85bfef62013-09-17 04:51:29 +00002340 setFeatureEnabledImpl(Features, "sse", true);
2341 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002342 break;
2343 case CK_K8:
2344 case CK_Opteron:
2345 case CK_Athlon64:
2346 case CK_AthlonFX:
Craig Topper85bfef62013-09-17 04:51:29 +00002347 setFeatureEnabledImpl(Features, "sse2", true);
2348 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002349 break;
Stephen Hines176edba2014-12-01 14:53:08 -08002350 case CK_AMDFAM10:
2351 setFeatureEnabledImpl(Features, "sse4a", true);
2352 setFeatureEnabledImpl(Features, "lzcnt", true);
2353 setFeatureEnabledImpl(Features, "popcnt", true);
2354 // FALLTHROUGH
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002355 case CK_K8SSE3:
2356 case CK_OpteronSSE3:
2357 case CK_Athlon64SSE3:
Craig Topper85bfef62013-09-17 04:51:29 +00002358 setFeatureEnabledImpl(Features, "sse3", true);
2359 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divacky9979cfe2011-10-30 13:47:56 +00002360 break;
Stephen Hines176edba2014-12-01 14:53:08 -08002361 case CK_BTVER2:
2362 setFeatureEnabledImpl(Features, "avx", true);
2363 setFeatureEnabledImpl(Features, "aes", true);
2364 setFeatureEnabledImpl(Features, "pclmul", true);
2365 setFeatureEnabledImpl(Features, "bmi", true);
2366 setFeatureEnabledImpl(Features, "f16c", true);
2367 // FALLTHROUGH
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002368 case CK_BTVER1:
Craig Topper85bfef62013-09-17 04:51:29 +00002369 setFeatureEnabledImpl(Features, "ssse3", true);
2370 setFeatureEnabledImpl(Features, "sse4a", true);
2371 setFeatureEnabledImpl(Features, "lzcnt", true);
2372 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002373 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002374 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002375 break;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002376 case CK_BDVER4:
2377 setFeatureEnabledImpl(Features, "avx2", true);
2378 setFeatureEnabledImpl(Features, "bmi2", true);
2379 // FALLTHROUGH
Benjamin Kramera2420962013-11-04 10:29:51 +00002380 case CK_BDVER3:
Stephen Hines176edba2014-12-01 14:53:08 -08002381 setFeatureEnabledImpl(Features, "fsgsbase", true);
2382 // FALLTHROUGH
2383 case CK_BDVER2:
2384 setFeatureEnabledImpl(Features, "bmi", true);
2385 setFeatureEnabledImpl(Features, "fma", true);
2386 setFeatureEnabledImpl(Features, "f16c", true);
2387 setFeatureEnabledImpl(Features, "tbm", true);
2388 // FALLTHROUGH
2389 case CK_BDVER1:
2390 // xop implies avx, sse4a and fma4.
Craig Topper85bfef62013-09-17 04:51:29 +00002391 setFeatureEnabledImpl(Features, "xop", true);
2392 setFeatureEnabledImpl(Features, "lzcnt", true);
2393 setFeatureEnabledImpl(Features, "aes", true);
2394 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002395 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002396 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002397 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002398 }
Daniel Dunbar07181d72009-05-06 03:16:41 +00002399}
2400
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002401void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper319d81f2013-09-17 04:12:55 +00002402 X86SSEEnum Level, bool Enabled) {
Daniel Dunbar0838f962009-05-06 21:07:50 +00002403 if (Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002404 switch (Level) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002405 case AVX512F:
2406 Features["avx512f"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002407 case AVX2:
2408 Features["avx2"] = true;
2409 case AVX:
2410 Features["avx"] = true;
2411 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002412 Features["sse4.2"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002413 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002414 Features["sse4.1"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002415 case SSSE3:
2416 Features["ssse3"] = true;
2417 case SSE3:
2418 Features["sse3"] = true;
2419 case SSE2:
2420 Features["sse2"] = true;
2421 case SSE1:
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002422 Features["sse"] = true;
2423 case NoSSE:
2424 break;
2425 }
2426 return;
Daniel Dunbar0838f962009-05-06 21:07:50 +00002427 }
2428
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002429 switch (Level) {
2430 case NoSSE:
2431 case SSE1:
2432 Features["sse"] = false;
2433 case SSE2:
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002434 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2435 Features["sha"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002436 case SSE3:
2437 Features["sse3"] = false;
2438 setXOPLevel(Features, NoXOP, false);
2439 case SSSE3:
2440 Features["ssse3"] = false;
2441 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002442 Features["sse4.1"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002443 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002444 Features["sse4.2"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002445 case AVX:
Craig Topper84f007b2013-09-16 04:54:13 +00002446 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola29f26de2013-08-21 13:28:02 +00002447 setXOPLevel(Features, FMA4, false);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002448 case AVX2:
2449 Features["avx2"] = false;
Craig Topperb7a95d22013-08-21 03:59:22 +00002450 case AVX512F:
Craig Topperbca2c4f2013-08-21 05:29:10 +00002451 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002452 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2453 Features["avx512vl"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002454 }
Daniel Dunbar0838f962009-05-06 21:07:50 +00002455}
2456
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002457void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper319d81f2013-09-17 04:12:55 +00002458 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002459 if (Enabled) {
2460 switch (Level) {
2461 case AMD3DNowAthlon:
2462 Features["3dnowa"] = true;
2463 case AMD3DNow:
2464 Features["3dnow"] = true;
2465 case MMX:
2466 Features["mmx"] = true;
2467 case NoMMX3DNow:
2468 break;
2469 }
2470 return;
2471 }
2472
2473 switch (Level) {
2474 case NoMMX3DNow:
2475 case MMX:
2476 Features["mmx"] = false;
2477 case AMD3DNow:
2478 Features["3dnow"] = false;
2479 case AMD3DNowAthlon:
2480 Features["3dnowa"] = false;
2481 }
2482}
2483
2484void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper319d81f2013-09-17 04:12:55 +00002485 bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002486 if (Enabled) {
2487 switch (Level) {
2488 case XOP:
2489 Features["xop"] = true;
2490 case FMA4:
2491 Features["fma4"] = true;
2492 setSSELevel(Features, AVX, true);
2493 case SSE4A:
2494 Features["sse4a"] = true;
2495 setSSELevel(Features, SSE3, true);
2496 case NoXOP:
2497 break;
2498 }
2499 return;
2500 }
2501
2502 switch (Level) {
2503 case NoXOP:
2504 case SSE4A:
2505 Features["sse4a"] = false;
2506 case FMA4:
2507 Features["fma4"] = false;
2508 case XOP:
2509 Features["xop"] = false;
2510 }
2511}
2512
Craig Topper85bfef62013-09-17 04:51:29 +00002513void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2514 StringRef Name, bool Enabled) {
Eric Christopherd39ebe22010-03-04 02:26:37 +00002515 // FIXME: This *really* should not be here. We need some way of translating
2516 // options into llvm subtarget features.
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002517 if (Name == "sse4")
2518 Name = "sse4.2";
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002519
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002520 Features[Name] = Enabled;
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002521
Craig Topperb22352e2013-09-19 01:13:07 +00002522 if (Name == "mmx") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002523 setMMXLevel(Features, MMX, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002524 } else if (Name == "sse") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002525 setSSELevel(Features, SSE1, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002526 } else if (Name == "sse2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002527 setSSELevel(Features, SSE2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002528 } else if (Name == "sse3") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002529 setSSELevel(Features, SSE3, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002530 } else if (Name == "ssse3") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002531 setSSELevel(Features, SSSE3, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002532 } else if (Name == "sse4.2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002533 setSSELevel(Features, SSE42, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002534 } else if (Name == "sse4.1") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002535 setSSELevel(Features, SSE41, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002536 } else if (Name == "3dnow") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002537 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002538 } else if (Name == "3dnowa") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002539 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002540 } else if (Name == "aes") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002541 if (Enabled)
2542 setSSELevel(Features, SSE2, Enabled);
2543 } else if (Name == "pclmul") {
2544 if (Enabled)
2545 setSSELevel(Features, SSE2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002546 } else if (Name == "avx") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002547 setSSELevel(Features, AVX, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002548 } else if (Name == "avx2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002549 setSSELevel(Features, AVX2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002550 } else if (Name == "avx512f") {
Craig Topperb7a95d22013-08-21 03:59:22 +00002551 setSSELevel(Features, AVX512F, Enabled);
Stephen Hines176edba2014-12-01 14:53:08 -08002552 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2553 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topperbca2c4f2013-08-21 05:29:10 +00002554 if (Enabled)
2555 setSSELevel(Features, AVX512F, Enabled);
2556 } else if (Name == "fma") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002557 if (Enabled)
2558 setSSELevel(Features, AVX, Enabled);
2559 } else if (Name == "fma4") {
2560 setXOPLevel(Features, FMA4, Enabled);
2561 } else if (Name == "xop") {
2562 setXOPLevel(Features, XOP, Enabled);
2563 } else if (Name == "sse4a") {
2564 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper84f007b2013-09-16 04:54:13 +00002565 } else if (Name == "f16c") {
2566 if (Enabled)
2567 setSSELevel(Features, AVX, Enabled);
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002568 } else if (Name == "sha") {
2569 if (Enabled)
2570 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002571 }
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002572}
2573
Eric Christopher3d11ced2013-10-16 21:26:26 +00002574/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar07181d72009-05-06 03:16:41 +00002575/// configured set of features.
Eric Christopher3d11ced2013-10-16 21:26:26 +00002576bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindola5389b842013-08-21 21:59:03 +00002577 DiagnosticsEngine &Diags) {
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002578 // Remember the maximum enabled sselevel.
2579 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2580 // Ignore disabled features.
2581 if (Features[i][0] == '-')
2582 continue;
2583
Benjamin Kramer713575a2012-03-05 15:10:44 +00002584 StringRef Feature = StringRef(Features[i]).substr(1);
2585
2586 if (Feature == "aes") {
Eric Christopher6c4e7872010-04-02 23:50:19 +00002587 HasAES = true;
2588 continue;
2589 }
2590
Craig Topper3c0bc152012-05-31 05:18:48 +00002591 if (Feature == "pclmul") {
2592 HasPCLMUL = true;
2593 continue;
2594 }
2595
Benjamin Kramer713575a2012-03-05 15:10:44 +00002596 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00002597 HasLZCNT = true;
2598 continue;
2599 }
2600
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002601 if (Feature == "rdrnd") {
Benjamin Kramer84f30802012-07-07 09:39:18 +00002602 HasRDRND = true;
2603 continue;
2604 }
2605
Stephen Hines176edba2014-12-01 14:53:08 -08002606 if (Feature == "fsgsbase") {
2607 HasFSGSBASE = true;
2608 continue;
2609 }
2610
Benjamin Kramer713575a2012-03-05 15:10:44 +00002611 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00002612 HasBMI = true;
2613 continue;
2614 }
2615
Benjamin Kramer713575a2012-03-05 15:10:44 +00002616 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00002617 HasBMI2 = true;
2618 continue;
2619 }
2620
Benjamin Kramer713575a2012-03-05 15:10:44 +00002621 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00002622 HasPOPCNT = true;
2623 continue;
2624 }
2625
Michael Liao463eb892012-11-10 05:17:46 +00002626 if (Feature == "rtm") {
2627 HasRTM = true;
2628 continue;
2629 }
2630
Michael Liao72339a02013-03-26 17:52:08 +00002631 if (Feature == "prfchw") {
2632 HasPRFCHW = true;
2633 continue;
2634 }
2635
Michael Liao1bfc28c2013-03-29 05:17:55 +00002636 if (Feature == "rdseed") {
2637 HasRDSEED = true;
2638 continue;
2639 }
2640
Stephen Hines176edba2014-12-01 14:53:08 -08002641 if (Feature == "adx") {
2642 HasADX = true;
2643 continue;
2644 }
2645
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002646 if (Feature == "tbm") {
2647 HasTBM = true;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00002648 continue;
2649 }
2650
Craig Topper2ae95072012-06-03 21:46:30 +00002651 if (Feature == "fma") {
2652 HasFMA = true;
2653 continue;
2654 }
2655
Manman Ren146e5a42012-10-11 00:59:55 +00002656 if (Feature == "f16c") {
2657 HasF16C = true;
2658 continue;
2659 }
2660
Craig Topperbca2c4f2013-08-21 05:29:10 +00002661 if (Feature == "avx512cd") {
2662 HasAVX512CD = true;
2663 continue;
2664 }
2665
2666 if (Feature == "avx512er") {
2667 HasAVX512ER = true;
2668 continue;
2669 }
2670
2671 if (Feature == "avx512pf") {
2672 HasAVX512PF = true;
2673 continue;
2674 }
2675
Stephen Hines176edba2014-12-01 14:53:08 -08002676 if (Feature == "avx512dq") {
2677 HasAVX512DQ = true;
2678 continue;
2679 }
2680
2681 if (Feature == "avx512bw") {
2682 HasAVX512BW = true;
2683 continue;
2684 }
2685
2686 if (Feature == "avx512vl") {
2687 HasAVX512VL = true;
2688 continue;
2689 }
2690
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002691 if (Feature == "sha") {
2692 HasSHA = true;
2693 continue;
2694 }
2695
Nick Lewyckyaf945462013-10-05 20:14:27 +00002696 if (Feature == "cx16") {
2697 HasCX16 = true;
2698 continue;
2699 }
2700
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002701 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00002702 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topperbca2c4f2013-08-21 05:29:10 +00002703 .Case("avx512f", AVX512F)
Craig Topper05fe4b52012-01-09 09:19:09 +00002704 .Case("avx2", AVX2)
2705 .Case("avx", AVX)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002706 .Case("sse4.2", SSE42)
2707 .Case("sse4.1", SSE41)
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002708 .Case("ssse3", SSSE3)
Nuno Lopes3a16d782010-03-12 10:20:09 +00002709 .Case("sse3", SSE3)
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002710 .Case("sse2", SSE2)
2711 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002712 .Default(NoSSE);
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002713 SSELevel = std::max(SSELevel, Level);
Michael J. Spencerd5513a32010-10-21 03:16:25 +00002714
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002715 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00002716 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone5e222f2010-01-27 03:47:49 +00002717 .Case("3dnowa", AMD3DNowAthlon)
2718 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002719 .Case("mmx", MMX)
2720 .Default(NoMMX3DNow);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002721 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002722
2723 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2724 .Case("xop", XOP)
2725 .Case("fma4", FMA4)
2726 .Case("sse4a", SSE4A)
2727 .Default(NoXOP);
2728 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002729 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002730
Craig Topper89a5e792013-09-10 06:55:47 +00002731 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2732 // Can't do this earlier because we need to be able to explicitly enable
2733 // popcnt and still disable sse4.2.
2734 if (!HasPOPCNT && SSELevel >= SSE42 &&
2735 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2736 HasPOPCNT = true;
2737 Features.push_back("+popcnt");
2738 }
2739
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002740 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2741 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2742 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2743 HasPRFCHW = true;
2744 Features.push_back("+prfchw");
2745 }
2746
Rafael Espindola5389b842013-08-21 21:59:03 +00002747 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2748 // matches the selected sse level.
2749 if (FPMath == FP_SSE && SSELevel < SSE1) {
2750 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2751 return false;
2752 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2753 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2754 return false;
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002755 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002756
2757 // Don't tell the backend if we're turning off mmx; it will end up disabling
2758 // SSE, which we don't want.
Craig Topper56bed972013-09-11 06:48:53 +00002759 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2760 // then enable MMX.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002761 std::vector<std::string>::iterator it;
2762 it = std::find(Features.begin(), Features.end(), "-mmx");
2763 if (it != Features.end())
2764 Features.erase(it);
Craig Topper56bed972013-09-11 06:48:53 +00002765 else if (SSELevel > NoSSE)
2766 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindola5389b842013-08-21 21:59:03 +00002767 return true;
Chris Lattner7d6220c2009-03-02 22:20:04 +00002768}
Chris Lattnerbef1d722009-03-02 22:27:17 +00002769
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002770/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2771/// definitions for this particular subtarget.
Chris Lattner79682402009-03-20 15:52:06 +00002772void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002773 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +00002774 // Target identification.
Derek Schuffbabaf312012-10-11 15:52:22 +00002775 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002776 Builder.defineMacro("__amd64__");
2777 Builder.defineMacro("__amd64");
2778 Builder.defineMacro("__x86_64");
2779 Builder.defineMacro("__x86_64__");
Stephen Hines176edba2014-12-01 14:53:08 -08002780 if (getTriple().getArchName() == "x86_64h") {
2781 Builder.defineMacro("__x86_64h");
2782 Builder.defineMacro("__x86_64h__");
2783 }
Chris Lattnerbef1d722009-03-02 22:27:17 +00002784 } else {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002785 DefineStd(Builder, "i386", Opts);
Chris Lattnerbef1d722009-03-02 22:27:17 +00002786 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00002787
Chris Lattnerc0f59212009-03-02 22:27:17 +00002788 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002789 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2790 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002791 switch (CPU) {
2792 case CK_Generic:
2793 break;
2794 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002795 // The rest are coming from the i386 define above.
2796 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002797 break;
2798 case CK_i486:
2799 case CK_WinChipC6:
2800 case CK_WinChip2:
2801 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002802 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002803 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002804 case CK_PentiumMMX:
2805 Builder.defineMacro("__pentium_mmx__");
2806 Builder.defineMacro("__tune_pentium_mmx__");
2807 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002808 case CK_i586:
2809 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002810 defineCPUMacros(Builder, "i586");
2811 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002812 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002813 case CK_Pentium3:
2814 case CK_Pentium3M:
2815 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002816 Builder.defineMacro("__tune_pentium3__");
2817 // Fallthrough
2818 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002819 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002820 Builder.defineMacro("__tune_pentium2__");
2821 // Fallthrough
2822 case CK_PentiumPro:
2823 Builder.defineMacro("__tune_i686__");
2824 Builder.defineMacro("__tune_pentiumpro__");
2825 // Fallthrough
2826 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002827 Builder.defineMacro("__i686");
2828 Builder.defineMacro("__i686__");
2829 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2830 Builder.defineMacro("__pentiumpro");
2831 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002832 break;
2833 case CK_Pentium4:
2834 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002835 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002836 break;
2837 case CK_Yonah:
2838 case CK_Prescott:
2839 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002840 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002841 break;
2842 case CK_Core2:
2843 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002844 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002845 break;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002846 case CK_Bonnell:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002847 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002848 break;
Preston Gurdc57ea682013-09-13 19:27:17 +00002849 case CK_Silvermont:
Benjamin Kramerb98ce372013-08-30 14:05:34 +00002850 defineCPUMacros(Builder, "slm");
2851 break;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002852 case CK_Nehalem:
2853 case CK_Westmere:
2854 case CK_SandyBridge:
2855 case CK_IvyBridge:
2856 case CK_Haswell:
Stephen Hines176edba2014-12-01 14:53:08 -08002857 case CK_Broadwell:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002858 // FIXME: Historically, we defined this legacy name, it would be nice to
2859 // remove it at some point. We've never exposed fine-grained names for
2860 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002861 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002862 break;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002863 case CK_Skylake:
2864 // FIXME: Historically, we defined this legacy name, it would be nice to
2865 // remove it at some point. This is the only fine-grained CPU macro in the
2866 // main intel CPU line, and it would be better to not have these and force
2867 // people to use ISA macros.
2868 defineCPUMacros(Builder, "skx");
2869 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002870 case CK_KNL:
2871 defineCPUMacros(Builder, "knl");
2872 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002873 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002874 Builder.defineMacro("__k6_2__");
2875 Builder.defineMacro("__tune_k6_2__");
2876 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002877 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002878 if (CPU != CK_K6_2) { // In case of fallthrough
2879 // FIXME: GCC may be enabling these in cases where some other k6
2880 // architecture is specified but -m3dnow is explicitly provided. The
2881 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002882 Builder.defineMacro("__k6_3__");
2883 Builder.defineMacro("__tune_k6_3__");
2884 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00002885 // Fallthrough
2886 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002887 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002888 break;
2889 case CK_Athlon:
2890 case CK_AthlonThunderbird:
2891 case CK_Athlon4:
2892 case CK_AthlonXP:
2893 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002894 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002895 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002896 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002897 Builder.defineMacro("__tune_athlon_sse__");
2898 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002899 break;
2900 case CK_K8:
2901 case CK_K8SSE3:
2902 case CK_x86_64:
2903 case CK_Opteron:
2904 case CK_OpteronSSE3:
2905 case CK_Athlon64:
2906 case CK_Athlon64SSE3:
2907 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002908 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002909 break;
Roman Divackyf051cde2011-10-30 07:48:46 +00002910 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002911 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00002912 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002913 case CK_BTVER1:
2914 defineCPUMacros(Builder, "btver1");
Roman Divackyf051cde2011-10-30 07:48:46 +00002915 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00002916 case CK_BTVER2:
2917 defineCPUMacros(Builder, "btver2");
2918 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002919 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002920 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002921 break;
2922 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002923 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002924 break;
Benjamin Kramera2420962013-11-04 10:29:51 +00002925 case CK_BDVER3:
2926 defineCPUMacros(Builder, "bdver3");
2927 break;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002928 case CK_BDVER4:
2929 defineCPUMacros(Builder, "bdver4");
2930 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002931 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002932 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002933 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002934 }
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00002935
Chris Lattnerbef1d722009-03-02 22:27:17 +00002936 // Target properties.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002937 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002938
Chris Lattner25ac1c12009-04-19 17:32:33 +00002939 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2940 // functions in glibc header files that use FP Stack inline asm which the
2941 // backend can't deal with (PR879).
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002942 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikove7772382009-05-03 13:42:53 +00002943
Chandler Carruth88c75b02011-09-28 09:54:07 +00002944 if (HasAES)
2945 Builder.defineMacro("__AES__");
2946
Craig Topper3c0bc152012-05-31 05:18:48 +00002947 if (HasPCLMUL)
2948 Builder.defineMacro("__PCLMUL__");
2949
Craig Topper31ceea02011-12-25 05:06:45 +00002950 if (HasLZCNT)
2951 Builder.defineMacro("__LZCNT__");
2952
Benjamin Kramer84f30802012-07-07 09:39:18 +00002953 if (HasRDRND)
2954 Builder.defineMacro("__RDRND__");
2955
Stephen Hines176edba2014-12-01 14:53:08 -08002956 if (HasFSGSBASE)
2957 Builder.defineMacro("__FSGSBASE__");
2958
Craig Topper31ceea02011-12-25 05:06:45 +00002959 if (HasBMI)
2960 Builder.defineMacro("__BMI__");
2961
2962 if (HasBMI2)
2963 Builder.defineMacro("__BMI2__");
2964
Craig Toppere14e08b2011-12-29 16:10:46 +00002965 if (HasPOPCNT)
2966 Builder.defineMacro("__POPCNT__");
2967
Michael Liao463eb892012-11-10 05:17:46 +00002968 if (HasRTM)
2969 Builder.defineMacro("__RTM__");
2970
Michael Liao72339a02013-03-26 17:52:08 +00002971 if (HasPRFCHW)
2972 Builder.defineMacro("__PRFCHW__");
2973
Michael Liao1bfc28c2013-03-29 05:17:55 +00002974 if (HasRDSEED)
2975 Builder.defineMacro("__RDSEED__");
2976
Stephen Hines176edba2014-12-01 14:53:08 -08002977 if (HasADX)
2978 Builder.defineMacro("__ADX__");
2979
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002980 if (HasTBM)
2981 Builder.defineMacro("__TBM__");
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002982
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002983 switch (XOPLevel) {
2984 case XOP:
2985 Builder.defineMacro("__XOP__");
2986 case FMA4:
Craig Topper6a511e12011-12-30 07:33:42 +00002987 Builder.defineMacro("__FMA4__");
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002988 case SSE4A:
2989 Builder.defineMacro("__SSE4A__");
2990 case NoXOP:
2991 break;
2992 }
Chandler Carruth88c75b02011-09-28 09:54:07 +00002993
Craig Topper2ae95072012-06-03 21:46:30 +00002994 if (HasFMA)
2995 Builder.defineMacro("__FMA__");
2996
Manman Ren146e5a42012-10-11 00:59:55 +00002997 if (HasF16C)
2998 Builder.defineMacro("__F16C__");
2999
Craig Topperbca2c4f2013-08-21 05:29:10 +00003000 if (HasAVX512CD)
3001 Builder.defineMacro("__AVX512CD__");
3002 if (HasAVX512ER)
3003 Builder.defineMacro("__AVX512ER__");
3004 if (HasAVX512PF)
3005 Builder.defineMacro("__AVX512PF__");
Stephen Hines176edba2014-12-01 14:53:08 -08003006 if (HasAVX512DQ)
3007 Builder.defineMacro("__AVX512DQ__");
3008 if (HasAVX512BW)
3009 Builder.defineMacro("__AVX512BW__");
3010 if (HasAVX512VL)
3011 Builder.defineMacro("__AVX512VL__");
Craig Topperbca2c4f2013-08-21 05:29:10 +00003012
Ben Langmuirb83f5a72013-09-19 13:22:04 +00003013 if (HasSHA)
3014 Builder.defineMacro("__SHA__");
3015
Nick Lewyckyaf945462013-10-05 20:14:27 +00003016 if (HasCX16)
3017 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3018
Chris Lattner715fe4c2009-03-02 22:40:39 +00003019 // Each case falls through to the previous one here.
3020 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00003021 case AVX512F:
Craig Topper42f98732013-08-20 07:39:54 +00003022 Builder.defineMacro("__AVX512F__");
Craig Topper05fe4b52012-01-09 09:19:09 +00003023 case AVX2:
3024 Builder.defineMacro("__AVX2__");
3025 case AVX:
3026 Builder.defineMacro("__AVX__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00003027 case SSE42:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003028 Builder.defineMacro("__SSE4_2__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00003029 case SSE41:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003030 Builder.defineMacro("__SSE4_1__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00003031 case SSSE3:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003032 Builder.defineMacro("__SSSE3__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00003033 case SSE3:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003034 Builder.defineMacro("__SSE3__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00003035 case SSE2:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003036 Builder.defineMacro("__SSE2__");
3037 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner715fe4c2009-03-02 22:40:39 +00003038 case SSE1:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003039 Builder.defineMacro("__SSE__");
3040 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00003041 case NoSSE:
Chris Lattner715fe4c2009-03-02 22:40:39 +00003042 break;
3043 }
Michael J. Spencer3d796932010-10-18 07:10:59 +00003044
Derek Schuffbabaf312012-10-11 15:52:22 +00003045 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer01e70082010-10-21 05:21:48 +00003046 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00003047 case AVX512F:
Craig Topper05fe4b52012-01-09 09:19:09 +00003048 case AVX2:
3049 case AVX:
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003050 case SSE42:
3051 case SSE41:
3052 case SSSE3:
3053 case SSE3:
Michael J. Spencer01e70082010-10-21 05:21:48 +00003054 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00003055 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer01e70082010-10-21 05:21:48 +00003056 break;
3057 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00003058 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer01e70082010-10-21 05:21:48 +00003059 break;
3060 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00003061 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer01e70082010-10-21 05:21:48 +00003062 }
3063 }
3064
Anders Carlssone5e222f2010-01-27 03:47:49 +00003065 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00003066 switch (MMX3DNowLevel) {
Anders Carlssone5e222f2010-01-27 03:47:49 +00003067 case AMD3DNowAthlon:
3068 Builder.defineMacro("__3dNOW_A__");
3069 case AMD3DNow:
3070 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00003071 case MMX:
3072 Builder.defineMacro("__MMX__");
3073 case NoMMX3DNow:
Anders Carlssone5e222f2010-01-27 03:47:49 +00003074 break;
3075 }
Michael J. Spencerd1b33942013-04-04 23:53:43 +00003076
3077 if (CPU >= CK_i486) {
3078 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3079 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3080 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3081 }
3082 if (CPU >= CK_i586)
3083 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerbef1d722009-03-02 22:27:17 +00003084}
Anton Korobeynikove7772382009-05-03 13:42:53 +00003085
Douglas Gregore727d212012-01-30 06:38:25 +00003086bool X86TargetInfo::hasFeature(StringRef Feature) const {
3087 return llvm::StringSwitch<bool>(Feature)
3088 .Case("aes", HasAES)
3089 .Case("avx", SSELevel >= AVX)
3090 .Case("avx2", SSELevel >= AVX2)
Craig Topperb7a95d22013-08-21 03:59:22 +00003091 .Case("avx512f", SSELevel >= AVX512F)
Craig Topperbca2c4f2013-08-21 05:29:10 +00003092 .Case("avx512cd", HasAVX512CD)
3093 .Case("avx512er", HasAVX512ER)
3094 .Case("avx512pf", HasAVX512PF)
Stephen Hines176edba2014-12-01 14:53:08 -08003095 .Case("avx512dq", HasAVX512DQ)
3096 .Case("avx512bw", HasAVX512BW)
3097 .Case("avx512vl", HasAVX512VL)
Douglas Gregore727d212012-01-30 06:38:25 +00003098 .Case("bmi", HasBMI)
3099 .Case("bmi2", HasBMI2)
Nick Lewyckyaf945462013-10-05 20:14:27 +00003100 .Case("cx16", HasCX16)
3101 .Case("f16c", HasF16C)
Craig Topper2ae95072012-06-03 21:46:30 +00003102 .Case("fma", HasFMA)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00003103 .Case("fma4", XOPLevel >= FMA4)
Stephen Hines176edba2014-12-01 14:53:08 -08003104 .Case("fsgsbase", HasFSGSBASE)
Douglas Gregore727d212012-01-30 06:38:25 +00003105 .Case("lzcnt", HasLZCNT)
3106 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3107 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3108 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00003109 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00003110 .Case("popcnt", HasPOPCNT)
Michael Liao72339a02013-03-26 17:52:08 +00003111 .Case("prfchw", HasPRFCHW)
Stephen Hines176edba2014-12-01 14:53:08 -08003112 .Case("rdrnd", HasRDRND)
Michael Liao1bfc28c2013-03-29 05:17:55 +00003113 .Case("rdseed", HasRDSEED)
Stephen Hines176edba2014-12-01 14:53:08 -08003114 .Case("rtm", HasRTM)
Ben Langmuirb83f5a72013-09-19 13:22:04 +00003115 .Case("sha", HasSHA)
Douglas Gregore727d212012-01-30 06:38:25 +00003116 .Case("sse", SSELevel >= SSE1)
3117 .Case("sse2", SSELevel >= SSE2)
3118 .Case("sse3", SSELevel >= SSE3)
3119 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00003120 .Case("sse4.1", SSELevel >= SSE41)
3121 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00003122 .Case("sse4a", XOPLevel >= SSE4A)
Stephen Hines176edba2014-12-01 14:53:08 -08003123 .Case("tbm", HasTBM)
Douglas Gregore727d212012-01-30 06:38:25 +00003124 .Case("x86", true)
Derek Schuffbabaf312012-10-11 15:52:22 +00003125 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3126 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00003127 .Case("xop", XOPLevel >= XOP)
Douglas Gregore727d212012-01-30 06:38:25 +00003128 .Default(false);
3129}
Anton Korobeynikove7772382009-05-03 13:42:53 +00003130
Eli Friedman872996c2008-08-20 02:34:37 +00003131bool
Anders Carlsson36834a72009-02-28 17:11:49 +00003132X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00003133 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +00003134 switch (*Name) {
Eli Friedman872996c2008-08-20 02:34:37 +00003135 default: return false;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003136 case 'I':
3137 Info.setRequiresImmediate(0, 31);
3138 return true;
3139 case 'J':
3140 Info.setRequiresImmediate(0, 63);
3141 return true;
3142 case 'K':
3143 Info.setRequiresImmediate(-128, 127);
3144 return true;
3145 case 'L':
3146 // FIXME: properly analyze this constraint:
3147 // must be one of 0xff, 0xffff, or 0xffffffff
3148 return true;
3149 case 'M':
3150 Info.setRequiresImmediate(0, 3);
3151 return true;
3152 case 'N':
3153 Info.setRequiresImmediate(0, 255);
3154 return true;
3155 case 'O':
3156 Info.setRequiresImmediate(0, 127);
3157 return true;
Dale Johanneseneba819a2010-08-24 22:33:12 +00003158 case 'Y': // first letter of a pair:
3159 switch (*(Name+1)) {
3160 default: return false;
3161 case '0': // First SSE register.
3162 case 't': // Any SSE register, when SSE2 is enabled.
3163 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3164 case 'm': // any MMX register, when inter-unit moves enabled.
3165 break; // falls through to setAllowsRegister.
3166 }
Stephen Hines176edba2014-12-01 14:53:08 -08003167 case 'f': // any x87 floating point stack register.
3168 // Constraint 'f' cannot be used for output operands.
3169 if (Info.ConstraintStr[0] == '=')
3170 return false;
3171
3172 Info.setAllowsRegister();
3173 return true;
Eli Friedman872996c2008-08-20 02:34:37 +00003174 case 'a': // eax.
3175 case 'b': // ebx.
3176 case 'c': // ecx.
3177 case 'd': // edx.
3178 case 'S': // esi.
3179 case 'D': // edi.
3180 case 'A': // edx:eax.
3181 case 't': // top of floating point stack.
3182 case 'u': // second from top of floating point stack.
3183 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +00003184 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +00003185 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +00003186 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johanneseneba819a2010-08-24 22:33:12 +00003187 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3188 case 'l': // "Index" registers: any general register that can be used as an
3189 // index in a base+index memory access.
3190 Info.setAllowsRegister();
3191 return true;
3192 case 'C': // SSE floating point constant.
3193 case 'G': // x87 floating point constant.
Anton Korobeynikove7772382009-05-03 13:42:53 +00003194 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +00003195 // x86_64 instructions.
Anton Korobeynikove7772382009-05-03 13:42:53 +00003196 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +00003197 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +00003198 return true;
3199 }
3200}
3201
Stephen Hines176edba2014-12-01 14:53:08 -08003202bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3203 unsigned Size) const {
3204 // Strip off constraint modifiers.
3205 while (Constraint[0] == '=' ||
3206 Constraint[0] == '+' ||
3207 Constraint[0] == '&')
3208 Constraint = Constraint.substr(1);
3209
3210 return validateOperandSize(Constraint, Size);
3211}
3212
3213bool X86TargetInfo::validateInputSize(StringRef Constraint,
3214 unsigned Size) const {
3215 return validateOperandSize(Constraint, Size);
3216}
3217
3218bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3219 unsigned Size) const {
3220 switch (Constraint[0]) {
3221 default: break;
3222 case 'y':
3223 return Size <= 64;
3224 case 'f':
3225 case 't':
3226 case 'u':
3227 return Size <= 128;
3228 case 'x':
3229 // 256-bit ymm registers can be used if target supports AVX.
3230 return Size <= (SSELevel >= AVX ? 256U : 128U);
3231 }
3232
3233 return true;
3234}
Dale Johannesen3a161e52010-10-29 23:12:32 +00003235
Eli Friedman872996c2008-08-20 02:34:37 +00003236std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00003237X86TargetInfo::convertConstraint(const char *&Constraint) const {
3238 switch (*Constraint) {
Eli Friedman872996c2008-08-20 02:34:37 +00003239 case 'a': return std::string("{ax}");
3240 case 'b': return std::string("{bx}");
3241 case 'c': return std::string("{cx}");
3242 case 'd': return std::string("{dx}");
3243 case 'S': return std::string("{si}");
3244 case 'D': return std::string("{di}");
Dale Johannesena49254e2010-10-22 21:07:10 +00003245 case 'p': // address
3246 return std::string("im");
Eli Friedman872996c2008-08-20 02:34:37 +00003247 case 't': // top of floating point stack.
3248 return std::string("{st}");
3249 case 'u': // second from top of floating point stack.
3250 return std::string("{st(1)}"); // second from top of floating point stack.
3251 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00003252 return std::string(1, *Constraint);
Eli Friedman872996c2008-08-20 02:34:37 +00003253 }
3254}
Eli Friedman872996c2008-08-20 02:34:37 +00003255} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +00003256
3257namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00003258// X86-32 generic target
3259class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00003260public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003261 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +00003262 DoubleAlign = LongLongAlign = 32;
3263 LongDoubleWidth = 96;
3264 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00003265 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07003266 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman04ede302009-03-29 20:31:09 +00003267 SizeType = UnsignedInt;
3268 PtrDiffType = SignedInt;
3269 IntPtrType = SignedInt;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00003270 RegParmMax = 3;
Daniel Dunbar6f94dbb2010-07-14 23:39:36 +00003271
3272 // Use fpret for all types.
3273 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3274 (1 << TargetInfo::Double) |
3275 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00003276
3277 // x86-32 has atomics up to 8 bytes
3278 // FIXME: Check that we actually have cmpxchg8b before setting
3279 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3280 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman872996c2008-08-20 02:34:37 +00003281 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003282 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003283 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman872996c2008-08-20 02:34:37 +00003284 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +00003285
Stephen Hines651f13c2014-04-23 16:59:28 -07003286 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattneraa339182009-09-23 06:06:36 +00003287 if (RegNo == 0) return 0;
3288 if (RegNo == 1) return 2;
3289 return -1;
3290 }
Stephen Hines176edba2014-12-01 14:53:08 -08003291 bool validateOperandSize(StringRef Constraint,
3292 unsigned Size) const override {
Bill Wendling68fd6082012-11-12 06:42:51 +00003293 switch (Constraint[0]) {
3294 default: break;
Stephen Hines176edba2014-12-01 14:53:08 -08003295 case 'R':
3296 case 'q':
3297 case 'Q':
Bill Wendling68fd6082012-11-12 06:42:51 +00003298 case 'a':
3299 case 'b':
3300 case 'c':
3301 case 'd':
Stephen Hines176edba2014-12-01 14:53:08 -08003302 case 'S':
3303 case 'D':
Bill Wendlingf634bdf2012-11-12 18:52:32 +00003304 return Size <= 32;
Stephen Hines176edba2014-12-01 14:53:08 -08003305 case 'A':
3306 return Size <= 64;
Bill Wendling68fd6082012-11-12 06:42:51 +00003307 }
3308
Stephen Hines176edba2014-12-01 14:53:08 -08003309 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling68fd6082012-11-12 06:42:51 +00003310 }
Eli Friedman872996c2008-08-20 02:34:37 +00003311};
3312} // end anonymous namespace
3313
3314namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003315class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3316public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003317 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3318 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003319
Stephen Hines651f13c2014-04-23 16:59:28 -07003320 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger8daa7fe2013-11-11 14:00:37 +00003321 unsigned Major, Minor, Micro;
3322 getTriple().getOSVersion(Major, Minor, Micro);
3323 // New NetBSD uses the default rounding mode.
3324 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3325 return X86_32TargetInfo::getFloatEvalMethod();
3326 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003327 return 1;
3328 }
3329};
3330} // end anonymous namespace
3331
3332namespace {
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003333class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3334public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003335 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3336 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003337 SizeType = UnsignedLong;
3338 IntPtrType = SignedLong;
Eli Friedman96ada022009-07-05 22:31:18 +00003339 PtrDiffType = SignedLong;
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003340 }
3341};
3342} // end anonymous namespace
3343
3344namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003345class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3346public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003347 BitrigI386TargetInfo(const llvm::Triple &Triple)
3348 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman42f74f22012-08-08 23:57:20 +00003349 SizeType = UnsignedLong;
3350 IntPtrType = SignedLong;
3351 PtrDiffType = SignedLong;
3352 }
3353};
3354} // end anonymous namespace
3355
3356namespace {
Edwin Török36565e52009-06-30 17:10:35 +00003357class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman872996c2008-08-20 02:34:37 +00003358public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003359 DarwinI386TargetInfo(const llvm::Triple &Triple)
3360 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +00003361 LongDoubleWidth = 128;
3362 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003363 SuitableAlign = 128;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003364 MaxVectorAlign = 256;
Eli Friedman04ede302009-03-29 20:31:09 +00003365 SizeType = UnsignedLong;
3366 IntPtrType = SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07003367 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbar9451c542010-05-27 00:35:16 +00003368 HasAlignMac68kSupport = true;
Edwin Török2d98f9f2009-06-30 17:00:25 +00003369 }
3370
Eli Friedman872996c2008-08-20 02:34:37 +00003371};
Daniel Dunbar64c77a12009-06-29 20:52:51 +00003372} // end anonymous namespace
3373
3374namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +00003375// x86-32 Windows target
Michael J. Spencer01e70082010-10-21 05:21:48 +00003376class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman23cb7912008-08-21 01:40:19 +00003377public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003378 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3379 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattnera8a69e12009-06-24 17:12:15 +00003380 WCharType = UnsignedShort;
Eli Friedmanb28055e2009-06-08 21:16:17 +00003381 DoubleAlign = LongLongAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07003382 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedman23cb7912008-08-21 01:40:19 +00003383 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003384 void getTargetDefines(const LangOptions &Opts,
3385 MacroBuilder &Builder) const override {
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003386 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Eli Friedman23cb7912008-08-21 01:40:19 +00003387 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003388};
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003389
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003390// x86-32 Windows Visual Studio target
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003391class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003392public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003393 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramer9df08232013-06-29 16:37:14 +00003394 : WindowsX86_32TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003395 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003396 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003397 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003398 void getTargetDefines(const LangOptions &Opts,
3399 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003400 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003401 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003402 // The value of the following reflects processor type.
3403 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3404 // We lost the original triple, so we use the default.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003405 Builder.defineMacro("_M_IX86", "600");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003406 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003407};
3408} // end anonymous namespace
3409
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003410static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3411 Builder.defineMacro("__MSVCRT__");
3412 Builder.defineMacro("__MINGW32__");
3413
3414 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3415 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3416 // macro anyway for pre-processor compatibility.
3417 if (Opts.MicrosoftExt)
3418 Builder.defineMacro("__declspec", "__declspec");
3419 else
3420 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3421
3422 if (!Opts.MicrosoftExt) {
3423 // Provide macros for all the calling convention keywords. Provide both
3424 // single and double underscore prefixed variants. These are available on
3425 // x64 as well as x86, even though they have no effect.
3426 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3427 for (const char *CC : CCs) {
3428 std::string GCCSpelling = "__attribute__((__";
3429 GCCSpelling += CC;
3430 GCCSpelling += "__))";
3431 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3432 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3433 }
3434 }
3435}
3436
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003437namespace {
3438// x86-32 MinGW target
3439class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3440public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003441 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3442 : WindowsX86_32TargetInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07003443 void getTargetDefines(const LangOptions &Opts,
3444 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003445 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003446 DefineStd(Builder, "WIN32", Opts);
3447 DefineStd(Builder, "WINNT", Opts);
3448 Builder.defineMacro("_X86_");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003449 addMinGWDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003450 }
3451};
3452} // end anonymous namespace
3453
3454namespace {
3455// x86-32 Cygwin target
3456class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3457public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003458 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3459 : X86_32TargetInfo(Triple) {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003460 TLSSupported = false;
3461 WCharType = UnsignedShort;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003462 DoubleAlign = LongLongAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07003463 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003464 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003465 void getTargetDefines(const LangOptions &Opts,
3466 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003467 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumie72f4d92012-12-14 10:17:26 +00003468 Builder.defineMacro("_X86_");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003469 Builder.defineMacro("__CYGWIN__");
3470 Builder.defineMacro("__CYGWIN32__");
3471 DefineStd(Builder, "unix", Opts);
Douglas Gregor9b22a172010-04-21 05:52:38 +00003472 if (Opts.CPlusPlus)
3473 Builder.defineMacro("_GNU_SOURCE");
Eli Friedman6b6ca942009-06-08 06:11:14 +00003474 }
Eli Friedman23cb7912008-08-21 01:40:19 +00003475};
3476} // end anonymous namespace
3477
3478namespace {
Chris Lattnerf853e732010-04-11 19:29:39 +00003479// x86-32 Haiku target
3480class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3481public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003482 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerf853e732010-04-11 19:29:39 +00003483 SizeType = UnsignedLong;
Chris Lattner5b8b18a2010-04-22 17:48:00 +00003484 IntPtrType = SignedLong;
3485 PtrDiffType = SignedLong;
Eli Friedman6902e412012-11-27 02:58:24 +00003486 ProcessIDType = SignedLong;
Rafael Espindolaa7bdfdd2010-11-09 16:41:02 +00003487 this->UserLabelPrefix = "";
Benjamin Krameref7bcea2012-11-08 12:59:15 +00003488 this->TLSSupported = false;
Eli Friedman08f845b2010-08-22 01:00:03 +00003489 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003490 void getTargetDefines(const LangOptions &Opts,
3491 MacroBuilder &Builder) const override {
Chris Lattnerf853e732010-04-11 19:29:39 +00003492 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3493 Builder.defineMacro("__INTEL__");
3494 Builder.defineMacro("__HAIKU__");
3495 }
3496};
3497} // end anonymous namespace
3498
Douglas Gregordca52262011-07-01 22:41:14 +00003499// RTEMS Target
3500template<typename Target>
3501class RTEMSTargetInfo : public OSTargetInfo<Target> {
3502protected:
Stephen Hines651f13c2014-04-23 16:59:28 -07003503 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3504 MacroBuilder &Builder) const override {
Douglas Gregordca52262011-07-01 22:41:14 +00003505 // RTEMS defines; list based off of gcc output
3506
Douglas Gregordca52262011-07-01 22:41:14 +00003507 Builder.defineMacro("__rtems__");
3508 Builder.defineMacro("__ELF__");
3509 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003510
Douglas Gregordca52262011-07-01 22:41:14 +00003511public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003512 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3513 this->UserLabelPrefix = "";
Douglas Gregordca52262011-07-01 22:41:14 +00003514
Benjamin Kramer9df08232013-06-29 16:37:14 +00003515 switch (Triple.getArch()) {
3516 default:
3517 case llvm::Triple::x86:
3518 // this->MCountName = ".mcount";
3519 break;
3520 case llvm::Triple::mips:
3521 case llvm::Triple::mipsel:
3522 case llvm::Triple::ppc:
3523 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003524 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003525 // this->MCountName = "_mcount";
3526 break;
3527 case llvm::Triple::arm:
3528 // this->MCountName = "__mcount";
3529 break;
Douglas Gregordca52262011-07-01 22:41:14 +00003530 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003531 }
Douglas Gregordca52262011-07-01 22:41:14 +00003532};
3533
3534namespace {
3535// x86-32 RTEMS target
3536class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3537public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003538 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregordca52262011-07-01 22:41:14 +00003539 SizeType = UnsignedLong;
3540 IntPtrType = SignedLong;
3541 PtrDiffType = SignedLong;
3542 this->UserLabelPrefix = "";
3543 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003544 void getTargetDefines(const LangOptions &Opts,
3545 MacroBuilder &Builder) const override {
Douglas Gregordca52262011-07-01 22:41:14 +00003546 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3547 Builder.defineMacro("__INTEL__");
3548 Builder.defineMacro("__rtems__");
3549 }
3550};
3551} // end anonymous namespace
3552
Chris Lattnerf853e732010-04-11 19:29:39 +00003553namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00003554// x86-64 generic target
3555class X86_64TargetInfo : public X86TargetInfo {
3556public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003557 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Stephen Hines176edba2014-12-01 14:53:08 -08003558 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003559 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00003560 LongDoubleWidth = 128;
3561 LongDoubleAlign = 128;
Rafael Espindolabfa7c002010-06-04 23:15:27 +00003562 LargeArrayMinWidth = 128;
3563 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003564 SuitableAlign = 128;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003565 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3566 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3567 IntPtrType = IsX32 ? SignedInt : SignedLong;
3568 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003569 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00003570 RegParmMax = 6;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +00003571
Stephen Hines176edba2014-12-01 14:53:08 -08003572 // Pointers are 32-bit in x32.
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003573 DescriptionString = (IsX32)
Stephen Hines176edba2014-12-01 14:53:08 -08003574 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3575 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f94dbb2010-07-14 23:39:36 +00003576
3577 // Use fpret only for long double.
3578 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00003579
Anders Carlsson321b7ac2011-10-31 16:27:11 +00003580 // Use fp2ret for _Complex long double.
3581 ComplexLongDoubleUsesFP2Ret = true;
3582
Eli Friedman2be46072011-10-14 20:59:01 +00003583 // x86-64 has atomics up to 16 bytes.
Eli Friedman2be46072011-10-14 20:59:01 +00003584 MaxAtomicPromoteWidth = 128;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003585 MaxAtomicInlineWidth = 128;
Chris Lattner4b009652007-07-25 00:24:17 +00003586 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003587 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003588 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson7dd1c952007-11-24 23:38:12 +00003589 }
Michael J. Spencer3d796932010-10-18 07:10:59 +00003590
Stephen Hines651f13c2014-04-23 16:59:28 -07003591 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattneraa339182009-09-23 06:06:36 +00003592 if (RegNo == 0) return 0;
3593 if (RegNo == 1) return 1;
3594 return -1;
3595 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003596
Stephen Hines651f13c2014-04-23 16:59:28 -07003597 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davise8519c32013-08-30 04:39:01 +00003598 return (CC == CC_C ||
Stephen Hines176edba2014-12-01 14:53:08 -08003599 CC == CC_X86VectorCall ||
Charles Davise8519c32013-08-30 04:39:01 +00003600 CC == CC_IntelOclBicc ||
3601 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003602 }
3603
Stephen Hines651f13c2014-04-23 16:59:28 -07003604 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballmanfff32482012-12-09 17:45:41 +00003605 return CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003606 }
3607
Stephen Hines176edba2014-12-01 14:53:08 -08003608 // for x32 we need it here explicitly
3609 bool hasInt128Type() const override { return true; }
Eli Friedman872996c2008-08-20 02:34:37 +00003610};
3611} // end anonymous namespace
3612
3613namespace {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003614// x86-64 Windows target
Michael J. Spencer01e70082010-10-21 05:21:48 +00003615class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003616public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003617 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3618 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003619 WCharType = UnsignedShort;
Mike Stump4da7a162009-10-08 23:00:00 +00003620 LongWidth = LongAlign = 32;
Michael J. Spencer3d796932010-10-18 07:10:59 +00003621 DoubleAlign = LongLongAlign = 64;
Nate Begeman472bd992010-07-21 02:02:56 +00003622 IntMaxType = SignedLongLong;
Nate Begeman472bd992010-07-21 02:02:56 +00003623 Int64Type = SignedLongLong;
Cameron Esfahani32083822010-09-15 00:28:12 +00003624 SizeType = UnsignedLongLong;
3625 PtrDiffType = SignedLongLong;
3626 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00003627 this->UserLabelPrefix = "";
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003628 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003629
Stephen Hines651f13c2014-04-23 16:59:28 -07003630 void getTargetDefines(const LangOptions &Opts,
3631 MacroBuilder &Builder) const override {
Michael J. Spencer01e70082010-10-21 05:21:48 +00003632 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003633 Builder.defineMacro("_WIN64");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003634 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003635
Stephen Hines651f13c2014-04-23 16:59:28 -07003636 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003637 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumi79521992011-01-17 22:56:23 +00003638 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003639
Stephen Hines651f13c2014-04-23 16:59:28 -07003640 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003641 switch (CC) {
3642 case CC_X86StdCall:
3643 case CC_X86ThisCall:
3644 case CC_X86FastCall:
3645 return CCCR_Ignore;
3646 case CC_C:
3647 case CC_X86VectorCall:
3648 case CC_IntelOclBicc:
3649 case CC_X86_64SysV:
3650 return CCCR_OK;
3651 default:
3652 return CCCR_Warning;
3653 }
Charles Davise8519c32013-08-30 04:39:01 +00003654 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003655};
3656} // end anonymous namespace
3657
3658namespace {
3659// x86-64 Windows Visual Studio target
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003660class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003661public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003662 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramer9df08232013-06-29 16:37:14 +00003663 : WindowsX86_64TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003664 LongDoubleWidth = LongDoubleAlign = 64;
3665 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003666 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003667 void getTargetDefines(const LangOptions &Opts,
3668 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003669 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003670 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003671 Builder.defineMacro("_M_X64");
Michael J. Spencer01e70082010-10-21 05:21:48 +00003672 Builder.defineMacro("_M_AMD64");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003673 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003674};
3675} // end anonymous namespace
3676
3677namespace {
3678// x86-64 MinGW target
3679class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3680public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003681 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3682 : WindowsX86_64TargetInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07003683 void getTargetDefines(const LangOptions &Opts,
3684 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003685 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003686 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003687 Builder.defineMacro("__MINGW64__");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003688 addMinGWDefines(Opts, Builder);
Stephen Hines176edba2014-12-01 14:53:08 -08003689
3690 // GCC defines this macro when it is using __gxx_personality_seh0.
3691 if (!Opts.SjLjExceptions)
3692 Builder.defineMacro("__SEH__");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003693 }
3694};
3695} // end anonymous namespace
3696
3697namespace {
Eli Friedman38e31802009-07-01 03:36:11 +00003698class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3699public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003700 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3701 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman38e31802009-07-01 03:36:11 +00003702 Int64Type = SignedLongLong;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003703 MaxVectorAlign = 256;
Stephen Hines651f13c2014-04-23 16:59:28 -07003704 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3705 llvm::Triple T = llvm::Triple(Triple);
Stephen Hines176edba2014-12-01 14:53:08 -08003706 if (T.isiOS())
Stephen Hines651f13c2014-04-23 16:59:28 -07003707 UseSignedCharForObjCBool = false;
3708 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman38e31802009-07-01 03:36:11 +00003709 }
3710};
3711} // end anonymous namespace
3712
3713namespace {
Eli Friedman96ada022009-07-05 22:31:18 +00003714class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3715public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003716 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3717 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman96ada022009-07-05 22:31:18 +00003718 IntMaxType = SignedLongLong;
Eli Friedman96ada022009-07-05 22:31:18 +00003719 Int64Type = SignedLongLong;
3720 }
3721};
3722} // end anonymous namespace
3723
3724namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003725class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3726public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003727 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3728 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3729 IntMaxType = SignedLongLong;
Benjamin Kramer9df08232013-06-29 16:37:14 +00003730 Int64Type = SignedLongLong;
Eli Friedman42f74f22012-08-08 23:57:20 +00003731 }
3732};
Tim Northoverc264e162013-01-31 12:13:10 +00003733}
3734
Eli Friedman42f74f22012-08-08 23:57:20 +00003735
3736namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00003737class ARMTargetInfo : public TargetInfo {
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003738 // Possible FPU choices.
3739 enum FPUMode {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003740 VFP2FPU = (1 << 0),
3741 VFP3FPU = (1 << 1),
3742 VFP4FPU = (1 << 2),
Bernard Ogdenf779e652013-10-24 18:32:51 +00003743 NeonFPU = (1 << 3),
3744 FPARMV8 = (1 << 4)
Daniel Dunbara91320b2009-12-21 23:28:17 +00003745 };
3746
Silviu Baranga1db2e272013-10-21 10:54:53 +00003747 // Possible HWDiv features.
3748 enum HWDivMode {
3749 HWDivThumb = (1 << 0),
3750 HWDivARM = (1 << 1)
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003751 };
3752
3753 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenf779e652013-10-24 18:32:51 +00003754 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003755 }
3756
3757 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3758 static const char * const GCCRegNames[];
Daniel Dunbar40b774e2009-09-17 07:03:19 +00003759
Daniel Dunbar33b40752009-12-18 18:42:37 +00003760 std::string ABI, CPU;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003761
Rafael Espindola5389b842013-08-21 21:59:03 +00003762 enum {
3763 FP_Default,
3764 FP_VFP,
3765 FP_Neon
3766 } FPMath;
3767
Bernard Ogdenf779e652013-10-24 18:32:51 +00003768 unsigned FPU : 5;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003769
Logan Chieneae5a8202012-10-10 06:56:20 +00003770 unsigned IsAAPCS : 1;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003771 unsigned IsThumb : 1;
Silviu Baranga1db2e272013-10-21 10:54:53 +00003772 unsigned HWDiv : 2;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003773
3774 // Initialized via features.
3775 unsigned SoftFloat : 1;
3776 unsigned SoftFloatABI : 1;
Daniel Dunbar0d83d512009-09-14 00:35:03 +00003777
Bernard Ogden909f35a2013-10-29 09:47:51 +00003778 unsigned CRC : 1;
Stephen Hines651f13c2014-04-23 16:59:28 -07003779 unsigned Crypto : 1;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003780
Stephen Hines176edba2014-12-01 14:53:08 -08003781 // ACLE 6.5.1 Hardware floating point
3782 enum {
3783 HW_FP_HP = (1 << 1), /// half (16-bit)
3784 HW_FP_SP = (1 << 2), /// single (32-bit)
3785 HW_FP_DP = (1 << 3), /// double (64-bit)
3786 };
3787 uint32_t HW_FP;
3788
Chris Lattnerb4527522010-03-03 19:03:45 +00003789 static const Builtin::Info BuiltinInfo[];
3790
Rafael Espindola620c0af2013-05-13 20:09:47 +00003791 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola620c0af2013-05-13 20:09:47 +00003792 StringRef ArchName = T.getArchName();
Stephen Hines651f13c2014-04-23 16:59:28 -07003793 if (T.getArch() == llvm::Triple::arm ||
3794 T.getArch() == llvm::Triple::armeb) {
3795 StringRef VersionStr;
3796 if (ArchName.startswith("armv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003797 VersionStr = ArchName.substr(4, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003798 else if (ArchName.startswith("armebv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003799 VersionStr = ArchName.substr(6, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003800 else
Rafael Espindola69db5552013-05-14 00:44:24 +00003801 return false;
Rafael Espindola69db5552013-05-14 00:44:24 +00003802 unsigned Version;
3803 if (VersionStr.getAsInteger(10, Version))
3804 return false;
3805 return Version >= 6;
3806 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003807 assert(T.getArch() == llvm::Triple::thumb ||
3808 T.getArch() == llvm::Triple::thumbeb);
3809 StringRef VersionStr;
3810 if (ArchName.startswith("thumbv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003811 VersionStr = ArchName.substr(6, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003812 else if (ArchName.startswith("thumbebv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003813 VersionStr = ArchName.substr(8, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003814 else
Rafael Espindola69db5552013-05-14 00:44:24 +00003815 return false;
Rafael Espindola69db5552013-05-14 00:44:24 +00003816 unsigned Version;
3817 if (VersionStr.getAsInteger(10, Version))
3818 return false;
3819 return Version >= 7;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003820 }
3821
Stephen Hines651f13c2014-04-23 16:59:28 -07003822 void setABIAAPCS() {
3823 IsAAPCS = true;
3824
3825 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
3826 const llvm::Triple &T = getTriple();
3827
Stephen Hines176edba2014-12-01 14:53:08 -08003828 // size_t is unsigned long on MachO-derived environments and NetBSD.
3829 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Bill Wendling85ad3892013-12-02 19:19:57 +00003830 SizeType = UnsignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07003831 else
3832 SizeType = UnsignedInt;
3833
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003834 switch (T.getOS()) {
3835 case llvm::Triple::NetBSD:
Bill Wendling604470b2013-12-01 04:22:48 +00003836 WCharType = SignedInt;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003837 break;
3838 case llvm::Triple::Win32:
3839 WCharType = UnsignedShort;
3840 break;
3841 case llvm::Triple::Linux:
3842 default:
Bill Wendling604470b2013-12-01 04:22:48 +00003843 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3844 WCharType = UnsignedInt;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003845 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07003846 }
3847
3848 UseBitFieldTypeAlignment = true;
3849
3850 ZeroLengthBitfieldBoundary = 0;
3851
Stephen Hines176edba2014-12-01 14:53:08 -08003852 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3853 // so set preferred for small types to 32.
3854 if (T.isOSBinFormatMachO()) {
3855 DescriptionString =
3856 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3857 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3858 } else if (T.isOSWindows()) {
3859 // FIXME: this is invalid for WindowsCE
3860 assert(!BigEndian && "Windows on ARM does not support big endian");
3861 DescriptionString = "e"
3862 "-m:e"
3863 "-p:32:32"
3864 "-i64:64"
3865 "-v128:64:128"
3866 "-a:0:32"
3867 "-n32"
3868 "-S64";
Stephen Hines651f13c2014-04-23 16:59:28 -07003869 } else {
Stephen Hines176edba2014-12-01 14:53:08 -08003870 DescriptionString =
3871 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3872 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Stephen Hines651f13c2014-04-23 16:59:28 -07003873 }
3874
3875 // FIXME: Enumerated types are variable width in straight AAPCS.
3876 }
3877
3878 void setABIAPCS() {
3879 const llvm::Triple &T = getTriple();
3880
3881 IsAAPCS = false;
3882
3883 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
3884
3885 // size_t is unsigned int on FreeBSD.
3886 if (T.getOS() == llvm::Triple::FreeBSD)
Bill Wendling85ad3892013-12-02 19:19:57 +00003887 SizeType = UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -07003888 else
3889 SizeType = UnsignedLong;
3890
3891 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3892 WCharType = SignedInt;
3893
3894 // Do not respect the alignment of bit-field types when laying out
3895 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3896 UseBitFieldTypeAlignment = false;
3897
3898 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3899 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3900 /// gcc.
3901 ZeroLengthBitfieldBoundary = 32;
3902
Stephen Hines176edba2014-12-01 14:53:08 -08003903 if (T.isOSBinFormatMachO())
3904 DescriptionString =
3905 BigEndian
3906 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3907 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3908 else
3909 DescriptionString =
3910 BigEndian
3911 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3912 : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
Stephen Hines651f13c2014-04-23 16:59:28 -07003913
3914 // FIXME: Override "preferred align" for double and long long.
3915 }
3916
3917public:
3918 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
3919 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Stephen Hines176edba2014-12-01 14:53:08 -08003920 IsAAPCS(true), HW_FP(0) {
Stephen Hines651f13c2014-04-23 16:59:28 -07003921 BigEndian = IsBigEndian;
3922
3923 switch (getTriple().getOS()) {
3924 case llvm::Triple::NetBSD:
3925 PtrDiffType = SignedLong;
3926 break;
3927 default:
Bill Wendling85ad3892013-12-02 19:19:57 +00003928 PtrDiffType = SignedInt;
Bill Wendling604470b2013-12-01 04:22:48 +00003929 break;
3930 }
Daniel Dunbarf0156562009-09-17 16:21:10 +00003931
Chris Lattnere20b8122010-04-23 16:29:58 +00003932 // {} in inline assembly are neon specifiers, not assembly variant
3933 // specifiers.
3934 NoAsmVariants = true;
Michael J. Spencerd5513a32010-10-21 03:16:25 +00003935
Daniel Dunbar33b40752009-12-18 18:42:37 +00003936 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0a542ca2009-12-18 19:57:13 +00003937 IsThumb = getTriple().getArchName().startswith("thumb");
Stephen Hines651f13c2014-04-23 16:59:28 -07003938
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003939 // FIXME: This duplicates code from the driver that sets the -target-abi
3940 // option - this code is used if -target-abi isn't passed and should
3941 // be unified in some way.
3942 if (Triple.isOSBinFormatMachO()) {
3943 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3944 // the frontend matches that.
3945 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3946 Triple.getOS() == llvm::Triple::UnknownOS ||
3947 StringRef(CPU).startswith("cortex-m")) {
3948 setABI("aapcs");
3949 } else {
3950 setABI("apcs-gnu");
3951 }
3952 } else if (Triple.isOSWindows()) {
3953 // FIXME: this is invalid for WindowsCE
3954 setABI("aapcs");
3955 } else {
3956 // Select the default based on the platform.
3957 switch (Triple.getEnvironment()) {
3958 case llvm::Triple::Android:
3959 case llvm::Triple::GNUEABI:
3960 case llvm::Triple::GNUEABIHF:
3961 setABI("aapcs-linux");
3962 break;
3963 case llvm::Triple::EABIHF:
3964 case llvm::Triple::EABI:
3965 setABI("aapcs");
3966 break;
3967 case llvm::Triple::GNU:
3968 setABI("apcs-gnu");
3969 break;
3970 default:
3971 if (Triple.getOS() == llvm::Triple::NetBSD)
3972 setABI("apcs-gnu");
3973 else
3974 setABI("aapcs");
3975 break;
3976 }
3977 }
John McCall68086b92010-08-21 22:46:04 +00003978
3979 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00003980 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00003981
3982 // ARM has atomics up to 8 bytes
Eli Friedman2be46072011-10-14 20:59:01 +00003983 MaxAtomicPromoteWidth = 64;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003984 if (shouldUseInlineAtomic(getTriple()))
3985 MaxAtomicInlineWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00003986
3987 // Do force alignment of members that follow zero length bitfields. If
Stephen Hines176edba2014-12-01 14:53:08 -08003988 // the alignment of the zero-length bitfield is greater than the member
3989 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloye45b9b72012-03-12 09:14:10 +00003990 // zero length bitfield.
3991 UseZeroLengthBitfieldAlignment = true;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00003992 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003993 StringRef getABI() const override { return ABI; }
Stephen Hines651f13c2014-04-23 16:59:28 -07003994 bool setABI(const std::string &Name) override {
Daniel Dunbar0d83d512009-09-14 00:35:03 +00003995 ABI = Name;
3996
Daniel Dunbarb9531632009-09-14 00:02:24 +00003997 // The defaults (above) are for AAPCS, check if we need to change them.
3998 //
3999 // FIXME: We need support for -meabi... we could just mangle it into the
4000 // name.
4001 if (Name == "apcs-gnu") {
Stephen Hines651f13c2014-04-23 16:59:28 -07004002 setABIAPCS();
4003 return true;
4004 }
4005 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4006 setABIAAPCS();
4007 return true;
4008 }
4009 return false;
Daniel Dunbarb9531632009-09-14 00:02:24 +00004010 }
Daniel Dunbar48075d82009-12-19 04:15:38 +00004011
Stephen Hines651f13c2014-04-23 16:59:28 -07004012 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangac6c9cf42013-10-21 10:59:33 +00004013 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar96be2a42009-12-21 23:28:17 +00004014 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4015 Features["vfp2"] = true;
Stephen Hines176edba2014-12-01 14:53:08 -08004016 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golin1302f9f2013-09-13 17:02:45 +00004017 Features["vfp3"] = true;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00004018 Features["neon"] = true;
Silviu Barangac6c9cf42013-10-21 10:59:33 +00004019 }
4020 else if (CPU == "cortex-a5") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00004021 Features["vfp4"] = true;
4022 Features["neon"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004023 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4024 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Stephen Hines176edba2014-12-01 14:53:08 -08004025 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangac6c9cf42013-10-21 10:59:33 +00004026 Features["vfp4"] = true;
4027 Features["neon"] = true;
4028 Features["hwdiv"] = true;
4029 Features["hwdiv-arm"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004030 } else if (CPU == "cyclone") {
4031 Features["v8fp"] = true;
4032 Features["neon"] = true;
4033 Features["hwdiv"] = true;
4034 Features["hwdiv-arm"] = true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004035 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenf779e652013-10-24 18:32:51 +00004036 Features["fp-armv8"] = true;
4037 Features["neon"] = true;
4038 Features["hwdiv"] = true;
4039 Features["hwdiv-arm"] = true;
Bernard Ogden909f35a2013-10-29 09:47:51 +00004040 Features["crc"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004041 Features["crypto"] = true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004042 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangac6c9cf42013-10-21 10:59:33 +00004043 // Enable the hwdiv extension for all v8a AArch32 cores by
4044 // default.
4045 ArchName == "armv8a" || ArchName == "armv8" ||
Stephen Hines651f13c2014-04-23 16:59:28 -07004046 ArchName == "armebv8a" || ArchName == "armebv8" ||
4047 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4048 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangac6c9cf42013-10-21 10:59:33 +00004049 Features["hwdiv"] = true;
4050 Features["hwdiv-arm"] = true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004051 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
4052 CPU == "sc300") {
Stephen Hines651f13c2014-04-23 16:59:28 -07004053 Features["hwdiv"] = true;
Bob Wilsoncfaab002012-09-29 23:52:52 +00004054 }
Daniel Dunbar96be2a42009-12-21 23:28:17 +00004055 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +00004056
Stephen Hines651f13c2014-04-23 16:59:28 -07004057 bool handleTargetFeatures(std::vector<std::string> &Features,
4058 DiagnosticsEngine &Diags) override {
Bob Wilsoncfaab002012-09-29 23:52:52 +00004059 FPU = 0;
Bernard Ogden909f35a2013-10-29 09:47:51 +00004060 CRC = 0;
Stephen Hines651f13c2014-04-23 16:59:28 -07004061 Crypto = 0;
Daniel Dunbar48075d82009-12-19 04:15:38 +00004062 SoftFloat = SoftFloatABI = false;
Silviu Baranga1db2e272013-10-21 10:54:53 +00004063 HWDiv = 0;
Stephen Hines176edba2014-12-01 14:53:08 -08004064
4065 for (const auto &Feature : Features) {
4066 if (Feature == "+soft-float") {
Daniel Dunbar48075d82009-12-19 04:15:38 +00004067 SoftFloat = true;
Stephen Hines176edba2014-12-01 14:53:08 -08004068 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar48075d82009-12-19 04:15:38 +00004069 SoftFloatABI = true;
Stephen Hines176edba2014-12-01 14:53:08 -08004070 } else if (Feature == "+vfp2") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00004071 FPU |= VFP2FPU;
Stephen Hines176edba2014-12-01 14:53:08 -08004072 HW_FP = HW_FP_SP | HW_FP_DP;
4073 } else if (Feature == "+vfp3") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00004074 FPU |= VFP3FPU;
Stephen Hines176edba2014-12-01 14:53:08 -08004075 HW_FP = HW_FP_SP | HW_FP_DP;
4076 } else if (Feature == "+vfp4") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00004077 FPU |= VFP4FPU;
Stephen Hines176edba2014-12-01 14:53:08 -08004078 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4079 } else if (Feature == "+fp-armv8") {
Bernard Ogdenf779e652013-10-24 18:32:51 +00004080 FPU |= FPARMV8;
Stephen Hines176edba2014-12-01 14:53:08 -08004081 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4082 } else if (Feature == "+neon") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00004083 FPU |= NeonFPU;
Stephen Hines176edba2014-12-01 14:53:08 -08004084 HW_FP = HW_FP_SP | HW_FP_DP;
4085 } else if (Feature == "+long64") {
Stephen Hines64f85312011-10-21 14:54:52 -07004086 LongWidth = LongAlign = 64; // RenderScript uses a 64-bit long type
Stephen Hines176edba2014-12-01 14:53:08 -08004087 } else if (Feature == "+hwdiv") {
Silviu Baranga1db2e272013-10-21 10:54:53 +00004088 HWDiv |= HWDivThumb;
Stephen Hines176edba2014-12-01 14:53:08 -08004089 } else if (Feature == "+hwdiv-arm") {
Silviu Baranga1db2e272013-10-21 10:54:53 +00004090 HWDiv |= HWDivARM;
Stephen Hines176edba2014-12-01 14:53:08 -08004091 } else if (Feature == "+crc") {
Bernard Ogden909f35a2013-10-29 09:47:51 +00004092 CRC = 1;
Stephen Hines176edba2014-12-01 14:53:08 -08004093 } else if (Feature == "+crypto") {
Stephen Hines651f13c2014-04-23 16:59:28 -07004094 Crypto = 1;
Stephen Hines176edba2014-12-01 14:53:08 -08004095 } else if (Feature == "+fp-only-sp") {
4096 HW_FP &= ~HW_FP_DP;
4097 }
Daniel Dunbar48075d82009-12-19 04:15:38 +00004098 }
4099
Rafael Espindola5389b842013-08-21 21:59:03 +00004100 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4101 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4102 return false;
4103 }
4104
4105 if (FPMath == FP_Neon)
4106 Features.push_back("+neonfp");
4107 else if (FPMath == FP_VFP)
4108 Features.push_back("-neonfp");
4109
Daniel Dunbar48075d82009-12-19 04:15:38 +00004110 // Remove front-end specific options which the backend handles differently.
Stephen Hines176edba2014-12-01 14:53:08 -08004111 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4112 for (const auto &FEFeature : FrontEndFeatures) {
4113 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4114 if (Feature != Features.end())
4115 Features.erase(Feature);
4116 }
4117
Rafael Espindola5389b842013-08-21 21:59:03 +00004118 return true;
Daniel Dunbar48075d82009-12-19 04:15:38 +00004119 }
4120
Stephen Hines651f13c2014-04-23 16:59:28 -07004121 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00004122 return llvm::StringSwitch<bool>(Feature)
4123 .Case("arm", true)
4124 .Case("softfloat", SoftFloat)
4125 .Case("thumb", IsThumb)
Amara Emerson2440fb12013-09-16 18:07:35 +00004126 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Baranga1db2e272013-10-21 10:54:53 +00004127 .Case("hwdiv", HWDiv & HWDivThumb)
4128 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregore727d212012-01-30 06:38:25 +00004129 .Default(false);
4130 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004131 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00004132 static const char *getCPUDefineSuffix(StringRef Name) {
Stephen Hines176edba2014-12-01 14:53:08 -08004133 return llvm::StringSwitch<const char *>(Name)
4134 .Cases("arm8", "arm810", "4")
4135 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4136 "4")
4137 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4138 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4139 .Case("ep9312", "4T")
4140 .Cases("arm10tdmi", "arm1020t", "5T")
4141 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4142 .Case("arm926ej-s", "5TEJ")
4143 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4144 .Cases("xscale", "iwmmxt", "5TE")
4145 .Case("arm1136j-s", "6J")
4146 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4147 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4148 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4149 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4150 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4151 "7A")
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004152 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "7R")
Stephen Hines176edba2014-12-01 14:53:08 -08004153 .Case("swift", "7S")
4154 .Case("cyclone", "8A")
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004155 .Cases("sc300", "cortex-m3", "7M")
Stephen Hines176edba2014-12-01 14:53:08 -08004156 .Cases("cortex-m4", "cortex-m7", "7EM")
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004157 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
4158 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Stephen Hines176edba2014-12-01 14:53:08 -08004159 .Default(nullptr);
Daniel Dunbar33b40752009-12-18 18:42:37 +00004160 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004161 static const char *getCPUProfile(StringRef Name) {
Stephen Hines176edba2014-12-01 14:53:08 -08004162 return llvm::StringSwitch<const char *>(Name)
4163 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4164 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4165 "A")
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004166 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
4167 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4168 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
4169 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "R")
Stephen Hines176edba2014-12-01 14:53:08 -08004170 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004171 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004172 bool setCPU(const std::string &Name) override {
Daniel Dunbar33b40752009-12-18 18:42:37 +00004173 if (!getCPUDefineSuffix(Name))
4174 return false;
4175
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004176 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4177 StringRef Profile = getCPUProfile(Name);
4178 if (Profile == "M" && MaxAtomicInlineWidth) {
4179 MaxAtomicPromoteWidth = 32;
4180 MaxAtomicInlineWidth = 32;
4181 }
4182
Daniel Dunbar33b40752009-12-18 18:42:37 +00004183 CPU = Name;
4184 return true;
4185 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004186 bool setFPMath(StringRef Name) override;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004187 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4188 unsigned CPUArchVer) const {
4189 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4190 (CPUArch.find('M') != StringRef::npos);
4191 }
4192 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4193 unsigned CPUArchVer) const {
4194 // We check both CPUArchVer and ArchName because when only triple is
4195 // specified, the default CPU is arm1136j-s.
4196 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4197 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4198 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004199 void getTargetDefines(const LangOptions &Opts,
4200 MacroBuilder &Builder) const override {
Chris Lattnerbef1d722009-03-02 22:27:17 +00004201 // Target identification.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004202 Builder.defineMacro("__arm");
4203 Builder.defineMacro("__arm__");
Anton Korobeynikove7772382009-05-03 13:42:53 +00004204
Chris Lattnerbef1d722009-03-02 22:27:17 +00004205 // Target properties.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004206 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbar33b40752009-12-18 18:42:37 +00004207
Chris Lattner5f9e2722011-07-23 10:55:15 +00004208 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden51f997d2013-10-24 18:32:44 +00004209 unsigned int CPUArchVer;
Stephen Hines176edba2014-12-01 14:53:08 -08004210 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden51f997d2013-10-24 18:32:44 +00004211 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004212 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004213
4214 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004215 StringRef CPUProfile = getCPUProfile(CPU);
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004216 StringRef ArchName = getTriple().getArchName();
4217
4218 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4219 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Stephen Hines176edba2014-12-01 14:53:08 -08004220 if (CPUArch[0] >= '8') {
4221 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4222 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
4223 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004224
4225 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4226 // is not defined for the M-profile.
4227 // NOTE that the deffault profile is assumed to be 'A'
4228 if (CPUProfile.empty() || CPUProfile != "M")
4229 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4230
4231 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4232 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4233 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4234 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4235 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4236 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4237 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4238
4239 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4240 // instruction set such as ARM or Thumb.
4241 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4242
4243 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4244
4245 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004246 if (!CPUProfile.empty())
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004247 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
4248
Stephen Hines176edba2014-12-01 14:53:08 -08004249 // ACLE 6.5.1 Hardware Floating Point
4250 if (HW_FP)
4251 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
4252
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004253 // ACLE predefines.
4254 Builder.defineMacro("__ARM_ACLE", "200");
Stephen Hines651f13c2014-04-23 16:59:28 -07004255
Mike Stumpf90a29f2009-04-08 02:07:04 +00004256 // Subtarget options.
Daniel Dunbarf0156562009-09-17 16:21:10 +00004257
Daniel Dunbar33b40752009-12-18 18:42:37 +00004258 // FIXME: It's more complicated than this and we don't really support
4259 // interworking.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004260 // Windows on ARM does not "support" interworking
4261 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004262 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00004263
David Tweedb16abb12012-10-25 13:33:01 +00004264 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northover9b796302013-11-11 19:11:22 +00004265 // Embedded targets on Darwin follow AAPCS, but not EABI.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004266 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4267 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbar849289e2012-10-22 18:51:13 +00004268 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004269 Builder.defineMacro("__ARM_PCS", "1");
4270
David Tweedb16abb12012-10-25 13:33:01 +00004271 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004272 Builder.defineMacro("__ARM_PCS_VFP", "1");
4273 }
Daniel Dunbar33b40752009-12-18 18:42:37 +00004274
Daniel Dunbar48075d82009-12-19 04:15:38 +00004275 if (SoftFloat)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004276 Builder.defineMacro("__SOFTFP__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00004277
4278 if (CPU == "xscale")
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004279 Builder.defineMacro("__XSCALE__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00004280
4281 if (IsThumb) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004282 Builder.defineMacro("__THUMBEL__");
4283 Builder.defineMacro("__thumb__");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004284 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004285 Builder.defineMacro("__thumb2__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00004286 }
Silviu Baranga1db2e272013-10-21 10:54:53 +00004287 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4288 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbarf0156562009-09-17 16:21:10 +00004289
4290 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004291 Builder.defineMacro("__APCS_32__");
Daniel Dunbar96be2a42009-12-21 23:28:17 +00004292
Bob Wilsoncfaab002012-09-29 23:52:52 +00004293 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004294 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00004295 if (FPU & VFP2FPU)
4296 Builder.defineMacro("__ARM_VFPV2__");
4297 if (FPU & VFP3FPU)
4298 Builder.defineMacro("__ARM_VFPV3__");
4299 if (FPU & VFP4FPU)
4300 Builder.defineMacro("__ARM_VFPV4__");
4301 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004302
Daniel Dunbar96be2a42009-12-21 23:28:17 +00004303 // This only gets set when Neon instructions are actually available, unlike
4304 // the VFP define, hence the soft float and arch check. This is subtly
4305 // different from gcc, we follow the intent which was that it should be set
4306 // when Neon instructions are actually available.
Stephen Hines651f13c2014-04-23 16:59:28 -07004307 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4308 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004309 Builder.defineMacro("__ARM_NEON__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004310 }
4311
4312 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4313 Opts.ShortWChar ? "2" : "4");
4314
4315 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4316 Opts.ShortEnums ? "1" : "4");
Joey Gouly520ec1e2013-09-18 10:07:09 +00004317
Bernard Ogden909f35a2013-10-29 09:47:51 +00004318 if (CRC)
Joey Gouly520ec1e2013-09-18 10:07:09 +00004319 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao8712ded2013-09-30 22:51:32 +00004320
Stephen Hines651f13c2014-04-23 16:59:28 -07004321 if (Crypto)
4322 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4323
Bernard Ogden51f997d2013-10-24 18:32:44 +00004324 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao8712ded2013-09-30 22:51:32 +00004325 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4326 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4327 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4328 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4329 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004330
4331 bool is5EOrAbove = (CPUArchVer >= 6 ||
4332 (CPUArchVer == 5 &&
4333 CPUArch.find('E') != StringRef::npos));
4334 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4335 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4336 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner9fd73612008-04-21 18:56:49 +00004337 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004338 void getTargetBuiltins(const Builtin::Info *&Records,
4339 unsigned &NumRecords) const override {
Chris Lattnerb4527522010-03-03 19:03:45 +00004340 Records = BuiltinInfo;
4341 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner9fd73612008-04-21 18:56:49 +00004342 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004343 bool isCLZForZeroUndef() const override { return false; }
4344 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chieneae5a8202012-10-10 06:56:20 +00004345 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner9fd73612008-04-21 18:56:49 +00004346 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004347 void getGCCRegNames(const char * const *&Names,
4348 unsigned &NumNames) const override;
4349 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4350 unsigned &NumAliases) const override;
4351 bool validateAsmConstraint(const char *&Name,
4352 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson36834a72009-02-28 17:11:49 +00004353 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00004354 default: break;
Nate Begeman222823a2008-04-22 05:03:19 +00004355 case 'l': // r0-r7
4356 case 'h': // r8-r15
4357 case 'w': // VFP Floating point register single precision
4358 case 'P': // VFP Floating point register double precision
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00004359 Info.setAllowsRegister();
Nate Begeman222823a2008-04-22 05:03:19 +00004360 return true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004361 case 'I':
4362 case 'J':
4363 case 'K':
4364 case 'L':
4365 case 'M':
4366 // FIXME
4367 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00004368 case 'Q': // A memory address that is a single base register.
4369 Info.setAllowsMemory();
4370 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00004371 case 'U': // a memory reference...
4372 switch (Name[1]) {
4373 case 'q': // ...ARMV4 ldrsb
4374 case 'v': // ...VFP load/store (reg+constant offset)
4375 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00004376 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00004377 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00004378 case 'n': // valid address for Neon doubleword vector load/store
4379 case 'm': // valid address for Neon element and structure load/store
4380 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00004381 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00004382 Info.setAllowsMemory();
4383 Name++;
4384 return true;
4385 }
Nate Begeman222823a2008-04-22 05:03:19 +00004386 }
Chris Lattner9fd73612008-04-21 18:56:49 +00004387 return false;
4388 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004389 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings002333f2011-06-07 23:45:05 +00004390 std::string R;
4391 switch (*Constraint) {
4392 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00004393 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00004394 Constraint++;
4395 break;
Eric Christopher283f4472011-06-17 00:40:18 +00004396 case 'p': // 'p' should be translated to 'r' by default.
4397 R = std::string("r");
4398 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00004399 default:
4400 return std::string(1, *Constraint);
4401 }
4402 return R;
4403 }
Stephen Hines176edba2014-12-01 14:53:08 -08004404 bool
4405 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
4406 std::string &SuggestedModifier) const override {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004407 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00004408 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004409
Bill Wendling50d46ca2012-10-25 23:28:48 +00004410 // Strip off constraint modifiers.
4411 while (Constraint[0] == '=' ||
4412 Constraint[0] == '+' ||
4413 Constraint[0] == '&')
4414 Constraint = Constraint.substr(1);
4415
4416 switch (Constraint[0]) {
4417 default: break;
4418 case 'r': {
4419 switch (Modifier) {
4420 default:
Bill Wendlingdd6669d2013-12-09 02:58:56 +00004421 return (isInOut || isOutput || Size <= 64);
Bill Wendling50d46ca2012-10-25 23:28:48 +00004422 case 'q':
4423 // A register of size 32 cannot fit a vector type.
4424 return false;
4425 }
4426 }
4427 }
4428
4429 return true;
4430 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004431 const char *getClobbers() const override {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004432 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +00004433 return "";
4434 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00004435
Stephen Hines651f13c2014-04-23 16:59:28 -07004436 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballman82bfa192012-10-02 14:26:08 +00004437 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4438 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004439
Stephen Hines651f13c2014-04-23 16:59:28 -07004440 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chiena8f7a972013-02-23 04:24:36 +00004441 if (RegNo == 0) return 0;
4442 if (RegNo == 1) return 1;
4443 return -1;
4444 }
Chris Lattner9fd73612008-04-21 18:56:49 +00004445};
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004446
Rafael Espindola5389b842013-08-21 21:59:03 +00004447bool ARMTargetInfo::setFPMath(StringRef Name) {
4448 if (Name == "neon") {
4449 FPMath = FP_Neon;
4450 return true;
4451 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4452 Name == "vfp4") {
4453 FPMath = FP_VFP;
4454 return true;
4455 }
4456 return false;
4457}
4458
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004459const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004460 // Integer registers
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004461 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004462 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4463
4464 // Float registers
4465 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4466 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4467 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004468 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004469
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004470 // Double registers
4471 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4472 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesen0d79b042010-10-28 01:05:37 +00004473 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4474 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004475
4476 // Quad registers
Dale Johannesen0d79b042010-10-28 01:05:37 +00004477 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4478 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004479};
4480
4481void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar00ea8f02010-08-11 02:17:11 +00004482 unsigned &NumNames) const {
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004483 Names = GCCRegNames;
4484 NumNames = llvm::array_lengthof(GCCRegNames);
4485}
4486
4487const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004488 { { "a1" }, "r0" },
4489 { { "a2" }, "r1" },
4490 { { "a3" }, "r2" },
4491 { { "a4" }, "r3" },
4492 { { "v1" }, "r4" },
4493 { { "v2" }, "r5" },
4494 { { "v3" }, "r6" },
4495 { { "v4" }, "r7" },
4496 { { "v5" }, "r8" },
4497 { { "v6", "rfp" }, "r9" },
4498 { { "sl" }, "r10" },
4499 { { "fp" }, "r11" },
4500 { { "ip" }, "r12" },
Daniel Dunbar00ea8f02010-08-11 02:17:11 +00004501 { { "r13" }, "sp" },
4502 { { "r14" }, "lr" },
4503 { { "r15" }, "pc" },
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004504 // The S, D and Q registers overlap, but aren't really aliases; we
4505 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004506};
4507
4508void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4509 unsigned &NumAliases) const {
4510 Aliases = GCCRegAliases;
4511 NumAliases = llvm::array_lengthof(GCCRegAliases);
4512}
Chris Lattnerb4527522010-03-03 19:03:45 +00004513
4514const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00004515#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00004516#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00004517 ALL_LANGUAGES },
Stephen Hines651f13c2014-04-23 16:59:28 -07004518#include "clang/Basic/BuiltinsNEON.def"
4519
4520#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004521#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Stephen Hines651f13c2014-04-23 16:59:28 -07004522#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4523 ALL_LANGUAGES },
Chris Lattnerb4527522010-03-03 19:03:45 +00004524#include "clang/Basic/BuiltinsARM.def"
4525};
Stephen Hines651f13c2014-04-23 16:59:28 -07004526
4527class ARMleTargetInfo : public ARMTargetInfo {
4528public:
4529 ARMleTargetInfo(const llvm::Triple &Triple)
4530 : ARMTargetInfo(Triple, false) { }
4531 virtual void getTargetDefines(const LangOptions &Opts,
4532 MacroBuilder &Builder) const {
4533 Builder.defineMacro("__ARMEL__");
4534 ARMTargetInfo::getTargetDefines(Opts, Builder);
4535 }
4536};
4537
4538class ARMbeTargetInfo : public ARMTargetInfo {
4539public:
4540 ARMbeTargetInfo(const llvm::Triple &Triple)
4541 : ARMTargetInfo(Triple, true) { }
4542 virtual void getTargetDefines(const LangOptions &Opts,
4543 MacroBuilder &Builder) const {
4544 Builder.defineMacro("__ARMEB__");
4545 Builder.defineMacro("__ARM_BIG_ENDIAN");
4546 ARMTargetInfo::getTargetDefines(Opts, Builder);
4547 }
4548};
Chris Lattner9fd73612008-04-21 18:56:49 +00004549} // end anonymous namespace.
4550
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004551namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004552class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4553 const llvm::Triple Triple;
4554public:
4555 WindowsARMTargetInfo(const llvm::Triple &Triple)
4556 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4557 TLSSupported = false;
4558 WCharType = UnsignedShort;
4559 SizeType = UnsignedInt;
4560 UserLabelPrefix = "";
4561 }
4562 void getVisualStudioDefines(const LangOptions &Opts,
4563 MacroBuilder &Builder) const {
4564 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4565
4566 // FIXME: this is invalid for WindowsCE
4567 Builder.defineMacro("_M_ARM_NT", "1");
4568 Builder.defineMacro("_M_ARMT", "_M_ARM");
4569 Builder.defineMacro("_M_THUMB", "_M_ARM");
4570
4571 assert((Triple.getArch() == llvm::Triple::arm ||
4572 Triple.getArch() == llvm::Triple::thumb) &&
4573 "invalid architecture for Windows ARM target info");
4574 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4575 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4576
4577 // TODO map the complete set of values
4578 // 31: VFPv3 40: VFPv4
4579 Builder.defineMacro("_M_ARM_FP", "31");
4580 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004581 BuiltinVaListKind getBuiltinVaListKind() const override {
4582 return TargetInfo::CharPtrBuiltinVaList;
4583 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004584};
4585
4586// Windows ARM + Itanium C++ ABI Target
4587class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4588public:
4589 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4590 : WindowsARMTargetInfo(Triple) {
4591 TheCXXABI.set(TargetCXXABI::GenericARM);
4592 }
4593
4594 void getTargetDefines(const LangOptions &Opts,
4595 MacroBuilder &Builder) const override {
4596 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4597
4598 if (Opts.MSVCCompat)
4599 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4600 }
4601};
4602
4603// Windows ARM, MS (C++) ABI
4604class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4605public:
4606 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4607 : WindowsARMTargetInfo(Triple) {
4608 TheCXXABI.set(TargetCXXABI::Microsoft);
4609 }
4610
4611 void getTargetDefines(const LangOptions &Opts,
4612 MacroBuilder &Builder) const override {
4613 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4614 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4615 }
4616};
4617}
4618
4619
4620namespace {
Mike Stump25cf7602009-09-09 15:08:12 +00004621class DarwinARMTargetInfo :
Stephen Hines651f13c2014-04-23 16:59:28 -07004622 public DarwinTargetInfo<ARMleTargetInfo> {
Edwin Török36565e52009-06-30 17:10:35 +00004623protected:
Stephen Hines651f13c2014-04-23 16:59:28 -07004624 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4625 MacroBuilder &Builder) const override {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00004626 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedman8f575172009-04-19 21:38:35 +00004627 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004628
Edwin Török36565e52009-06-30 17:10:35 +00004629public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004630 DarwinARMTargetInfo(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07004631 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar01045582010-05-27 07:00:26 +00004632 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00004633 // iOS always has 64-bit atomic instructions.
Stephen Hines176edba2014-12-01 14:53:08 -08004634 // FIXME: This should be based off of the target features in
4635 // ARMleTargetInfo.
Eli Friedman2be46072011-10-14 20:59:01 +00004636 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00004637
4638 // Darwin on iOS uses a variant of the ARM C++ ABI.
4639 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar01045582010-05-27 07:00:26 +00004640 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004641};
4642} // end anonymous namespace.
4643
Tony Linthicum96319392011-12-12 21:14:55 +00004644
4645namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004646class AArch64TargetInfo : public TargetInfo {
4647 virtual void setDescriptionString() = 0;
Stephen Hines651f13c2014-04-23 16:59:28 -07004648 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4649 static const char *const GCCRegNames[];
4650
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004651 enum FPUModeEnum {
4652 FPUMode,
4653 NeonMode
4654 };
4655
4656 unsigned FPU;
4657 unsigned CRC;
4658 unsigned Crypto;
4659
Stephen Hines651f13c2014-04-23 16:59:28 -07004660 static const Builtin::Info BuiltinInfo[];
4661
4662 std::string ABI;
4663
4664public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004665 AArch64TargetInfo(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07004666 : TargetInfo(Triple), ABI("aapcs") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004667
4668 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4669 WCharType = SignedInt;
4670
4671 // NetBSD apparently prefers consistency across ARM targets to consistency
4672 // across 64-bit targets.
4673 Int64Type = SignedLongLong;
4674 IntMaxType = SignedLongLong;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004675 } else {
4676 WCharType = UnsignedInt;
4677 Int64Type = SignedLong;
4678 IntMaxType = SignedLong;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004679 }
4680
Stephen Hines651f13c2014-04-23 16:59:28 -07004681 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07004682 MaxVectorAlign = 128;
4683 RegParmMax = 8;
4684 MaxAtomicInlineWidth = 128;
4685 MaxAtomicPromoteWidth = 128;
4686
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004687 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07004688 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4689
Stephen Hines651f13c2014-04-23 16:59:28 -07004690 // {} in inline assembly are neon specifiers, not assembly variant
4691 // specifiers.
4692 NoAsmVariants = true;
4693
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004694 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4695 // contributes to the alignment of the containing aggregate in the same way
4696 // a plain (non bit-field) member of that type would, without exception for
4697 // zero-sized or anonymous bit-fields."
4698 UseBitFieldTypeAlignment = true;
4699 UseZeroLengthBitfieldAlignment = true;
4700
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004701 // AArch64 targets default to using the ARM C++ ABI.
Stephen Hines651f13c2014-04-23 16:59:28 -07004702 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4703 }
4704
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004705 StringRef getABI() const override { return ABI; }
Stephen Hines176edba2014-12-01 14:53:08 -08004706 bool setABI(const std::string &Name) override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004707 if (Name != "aapcs" && Name != "darwinpcs")
4708 return false;
4709
4710 ABI = Name;
4711 return true;
4712 }
4713
Stephen Hines176edba2014-12-01 14:53:08 -08004714 bool setCPU(const std::string &Name) override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004715 bool CPUKnown = llvm::StringSwitch<bool>(Name)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004716 .Case("generic", true)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004717 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Stephen Hines651f13c2014-04-23 16:59:28 -07004718 .Case("cyclone", true)
4719 .Default(false);
4720 return CPUKnown;
4721 }
4722
4723 virtual void getTargetDefines(const LangOptions &Opts,
Stephen Hines176edba2014-12-01 14:53:08 -08004724 MacroBuilder &Builder) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004725 // Target identification.
Stephen Hines651f13c2014-04-23 16:59:28 -07004726 Builder.defineMacro("__aarch64__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004727
4728 // Target properties.
4729 Builder.defineMacro("_LP64");
4730 Builder.defineMacro("__LP64__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004731
4732 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4733 Builder.defineMacro("__ARM_ACLE", "200");
4734 Builder.defineMacro("__ARM_ARCH", "8");
4735 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4736
4737 Builder.defineMacro("__ARM_64BIT_STATE");
4738 Builder.defineMacro("__ARM_PCS_AAPCS64");
4739 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4740
4741 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4742 Builder.defineMacro("__ARM_FEATURE_CLZ");
4743 Builder.defineMacro("__ARM_FEATURE_FMA");
4744 Builder.defineMacro("__ARM_FEATURE_DIV");
Stephen Hines176edba2014-12-01 14:53:08 -08004745 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4746 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4747 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4748 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Stephen Hines651f13c2014-04-23 16:59:28 -07004749
4750 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4751
4752 // 0xe implies support for half, single and double precision operations.
4753 Builder.defineMacro("__ARM_FP", "0xe");
4754
4755 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4756 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4757 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4758
4759 if (Opts.FastMath || Opts.FiniteMathOnly)
4760 Builder.defineMacro("__ARM_FP_FAST");
4761
Stephen Hines176edba2014-12-01 14:53:08 -08004762 if (Opts.C99 && !Opts.Freestanding)
Stephen Hines651f13c2014-04-23 16:59:28 -07004763 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4764
4765 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4766
4767 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4768 Opts.ShortEnums ? "1" : "4");
4769
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004770 if (FPU == NeonMode) {
4771 Builder.defineMacro("__ARM_NEON");
4772 // 64-bit NEON supports half, single and double precision operations.
4773 Builder.defineMacro("__ARM_NEON_FP", "0xe");
4774 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004775
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004776 if (CRC)
4777 Builder.defineMacro("__ARM_FEATURE_CRC32");
Stephen Hines651f13c2014-04-23 16:59:28 -07004778
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004779 if (Crypto)
4780 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Stephen Hines651f13c2014-04-23 16:59:28 -07004781 }
4782
4783 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Stephen Hines176edba2014-12-01 14:53:08 -08004784 unsigned &NumRecords) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004785 Records = BuiltinInfo;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004786 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Stephen Hines651f13c2014-04-23 16:59:28 -07004787 }
4788
Stephen Hines176edba2014-12-01 14:53:08 -08004789 bool hasFeature(StringRef Feature) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004790 return Feature == "aarch64" ||
4791 Feature == "arm64" ||
4792 (Feature == "neon" && FPU == NeonMode);
4793 }
4794
4795 bool handleTargetFeatures(std::vector<std::string> &Features,
4796 DiagnosticsEngine &Diags) override {
4797 FPU = FPUMode;
4798 CRC = 0;
4799 Crypto = 0;
4800 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4801 if (Features[i] == "+neon")
4802 FPU = NeonMode;
4803 if (Features[i] == "+crc")
4804 CRC = 1;
4805 if (Features[i] == "+crypto")
4806 Crypto = 1;
4807 }
4808
4809 setDescriptionString();
4810
4811 return true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004812 }
4813
Stephen Hines176edba2014-12-01 14:53:08 -08004814 bool isCLZForZeroUndef() const override { return false; }
Stephen Hines651f13c2014-04-23 16:59:28 -07004815
Stephen Hines176edba2014-12-01 14:53:08 -08004816 BuiltinVaListKind getBuiltinVaListKind() const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004817 return TargetInfo::AArch64ABIBuiltinVaList;
4818 }
4819
4820 virtual void getGCCRegNames(const char *const *&Names,
Stephen Hines176edba2014-12-01 14:53:08 -08004821 unsigned &NumNames) const override;
Stephen Hines651f13c2014-04-23 16:59:28 -07004822 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Stephen Hines176edba2014-12-01 14:53:08 -08004823 unsigned &NumAliases) const override;
Stephen Hines651f13c2014-04-23 16:59:28 -07004824
Stephen Hines176edba2014-12-01 14:53:08 -08004825 virtual bool
4826 validateAsmConstraint(const char *&Name,
4827 TargetInfo::ConstraintInfo &Info) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004828 switch (*Name) {
4829 default:
4830 return false;
4831 case 'w': // Floating point and SIMD registers (V0-V31)
4832 Info.setAllowsRegister();
4833 return true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004834 case 'I': // Constant that can be used with an ADD instruction
4835 case 'J': // Constant that can be used with a SUB instruction
4836 case 'K': // Constant that can be used with a 32-bit logical instruction
4837 case 'L': // Constant that can be used with a 64-bit logical instruction
4838 case 'M': // Constant that can be used as a 32-bit MOV immediate
4839 case 'N': // Constant that can be used as a 64-bit MOV immediate
4840 case 'Y': // Floating point constant zero
4841 case 'Z': // Integer constant zero
4842 return true;
4843 case 'Q': // A memory reference with base register and no offset
4844 Info.setAllowsMemory();
4845 return true;
4846 case 'S': // A symbolic address
4847 Info.setAllowsRegister();
4848 return true;
4849 case 'U':
Stephen Hines176edba2014-12-01 14:53:08 -08004850 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4851 // Utf: A memory address suitable for ldp/stp in TF mode.
4852 // Usa: An absolute symbolic address.
4853 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4854 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Stephen Hines651f13c2014-04-23 16:59:28 -07004855 case 'z': // Zero register, wzr or xzr
4856 Info.setAllowsRegister();
4857 return true;
4858 case 'x': // Floating point and SIMD registers (V0-V15)
4859 Info.setAllowsRegister();
4860 return true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004861 }
4862 return false;
4863 }
4864
Stephen Hines176edba2014-12-01 14:53:08 -08004865 bool
4866 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
4867 std::string &SuggestedModifier) const override {
4868 // Strip off constraint modifiers.
4869 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4870 Constraint = Constraint.substr(1);
Stephen Hines651f13c2014-04-23 16:59:28 -07004871
Stephen Hines176edba2014-12-01 14:53:08 -08004872 switch (Constraint[0]) {
4873 default:
4874 return true;
4875 case 'z':
4876 case 'r': {
4877 switch (Modifier) {
4878 case 'x':
4879 case 'w':
4880 // For now assume that the person knows what they're
4881 // doing with the modifier.
4882 return true;
4883 default:
4884 // By default an 'r' constraint will be in the 'x'
4885 // registers.
4886 if (Size == 64)
4887 return true;
4888
4889 SuggestedModifier = "w";
4890 return false;
4891 }
4892 }
4893 }
4894 }
4895
4896 const char *getClobbers() const override { return ""; }
4897
4898 int getEHDataRegisterNumber(unsigned RegNo) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004899 if (RegNo == 0)
4900 return 0;
4901 if (RegNo == 1)
4902 return 1;
4903 return -1;
4904 }
4905};
4906
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004907const char *const AArch64TargetInfo::GCCRegNames[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07004908 // 32-bit Integer registers
4909 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4910 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4911 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4912
4913 // 64-bit Integer registers
4914 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4915 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4916 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4917
4918 // 32-bit floating point regsisters
4919 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4920 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4921 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4922
4923 // 64-bit floating point regsisters
4924 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4925 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4926 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4927
4928 // Vector registers
4929 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4930 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4931 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4932};
4933
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004934void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Stephen Hines651f13c2014-04-23 16:59:28 -07004935 unsigned &NumNames) const {
4936 Names = GCCRegNames;
4937 NumNames = llvm::array_lengthof(GCCRegNames);
4938}
4939
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004940const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07004941 { { "w31" }, "wsp" },
4942 { { "x29" }, "fp" },
4943 { { "x30" }, "lr" },
4944 { { "x31" }, "sp" },
4945 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4946 // don't want to substitute one of these for a different-sized one.
4947};
4948
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004949void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Stephen Hines651f13c2014-04-23 16:59:28 -07004950 unsigned &NumAliases) const {
4951 Aliases = GCCRegAliases;
4952 NumAliases = llvm::array_lengthof(GCCRegAliases);
4953}
4954
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004955const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07004956#define BUILTIN(ID, TYPE, ATTRS) \
4957 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4958#include "clang/Basic/BuiltinsNEON.def"
4959
4960#define BUILTIN(ID, TYPE, ATTRS) \
4961 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004962#include "clang/Basic/BuiltinsAArch64.def"
4963};
4964
4965class AArch64leTargetInfo : public AArch64TargetInfo {
4966 void setDescriptionString() override {
4967 if (getTriple().isOSBinFormatMachO())
4968 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4969 else
4970 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4971 }
4972
4973public:
4974 AArch64leTargetInfo(const llvm::Triple &Triple)
4975 : AArch64TargetInfo(Triple) {
4976 BigEndian = false;
4977 }
4978 void getTargetDefines(const LangOptions &Opts,
4979 MacroBuilder &Builder) const override {
4980 Builder.defineMacro("__AARCH64EL__");
4981 AArch64TargetInfo::getTargetDefines(Opts, Builder);
4982 }
4983};
4984
4985class AArch64beTargetInfo : public AArch64TargetInfo {
4986 void setDescriptionString() override {
4987 assert(!getTriple().isOSBinFormatMachO());
4988 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4989 }
4990
4991public:
4992 AArch64beTargetInfo(const llvm::Triple &Triple)
4993 : AArch64TargetInfo(Triple) { }
4994 void getTargetDefines(const LangOptions &Opts,
4995 MacroBuilder &Builder) const override {
4996 Builder.defineMacro("__AARCH64EB__");
4997 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4998 Builder.defineMacro("__ARM_BIG_ENDIAN");
4999 AArch64TargetInfo::getTargetDefines(Opts, Builder);
5000 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005001};
5002} // end anonymous namespace.
5003
5004namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005005class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
5006protected:
5007 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5008 MacroBuilder &Builder) const override {
5009 Builder.defineMacro("__AARCH64_SIMD__");
5010 Builder.defineMacro("__ARM64_ARCH_8__");
5011 Builder.defineMacro("__ARM_NEON__");
5012 Builder.defineMacro("__LITTLE_ENDIAN__");
5013 Builder.defineMacro("__REGISTER_PREFIX__", "");
5014 Builder.defineMacro("__arm64", "1");
5015 Builder.defineMacro("__arm64__", "1");
5016
5017 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5018 }
5019
Stephen Hines651f13c2014-04-23 16:59:28 -07005020public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005021 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5022 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07005023 Int64Type = SignedLongLong;
5024 WCharType = SignedInt;
5025 UseSignedCharForObjCBool = false;
5026
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005027 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07005028 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5029
5030 TheCXXABI.set(TargetCXXABI::iOS64);
5031 }
5032
Stephen Hines176edba2014-12-01 14:53:08 -08005033 BuiltinVaListKind getBuiltinVaListKind() const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07005034 return TargetInfo::CharPtrBuiltinVaList;
5035 }
5036};
5037} // end anonymous namespace
5038
5039namespace {
Tony Linthicum96319392011-12-12 21:14:55 +00005040// Hexagon abstract base class
5041class HexagonTargetInfo : public TargetInfo {
5042 static const Builtin::Info BuiltinInfo[];
5043 static const char * const GCCRegNames[];
5044 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5045 std::string CPU;
5046public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005047 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005048 BigEndian = false;
Stephen Hines651f13c2014-04-23 16:59:28 -07005049 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum96319392011-12-12 21:14:55 +00005050
5051 // {} in inline assembly are packet specifiers, not assembly variant
5052 // specifiers.
5053 NoAsmVariants = true;
5054 }
5055
Stephen Hines651f13c2014-04-23 16:59:28 -07005056 void getTargetBuiltins(const Builtin::Info *&Records,
5057 unsigned &NumRecords) const override {
Tony Linthicum96319392011-12-12 21:14:55 +00005058 Records = BuiltinInfo;
5059 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5060 }
5061
Stephen Hines651f13c2014-04-23 16:59:28 -07005062 bool validateAsmConstraint(const char *&Name,
5063 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum96319392011-12-12 21:14:55 +00005064 return true;
5065 }
5066
Stephen Hines651f13c2014-04-23 16:59:28 -07005067 void getTargetDefines(const LangOptions &Opts,
5068 MacroBuilder &Builder) const override;
Tony Linthicum96319392011-12-12 21:14:55 +00005069
Stephen Hines651f13c2014-04-23 16:59:28 -07005070 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005071 return Feature == "hexagon";
5072 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005073
5074 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005075 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00005076 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005077 void getGCCRegNames(const char * const *&Names,
5078 unsigned &NumNames) const override;
5079 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5080 unsigned &NumAliases) const override;
5081 const char *getClobbers() const override {
Tony Linthicum96319392011-12-12 21:14:55 +00005082 return "";
5083 }
Sebastian Pop43115d42012-01-13 20:37:10 +00005084
5085 static const char *getHexagonCPUSuffix(StringRef Name) {
5086 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop43115d42012-01-13 20:37:10 +00005087 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00005088 .Case("hexagonv5", "5")
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005089 .Default(nullptr);
Sebastian Pop43115d42012-01-13 20:37:10 +00005090 }
5091
Stephen Hines651f13c2014-04-23 16:59:28 -07005092 bool setCPU(const std::string &Name) override {
Sebastian Pop43115d42012-01-13 20:37:10 +00005093 if (!getHexagonCPUSuffix(Name))
5094 return false;
5095
Tony Linthicum96319392011-12-12 21:14:55 +00005096 CPU = Name;
5097 return true;
5098 }
5099};
5100
5101void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5102 MacroBuilder &Builder) const {
5103 Builder.defineMacro("qdsp6");
5104 Builder.defineMacro("__qdsp6", "1");
5105 Builder.defineMacro("__qdsp6__", "1");
5106
5107 Builder.defineMacro("hexagon");
5108 Builder.defineMacro("__hexagon", "1");
5109 Builder.defineMacro("__hexagon__", "1");
5110
5111 if(CPU == "hexagonv1") {
5112 Builder.defineMacro("__HEXAGON_V1__");
5113 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5114 if(Opts.HexagonQdsp6Compat) {
5115 Builder.defineMacro("__QDSP6_V1__");
5116 Builder.defineMacro("__QDSP6_ARCH__", "1");
5117 }
5118 }
5119 else if(CPU == "hexagonv2") {
5120 Builder.defineMacro("__HEXAGON_V2__");
5121 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5122 if(Opts.HexagonQdsp6Compat) {
5123 Builder.defineMacro("__QDSP6_V2__");
5124 Builder.defineMacro("__QDSP6_ARCH__", "2");
5125 }
5126 }
5127 else if(CPU == "hexagonv3") {
5128 Builder.defineMacro("__HEXAGON_V3__");
5129 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5130 if(Opts.HexagonQdsp6Compat) {
5131 Builder.defineMacro("__QDSP6_V3__");
5132 Builder.defineMacro("__QDSP6_ARCH__", "3");
5133 }
5134 }
5135 else if(CPU == "hexagonv4") {
5136 Builder.defineMacro("__HEXAGON_V4__");
5137 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5138 if(Opts.HexagonQdsp6Compat) {
5139 Builder.defineMacro("__QDSP6_V4__");
5140 Builder.defineMacro("__QDSP6_ARCH__", "4");
5141 }
5142 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00005143 else if(CPU == "hexagonv5") {
5144 Builder.defineMacro("__HEXAGON_V5__");
5145 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5146 if(Opts.HexagonQdsp6Compat) {
5147 Builder.defineMacro("__QDSP6_V5__");
5148 Builder.defineMacro("__QDSP6_ARCH__", "5");
5149 }
5150 }
Tony Linthicum96319392011-12-12 21:14:55 +00005151}
5152
5153const char * const HexagonTargetInfo::GCCRegNames[] = {
5154 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5155 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5156 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5157 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5158 "p0", "p1", "p2", "p3",
5159 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5160};
5161
5162void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5163 unsigned &NumNames) const {
5164 Names = GCCRegNames;
5165 NumNames = llvm::array_lengthof(GCCRegNames);
5166}
5167
5168
5169const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5170 { { "sp" }, "r29" },
5171 { { "fp" }, "r30" },
5172 { { "lr" }, "r31" },
5173 };
5174
5175void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5176 unsigned &NumAliases) const {
5177 Aliases = GCCRegAliases;
5178 NumAliases = llvm::array_lengthof(GCCRegAliases);
5179}
5180
5181
5182const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5183#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5184#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5185 ALL_LANGUAGES },
5186#include "clang/Basic/BuiltinsHexagon.def"
5187};
5188}
5189
5190
Chris Lattner4b009652007-07-25 00:24:17 +00005191namespace {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005192// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5193class SparcTargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005194 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5195 static const char * const GCCRegNames[];
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00005196 bool SoftFloat;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005197public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005198 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005199
Stephen Hines651f13c2014-04-23 16:59:28 -07005200 bool handleTargetFeatures(std::vector<std::string> &Features,
5201 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00005202 SoftFloat = false;
5203 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5204 if (Features[i] == "+soft-float")
5205 SoftFloat = true;
Rafael Espindola5389b842013-08-21 21:59:03 +00005206 return true;
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00005207 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005208 void getTargetDefines(const LangOptions &Opts,
5209 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005210 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005211 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00005212
5213 if (SoftFloat)
5214 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005215 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005216
5217 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005218 return llvm::StringSwitch<bool>(Feature)
5219 .Case("softfloat", SoftFloat)
5220 .Case("sparc", true)
5221 .Default(false);
5222 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005223
5224 void getTargetBuiltins(const Builtin::Info *&Records,
5225 unsigned &NumRecords) const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005226 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005227 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005228 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005229 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005230 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005231 void getGCCRegNames(const char * const *&Names,
5232 unsigned &NumNames) const override;
5233 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5234 unsigned &NumAliases) const override;
5235 bool validateAsmConstraint(const char *&Name,
5236 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005237 // FIXME: Implement!
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005238 switch (*Name) {
5239 case 'I': // Signed 13-bit constant
5240 case 'J': // Zero
5241 case 'K': // 32-bit constant with the low 12 bits clear
5242 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5243 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5244 case 'N': // Same as 'K' but zext (required for SIMode)
5245 case 'O': // The constant 4096
5246 return true;
5247 }
Eli Friedmanff158dd2008-08-20 07:28:14 +00005248 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005249 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005250 const char *getClobbers() const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005251 // FIXME: Implement!
5252 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005253 }
5254};
5255
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005256const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005257 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5258 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5259 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5260 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5261};
5262
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005263void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5264 unsigned &NumNames) const {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005265 Names = GCCRegNames;
5266 NumNames = llvm::array_lengthof(GCCRegNames);
5267}
5268
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005269const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikove7772382009-05-03 13:42:53 +00005270 { { "g0" }, "r0" },
5271 { { "g1" }, "r1" },
5272 { { "g2" }, "r2" },
5273 { { "g3" }, "r3" },
5274 { { "g4" }, "r4" },
5275 { { "g5" }, "r5" },
5276 { { "g6" }, "r6" },
5277 { { "g7" }, "r7" },
5278 { { "o0" }, "r8" },
5279 { { "o1" }, "r9" },
5280 { { "o2" }, "r10" },
5281 { { "o3" }, "r11" },
5282 { { "o4" }, "r12" },
5283 { { "o5" }, "r13" },
5284 { { "o6", "sp" }, "r14" },
5285 { { "o7" }, "r15" },
5286 { { "l0" }, "r16" },
5287 { { "l1" }, "r17" },
5288 { { "l2" }, "r18" },
5289 { { "l3" }, "r19" },
5290 { { "l4" }, "r20" },
5291 { { "l5" }, "r21" },
5292 { { "l6" }, "r22" },
5293 { { "l7" }, "r23" },
5294 { { "i0" }, "r24" },
5295 { { "i1" }, "r25" },
5296 { { "i2" }, "r26" },
5297 { { "i3" }, "r27" },
5298 { { "i4" }, "r28" },
5299 { { "i5" }, "r29" },
5300 { { "i6", "fp" }, "r30" },
5301 { { "i7" }, "r31" },
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005302};
5303
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005304void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5305 unsigned &NumAliases) const {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005306 Aliases = GCCRegAliases;
5307 NumAliases = llvm::array_lengthof(GCCRegAliases);
5308}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005309
5310// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5311class SparcV8TargetInfo : public SparcTargetInfo {
5312public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005313 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07005314 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005315 }
5316
Stephen Hines651f13c2014-04-23 16:59:28 -07005317 void getTargetDefines(const LangOptions &Opts,
5318 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005319 SparcTargetInfo::getTargetDefines(Opts, Builder);
5320 Builder.defineMacro("__sparcv8");
5321 }
5322};
5323
5324// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5325class SparcV9TargetInfo : public SparcTargetInfo {
5326public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005327 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005328 // FIXME: Support Sparc quad-precision long double?
Stephen Hines651f13c2014-04-23 16:59:28 -07005329 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesenfcec0c92013-05-15 03:22:33 +00005330 // This is an LP64 platform.
5331 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00005332
5333 // OpenBSD uses long long for int64_t and intmax_t.
Stephen Hines176edba2014-12-01 14:53:08 -08005334 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00005335 IntMaxType = SignedLongLong;
Stephen Hines176edba2014-12-01 14:53:08 -08005336 else
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00005337 IntMaxType = SignedLong;
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00005338 Int64Type = IntMaxType;
Stephen Hines651f13c2014-04-23 16:59:28 -07005339
5340 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5341 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5342 LongDoubleWidth = 128;
5343 LongDoubleAlign = 128;
5344 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5345 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005346 }
5347
Stephen Hines651f13c2014-04-23 16:59:28 -07005348 void getTargetDefines(const LangOptions &Opts,
5349 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005350 SparcTargetInfo::getTargetDefines(Opts, Builder);
5351 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesen44f72d32013-04-24 04:36:38 +00005352 Builder.defineMacro("__arch64__");
Stephen Hines176edba2014-12-01 14:53:08 -08005353 // Solaris doesn't need these variants, but the BSDs do.
5354 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesen44f72d32013-04-24 04:36:38 +00005355 Builder.defineMacro("__sparc64__");
5356 Builder.defineMacro("__sparc_v9__");
5357 Builder.defineMacro("__sparcv9__");
5358 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005359 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005360
5361 bool setCPU(const std::string &Name) override {
5362 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5363 .Case("v9", true)
5364 .Case("ultrasparc", true)
5365 .Case("ultrasparc3", true)
5366 .Case("niagara", true)
5367 .Case("niagara2", true)
5368 .Case("niagara3", true)
5369 .Case("niagara4", true)
5370 .Default(false);
5371
5372 // No need to store the CPU yet. There aren't any CPU-specific
5373 // macros to define.
5374 return CPUKnown;
5375 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005376};
5377
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005378} // end anonymous namespace.
5379
Eli Friedmanff158dd2008-08-20 07:28:14 +00005380namespace {
Edwin Török36565e52009-06-30 17:10:35 +00005381class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005382public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005383 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5384 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedman7cca0982008-11-02 02:43:55 +00005385 SizeType = UnsignedInt;
5386 PtrDiffType = SignedInt;
Eli Friedmanff158dd2008-08-20 07:28:14 +00005387 }
5388};
5389} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00005390
Chris Lattner85970f32008-05-08 05:58:21 +00005391namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005392class SystemZTargetInfo : public TargetInfo {
5393 static const char *const GCCRegNames[];
Ulrich Weigandb8409212013-05-06 16:26:41 +00005394
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005395public:
5396 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5397 TLSSupported = true;
5398 IntWidth = IntAlign = 32;
5399 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5400 PointerWidth = PointerAlign = 64;
5401 LongDoubleWidth = 128;
5402 LongDoubleAlign = 64;
5403 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5404 MinGlobalAlign = 16;
5405 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5406 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5407 }
5408 void getTargetDefines(const LangOptions &Opts,
5409 MacroBuilder &Builder) const override {
5410 Builder.defineMacro("__s390__");
5411 Builder.defineMacro("__s390x__");
5412 Builder.defineMacro("__zarch__");
5413 Builder.defineMacro("__LONG_DOUBLE_128__");
5414 }
5415 void getTargetBuiltins(const Builtin::Info *&Records,
5416 unsigned &NumRecords) const override {
5417 // FIXME: Implement.
5418 Records = nullptr;
5419 NumRecords = 0;
Ulrich Weigandb8409212013-05-06 16:26:41 +00005420 }
5421
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005422 void getGCCRegNames(const char *const *&Names,
5423 unsigned &NumNames) const override;
5424 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5425 unsigned &NumAliases) const override {
5426 // No aliases.
5427 Aliases = nullptr;
5428 NumAliases = 0;
Ulrich Weigandb8409212013-05-06 16:26:41 +00005429 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005430 bool validateAsmConstraint(const char *&Name,
5431 TargetInfo::ConstraintInfo &info) const override;
5432 const char *getClobbers() const override {
5433 // FIXME: Is this really right?
5434 return "";
5435 }
5436 BuiltinVaListKind getBuiltinVaListKind() const override {
5437 return TargetInfo::SystemZBuiltinVaList;
5438 }
5439 bool setCPU(const std::string &Name) override {
5440 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5441 .Case("z10", true)
5442 .Case("z196", true)
5443 .Case("zEC12", true)
5444 .Default(false);
5445
5446 // No need to store the CPU yet. There aren't any CPU-specific
5447 // macros to define.
5448 return CPUKnown;
5449 }
5450};
5451
5452const char *const SystemZTargetInfo::GCCRegNames[] = {
5453 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5454 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5455 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5456 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5457};
5458
5459void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5460 unsigned &NumNames) const {
5461 Names = GCCRegNames;
5462 NumNames = llvm::array_lengthof(GCCRegNames);
5463}
5464
5465bool SystemZTargetInfo::
5466validateAsmConstraint(const char *&Name,
5467 TargetInfo::ConstraintInfo &Info) const {
5468 switch (*Name) {
5469 default:
5470 return false;
5471
5472 case 'a': // Address register
5473 case 'd': // Data register (equivalent to 'r')
5474 case 'f': // Floating-point register
5475 Info.setAllowsRegister();
5476 return true;
5477
5478 case 'I': // Unsigned 8-bit constant
5479 case 'J': // Unsigned 12-bit constant
5480 case 'K': // Signed 16-bit constant
5481 case 'L': // Signed 20-bit displacement (on all targets we support)
5482 case 'M': // 0x7fffffff
5483 return true;
5484
5485 case 'Q': // Memory with base and unsigned 12-bit displacement
5486 case 'R': // Likewise, plus an index
5487 case 'S': // Memory with base and signed 20-bit displacement
5488 case 'T': // Likewise, plus an index
5489 Info.setAllowsMemory();
5490 return true;
5491 }
5492}
Ulrich Weigandb8409212013-05-06 16:26:41 +00005493}
5494
5495namespace {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005496 class MSP430TargetInfo : public TargetInfo {
5497 static const char * const GCCRegNames[];
5498 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005499 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005500 BigEndian = false;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005501 TLSSupported = false;
Anton Korobeynikov2a6630a2010-01-30 12:55:11 +00005502 IntWidth = 16; IntAlign = 16;
5503 LongWidth = 32; LongLongWidth = 64;
5504 LongAlign = LongLongAlign = 16;
5505 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005506 SuitableAlign = 16;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005507 SizeType = UnsignedInt;
Anton Korobeynikov18a295d2013-07-01 19:42:40 +00005508 IntMaxType = SignedLongLong;
Anton Korobeynikov18a295d2013-07-01 19:42:40 +00005509 IntPtrType = SignedInt;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005510 PtrDiffType = SignedInt;
Edward O'Callaghan14a70a32009-11-21 00:49:54 +00005511 SigAtomicType = SignedLong;
Stephen Hines176edba2014-12-01 14:53:08 -08005512 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Stephen Hines651f13c2014-04-23 16:59:28 -07005513 }
5514 void getTargetDefines(const LangOptions &Opts,
5515 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005516 Builder.defineMacro("MSP430");
5517 Builder.defineMacro("__MSP430__");
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005518 // FIXME: defines for different 'flavours' of MCU
5519 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005520 void getTargetBuiltins(const Builtin::Info *&Records,
5521 unsigned &NumRecords) const override {
5522 // FIXME: Implement.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005523 Records = nullptr;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005524 NumRecords = 0;
5525 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005526 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005527 return Feature == "msp430";
5528 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005529 void getGCCRegNames(const char * const *&Names,
5530 unsigned &NumNames) const override;
5531 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5532 unsigned &NumAliases) const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005533 // No aliases.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005534 Aliases = nullptr;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005535 NumAliases = 0;
5536 }
Stephen Hines176edba2014-12-01 14:53:08 -08005537 bool
5538 validateAsmConstraint(const char *&Name,
5539 TargetInfo::ConstraintInfo &info) const override {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005540 // FIXME: implement
5541 switch (*Name) {
5542 case 'K': // the constant 1
5543 case 'L': // constant -1^20 .. 1^19
5544 case 'M': // constant 1-4:
5545 return true;
5546 }
Anton Korobeynikov174219b2009-10-15 23:17:13 +00005547 // No target constraints for now.
5548 return false;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005549 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005550 const char *getClobbers() const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005551 // FIXME: Is this really right?
5552 return "";
5553 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005554 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005555 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00005556 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005557 }
5558 };
5559
5560 const char * const MSP430TargetInfo::GCCRegNames[] = {
5561 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5562 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5563 };
5564
5565 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5566 unsigned &NumNames) const {
5567 Names = GCCRegNames;
5568 NumNames = llvm::array_lengthof(GCCRegNames);
5569 }
5570}
5571
Jakob Stoklund Olesen61774372009-08-17 20:08:44 +00005572namespace {
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005573
Mike Stump25cf7602009-09-09 15:08:12 +00005574 // LLVM and Clang cannot be used directly to output native binaries for
5575 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005576 // type and alignment information.
Mike Stump25cf7602009-09-09 15:08:12 +00005577 //
5578 // TCE uses the llvm bitcode as input and uses it for generating customized
5579 // target processor and program binary. TCE co-design environment is
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005580 // publicly available in http://tce.cs.tut.fi
5581
Eli Friedman209f5bb2011-10-07 19:51:42 +00005582 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5583 3, // opencl_global
5584 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00005585 5, // opencl_constant
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005586 // FIXME: generic has to be added to the target
5587 0, // opencl_generic
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00005588 0, // cuda_device
5589 0, // cuda_constant
5590 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00005591 };
5592
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005593 class TCETargetInfo : public TargetInfo{
5594 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005595 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005596 TLSSupported = false;
5597 IntWidth = 32;
5598 LongWidth = LongLongWidth = 32;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005599 PointerWidth = 32;
5600 IntAlign = 32;
5601 LongAlign = LongLongAlign = 32;
5602 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005603 SuitableAlign = 32;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005604 SizeType = UnsignedInt;
5605 IntMaxType = SignedLong;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005606 IntPtrType = SignedInt;
5607 PtrDiffType = SignedInt;
5608 FloatWidth = 32;
5609 FloatAlign = 32;
5610 DoubleWidth = 32;
5611 DoubleAlign = 32;
5612 LongDoubleWidth = 32;
5613 LongDoubleAlign = 32;
5614 FloatFormat = &llvm::APFloat::IEEEsingle;
5615 DoubleFormat = &llvm::APFloat::IEEEsingle;
5616 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Stephen Hines651f13c2014-04-23 16:59:28 -07005617 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5618 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00005619 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00005620 UseAddrSpaceMapMangling = true;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005621 }
5622
Stephen Hines651f13c2014-04-23 16:59:28 -07005623 void getTargetDefines(const LangOptions &Opts,
5624 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005625 DefineStd(Builder, "tce", Opts);
5626 Builder.defineMacro("__TCE__");
5627 Builder.defineMacro("__TCE_V1__");
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005628 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005629 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005630 return Feature == "tce";
5631 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005632
5633 void getTargetBuiltins(const Builtin::Info *&Records,
5634 unsigned &NumRecords) const override {}
5635 const char *getClobbers() const override {
Daniel Dunbar2e967de2009-08-24 09:54:37 +00005636 return "";
5637 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005638 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005639 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005640 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005641 void getGCCRegNames(const char * const *&Names,
5642 unsigned &NumNames) const override {}
5643 bool validateAsmConstraint(const char *&Name,
5644 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005645 return true;
5646 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005647 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5648 unsigned &NumAliases) const override {}
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005649 };
5650}
5651
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005652namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005653class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005654 virtual void setDescriptionString() = 0;
5655
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005656 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005657 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005658 bool IsMips16;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005659 bool IsMicromips;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005660 bool IsNan2008;
Simon Atanasyand96e3152013-04-14 14:07:30 +00005661 bool IsSingleFloat;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005662 enum MipsFloatABI {
Simon Atanasyand96e3152013-04-14 14:07:30 +00005663 HardFloat, SoftFloat
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005664 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005665 enum DspRevEnum {
5666 NoDSP, DSP1, DSP2
5667 } DspRev;
Jack Carterc613b672013-08-12 17:20:29 +00005668 bool HasMSA;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005669
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005670protected:
Akira Hatanaka550ed202013-10-29 19:00:35 +00005671 bool HasFP64;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005672 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005673
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005674public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005675 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5676 const std::string &CPUStr)
5677 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005678 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005679 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5680 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5681 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005682
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005683 bool isNaN2008Default() const {
5684 return CPU == "mips32r6" || CPU == "mips64r6";
Eric Christopher03cc0ef2010-03-02 02:41:08 +00005685 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005686
5687 bool isFP64Default() const {
5688 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5689 }
5690
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005691 bool isNan2008() const override {
5692 return IsNan2008;
5693 }
5694
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005695 StringRef getABI() const override { return ABI; }
5696 bool setCPU(const std::string &Name) override {
5697 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5698 getTriple().getArch() == llvm::Triple::mipsel;
5699 CPU = Name;
5700 return llvm::StringSwitch<bool>(Name)
5701 .Case("mips1", IsMips32)
5702 .Case("mips2", IsMips32)
5703 .Case("mips3", true)
5704 .Case("mips4", true)
5705 .Case("mips5", true)
5706 .Case("mips32", IsMips32)
5707 .Case("mips32r2", IsMips32)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005708 .Case("mips32r3", IsMips32)
5709 .Case("mips32r5", IsMips32)
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005710 .Case("mips32r6", IsMips32)
5711 .Case("mips64", true)
5712 .Case("mips64r2", true)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005713 .Case("mips64r3", true)
5714 .Case("mips64r5", true)
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005715 .Case("mips64r6", true)
5716 .Case("octeon", true)
5717 .Default(false);
5718 }
5719 const std::string& getCPU() const { return CPU; }
Stephen Hines651f13c2014-04-23 16:59:28 -07005720 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005721 if (CPU == "octeon")
5722 Features["mips64r2"] = Features["cnmips"] = true;
5723 else
5724 Features[CPU] = true;
Eric Christopher03cc0ef2010-03-02 02:41:08 +00005725 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005726
Stephen Hines651f13c2014-04-23 16:59:28 -07005727 void getTargetDefines(const LangOptions &Opts,
5728 MacroBuilder &Builder) const override {
5729 Builder.defineMacro("__mips__");
Simon Atanasyand4935a02012-08-29 19:14:58 +00005730 Builder.defineMacro("_mips");
Stephen Hines651f13c2014-04-23 16:59:28 -07005731 if (Opts.GNUMode)
5732 Builder.defineMacro("mips");
5733
Simon Atanasyand4935a02012-08-29 19:14:58 +00005734 Builder.defineMacro("__REGISTER_PREFIX__", "");
5735
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005736 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005737 case HardFloat:
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005738 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005739 break;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005740 case SoftFloat:
5741 Builder.defineMacro("__mips_soft_float", Twine(1));
5742 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00005743 }
Simon Atanasyan90913892012-04-05 19:28:31 +00005744
Simon Atanasyand96e3152013-04-14 14:07:30 +00005745 if (IsSingleFloat)
5746 Builder.defineMacro("__mips_single_float", Twine(1));
5747
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005748 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5749 Builder.defineMacro("_MIPS_FPSET",
5750 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5751
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005752 if (IsMips16)
5753 Builder.defineMacro("__mips16", Twine(1));
5754
Simon Atanasyan321ae792013-04-14 14:07:51 +00005755 if (IsMicromips)
5756 Builder.defineMacro("__mips_micromips", Twine(1));
5757
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005758 if (IsNan2008)
5759 Builder.defineMacro("__mips_nan2008", Twine(1));
5760
Simon Atanasyana1b62272012-07-05 20:16:22 +00005761 switch (DspRev) {
5762 default:
5763 break;
5764 case DSP1:
5765 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5766 Builder.defineMacro("__mips_dsp", Twine(1));
5767 break;
5768 case DSP2:
5769 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5770 Builder.defineMacro("__mips_dspr2", Twine(1));
5771 Builder.defineMacro("__mips_dsp", Twine(1));
5772 break;
5773 }
Simon Atanasyan90913892012-04-05 19:28:31 +00005774
Jack Carterc613b672013-08-12 17:20:29 +00005775 if (HasMSA)
5776 Builder.defineMacro("__mips_msa", Twine(1));
5777
Simon Atanasyan90913892012-04-05 19:28:31 +00005778 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5779 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5780 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00005781
5782 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5783 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005784 }
5785
Stephen Hines651f13c2014-04-23 16:59:28 -07005786 void getTargetBuiltins(const Builtin::Info *&Records,
5787 unsigned &NumRecords) const override {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005788 Records = BuiltinInfo;
5789 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005790 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005791 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka550ed202013-10-29 19:00:35 +00005792 return llvm::StringSwitch<bool>(Feature)
5793 .Case("mips", true)
5794 .Case("fp64", HasFP64)
5795 .Default(false);
Douglas Gregore727d212012-01-30 06:38:25 +00005796 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005797 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005798 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005799 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005800 void getGCCRegNames(const char * const *&Names,
5801 unsigned &NumNames) const override {
Daniel Sanders838f9332013-11-12 12:56:01 +00005802 static const char *const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00005803 // CPU register names
5804 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005805 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5806 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5807 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00005808 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5809 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005810 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5811 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5812 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5813 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00005814 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005815 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders838f9332013-11-12 12:56:01 +00005816 "$fcc5","$fcc6","$fcc7",
5817 // MSA register names
5818 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5819 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5820 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5821 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5822 // MSA control register names
5823 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5824 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005825 };
5826 Names = GCCRegNames;
5827 NumNames = llvm::array_lengthof(GCCRegNames);
5828 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005829 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5830 unsigned &NumAliases) const override = 0;
5831 bool validateAsmConstraint(const char *&Name,
5832 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005833 switch (*Name) {
5834 default:
Douglas Gregora95cba92011-11-02 20:52:01 +00005835 return false;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005836 case 'r': // CPU registers.
5837 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Stephen Hines176edba2014-12-01 14:53:08 -08005838 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005839 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00005840 case 'c': // $25 for indirect jumps
5841 case 'l': // lo register
5842 case 'x': // hilo register pair
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005843 Info.setAllowsRegister();
5844 return true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005845 case 'I': // Signed 16-bit constant
5846 case 'J': // Integer 0
5847 case 'K': // Unsigned 16-bit constant
5848 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5849 case 'M': // Constants not loadable via lui, addiu, or ori
5850 case 'N': // Constant -1 to -65535
5851 case 'O': // A signed 15-bit constant
5852 case 'P': // A constant between 1 go 65535
5853 return true;
Jack Carter97102302013-03-05 19:10:54 +00005854 case 'R': // An address that can be used in a non-macro load or store
Jack Carterd2ab6d32013-03-04 21:36:11 +00005855 Info.setAllowsMemory();
5856 return true;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005857 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005858 }
5859
Stephen Hines651f13c2014-04-23 16:59:28 -07005860 const char *getClobbers() const override {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005861 // In GCC, $1 is not widely used in generated code (it's used only in a few
5862 // specific situations), so there is no real need for users to add it to
5863 // the clobbers list if they want to use it in their inline assembly code.
5864 //
5865 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5866 // code generation, so using it in inline assembly without adding it to the
5867 // clobbers list can cause conflicts between the inline assembly code and
5868 // the surrounding generated code.
5869 //
5870 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5871 // operands, which will conflict with the ".set at" assembler option (which
5872 // we use only for inline assembly, in order to maintain compatibility with
5873 // GCC) and will also conflict with the user's usage of $1.
5874 //
5875 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5876 // register for generated code is to automatically clobber $1 for all inline
5877 // assembly code.
5878 //
5879 // FIXME: We should automatically clobber $1 only for inline assembly code
5880 // which actually uses it. This would allow LLVM to use $1 for inline
5881 // assembly operands if the user's assembly code doesn't use it.
5882 return "~{$1}";
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005883 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005884
Stephen Hines651f13c2014-04-23 16:59:28 -07005885 bool handleTargetFeatures(std::vector<std::string> &Features,
5886 DiagnosticsEngine &Diags) override {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005887 IsMips16 = false;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005888 IsMicromips = false;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005889 IsNan2008 = isNaN2008Default();
Simon Atanasyand96e3152013-04-14 14:07:30 +00005890 IsSingleFloat = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005891 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005892 DspRev = NoDSP;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005893 HasFP64 = isFP64Default();
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005894
5895 for (std::vector<std::string>::iterator it = Features.begin(),
5896 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005897 if (*it == "+single-float")
Simon Atanasyand96e3152013-04-14 14:07:30 +00005898 IsSingleFloat = true;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005899 else if (*it == "+soft-float")
5900 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005901 else if (*it == "+mips16")
5902 IsMips16 = true;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005903 else if (*it == "+micromips")
5904 IsMicromips = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005905 else if (*it == "+dsp")
5906 DspRev = std::max(DspRev, DSP1);
5907 else if (*it == "+dspr2")
5908 DspRev = std::max(DspRev, DSP2);
Jack Carterc613b672013-08-12 17:20:29 +00005909 else if (*it == "+msa")
5910 HasMSA = true;
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005911 else if (*it == "+fp64")
5912 HasFP64 = true;
5913 else if (*it == "-fp64")
5914 HasFP64 = false;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005915 else if (*it == "+nan2008")
5916 IsNan2008 = true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005917 else if (*it == "-nan2008")
5918 IsNan2008 = false;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005919 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005920
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005921 // Remove front-end specific options.
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005922 std::vector<std::string>::iterator it =
5923 std::find(Features.begin(), Features.end(), "+soft-float");
5924 if (it != Features.end())
5925 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00005926
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005927 setDescriptionString();
5928
Rafael Espindola5389b842013-08-21 21:59:03 +00005929 return true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005930 }
Logan Chiena8f7a972013-02-23 04:24:36 +00005931
Stephen Hines651f13c2014-04-23 16:59:28 -07005932 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chiena8f7a972013-02-23 04:24:36 +00005933 if (RegNo == 0) return 4;
5934 if (RegNo == 1) return 5;
5935 return -1;
5936 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005937
5938 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005939};
5940
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005941const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5942#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5943#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5944 ALL_LANGUAGES },
5945#include "clang/Basic/BuiltinsMips.def"
5946};
5947
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005948class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005949public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005950 Mips32TargetInfoBase(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07005951 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanakaa044ad92011-11-05 01:48:34 +00005952 SizeType = UnsignedInt;
5953 PtrDiffType = SignedInt;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005954 Int64Type = SignedLongLong;
5955 IntMaxType = Int64Type;
Akira Hatanakadbee9492013-01-18 21:58:11 +00005956 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanakaa044ad92011-11-05 01:48:34 +00005957 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005958 bool setABI(const std::string &Name) override {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005959 if (Name == "o32" || Name == "eabi") {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005960 ABI = Name;
5961 return true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005962 }
5963 return false;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005964 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005965 void getTargetDefines(const LangOptions &Opts,
5966 MacroBuilder &Builder) const override {
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005967 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Douglas Gregorb7bcfe82011-11-09 15:17:16 +00005968
Stephen Hines651f13c2014-04-23 16:59:28 -07005969 Builder.defineMacro("__mips", "32");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005970 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5971
5972 const std::string& CPUStr = getCPU();
5973 if (CPUStr == "mips32")
5974 Builder.defineMacro("__mips_isa_rev", "1");
5975 else if (CPUStr == "mips32r2")
5976 Builder.defineMacro("__mips_isa_rev", "2");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005977 else if (CPUStr == "mips32r3")
5978 Builder.defineMacro("__mips_isa_rev", "3");
5979 else if (CPUStr == "mips32r5")
5980 Builder.defineMacro("__mips_isa_rev", "5");
5981 else if (CPUStr == "mips32r6")
5982 Builder.defineMacro("__mips_isa_rev", "6");
Stephen Hines651f13c2014-04-23 16:59:28 -07005983
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005984 if (ABI == "o32") {
5985 Builder.defineMacro("__mips_o32");
5986 Builder.defineMacro("_ABIO32", "1");
5987 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5988 }
5989 else if (ABI == "eabi")
5990 Builder.defineMacro("__mips_eabi");
5991 else
David Blaikieb219cfc2011-09-23 05:06:16 +00005992 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005993 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005994 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5995 unsigned &NumAliases) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005996 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5997 { { "at" }, "$1" },
5998 { { "v0" }, "$2" },
5999 { { "v1" }, "$3" },
6000 { { "a0" }, "$4" },
6001 { { "a1" }, "$5" },
6002 { { "a2" }, "$6" },
6003 { { "a3" }, "$7" },
6004 { { "t0" }, "$8" },
6005 { { "t1" }, "$9" },
6006 { { "t2" }, "$10" },
6007 { { "t3" }, "$11" },
6008 { { "t4" }, "$12" },
6009 { { "t5" }, "$13" },
6010 { { "t6" }, "$14" },
6011 { { "t7" }, "$15" },
6012 { { "s0" }, "$16" },
6013 { { "s1" }, "$17" },
6014 { { "s2" }, "$18" },
6015 { { "s3" }, "$19" },
6016 { { "s4" }, "$20" },
6017 { { "s5" }, "$21" },
6018 { { "s6" }, "$22" },
6019 { { "s7" }, "$23" },
6020 { { "t8" }, "$24" },
6021 { { "t9" }, "$25" },
6022 { { "k0" }, "$26" },
6023 { { "k1" }, "$27" },
6024 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00006025 { { "sp","$sp" }, "$29" },
6026 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006027 { { "ra" }, "$31" }
6028 };
6029 Aliases = GCCRegAliases;
6030 NumAliases = llvm::array_lengthof(GCCRegAliases);
6031 }
6032};
6033
6034class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07006035 void setDescriptionString() override {
6036 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006037 }
6038
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006039public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006040 Mips32EBTargetInfo(const llvm::Triple &Triple)
6041 : Mips32TargetInfoBase(Triple) {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006042 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006043 void getTargetDefines(const LangOptions &Opts,
6044 MacroBuilder &Builder) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006045 DefineStd(Builder, "MIPSEB", Opts);
6046 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00006047 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006048 }
6049};
6050
6051class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07006052 void setDescriptionString() override {
6053 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006054 }
6055
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006056public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006057 Mips32ELTargetInfo(const llvm::Triple &Triple)
6058 : Mips32TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00006059 BigEndian = false;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006060 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006061 void getTargetDefines(const LangOptions &Opts,
6062 MacroBuilder &Builder) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006063 DefineStd(Builder, "MIPSEL", Opts);
6064 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00006065 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006066 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006067};
6068
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006069class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006070public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006071 Mips64TargetInfoBase(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07006072 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanaka12507592011-10-22 00:07:27 +00006073 LongDoubleWidth = LongDoubleAlign = 128;
6074 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00006075 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6076 LongDoubleWidth = LongDoubleAlign = 64;
6077 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6078 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006079 setN64ABITypes();
Nick Lewycky7ec59c72011-12-16 22:34:14 +00006080 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00006081 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanaka12507592011-10-22 00:07:27 +00006082 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006083
6084 void setN64ABITypes() {
6085 LongWidth = LongAlign = 64;
6086 PointerWidth = PointerAlign = 64;
6087 SizeType = UnsignedLong;
6088 PtrDiffType = SignedLong;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006089 Int64Type = SignedLong;
6090 IntMaxType = Int64Type;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006091 }
6092
6093 void setN32ABITypes() {
6094 LongWidth = LongAlign = 32;
6095 PointerWidth = PointerAlign = 32;
6096 SizeType = UnsignedInt;
6097 PtrDiffType = SignedInt;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006098 Int64Type = SignedLongLong;
6099 IntMaxType = Int64Type;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006100 }
6101
Stephen Hines651f13c2014-04-23 16:59:28 -07006102 bool setABI(const std::string &Name) override {
Akira Hatanaka12507592011-10-22 00:07:27 +00006103 if (Name == "n32") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006104 setN32ABITypes();
Simon Atanasyane9616a42013-02-27 14:55:49 +00006105 ABI = Name;
6106 return true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006107 }
6108 if (Name == "n64") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006109 setN64ABITypes();
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006110 ABI = Name;
Simon Atanasyane9616a42013-02-27 14:55:49 +00006111 return true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006112 }
6113 return false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006114 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006115
Stephen Hines651f13c2014-04-23 16:59:28 -07006116 void getTargetDefines(const LangOptions &Opts,
6117 MacroBuilder &Builder) const override {
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00006118 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00006119
Stephen Hines651f13c2014-04-23 16:59:28 -07006120 Builder.defineMacro("__mips", "64");
Simon Atanasyan600a5132012-08-29 20:50:11 +00006121 Builder.defineMacro("__mips64");
6122 Builder.defineMacro("__mips64__");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006123 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6124
6125 const std::string& CPUStr = getCPU();
6126 if (CPUStr == "mips64")
6127 Builder.defineMacro("__mips_isa_rev", "1");
6128 else if (CPUStr == "mips64r2")
6129 Builder.defineMacro("__mips_isa_rev", "2");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006130 else if (CPUStr == "mips64r3")
6131 Builder.defineMacro("__mips_isa_rev", "3");
6132 else if (CPUStr == "mips64r5")
6133 Builder.defineMacro("__mips_isa_rev", "5");
6134 else if (CPUStr == "mips64r6")
6135 Builder.defineMacro("__mips_isa_rev", "6");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006136
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006137 if (ABI == "n32") {
6138 Builder.defineMacro("__mips_n32");
6139 Builder.defineMacro("_ABIN32", "2");
6140 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6141 }
6142 else if (ABI == "n64") {
6143 Builder.defineMacro("__mips_n64");
6144 Builder.defineMacro("_ABI64", "3");
6145 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6146 }
6147 else
6148 llvm_unreachable("Invalid ABI for Mips64.");
6149 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006150 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6151 unsigned &NumAliases) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006152 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6153 { { "at" }, "$1" },
6154 { { "v0" }, "$2" },
6155 { { "v1" }, "$3" },
6156 { { "a0" }, "$4" },
6157 { { "a1" }, "$5" },
6158 { { "a2" }, "$6" },
6159 { { "a3" }, "$7" },
6160 { { "a4" }, "$8" },
6161 { { "a5" }, "$9" },
6162 { { "a6" }, "$10" },
6163 { { "a7" }, "$11" },
6164 { { "t0" }, "$12" },
6165 { { "t1" }, "$13" },
6166 { { "t2" }, "$14" },
6167 { { "t3" }, "$15" },
6168 { { "s0" }, "$16" },
6169 { { "s1" }, "$17" },
6170 { { "s2" }, "$18" },
6171 { { "s3" }, "$19" },
6172 { { "s4" }, "$20" },
6173 { { "s5" }, "$21" },
6174 { { "s6" }, "$22" },
6175 { { "s7" }, "$23" },
6176 { { "t8" }, "$24" },
6177 { { "t9" }, "$25" },
6178 { { "k0" }, "$26" },
6179 { { "k1" }, "$27" },
6180 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00006181 { { "sp","$sp" }, "$29" },
6182 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006183 { { "ra" }, "$31" }
6184 };
6185 Aliases = GCCRegAliases;
6186 NumAliases = llvm::array_lengthof(GCCRegAliases);
6187 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006188
6189 bool hasInt128Type() const override { return true; }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006190};
6191
6192class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07006193 void setDescriptionString() override {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006194 if (ABI == "n32")
Stephen Hines651f13c2014-04-23 16:59:28 -07006195 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006196 else
Stephen Hines651f13c2014-04-23 16:59:28 -07006197 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006198
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006199 }
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006200
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006201public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006202 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006203 : Mips64TargetInfoBase(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07006204 void getTargetDefines(const LangOptions &Opts,
6205 MacroBuilder &Builder) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006206 DefineStd(Builder, "MIPSEB", Opts);
6207 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00006208 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006209 }
6210};
6211
6212class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07006213 void setDescriptionString() override {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006214 if (ABI == "n32")
Stephen Hines651f13c2014-04-23 16:59:28 -07006215 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006216 else
Stephen Hines651f13c2014-04-23 16:59:28 -07006217 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006218 }
6219public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006220 Mips64ELTargetInfo(const llvm::Triple &Triple)
6221 : Mips64TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00006222 // Default ABI is n64.
6223 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006224 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006225 void getTargetDefines(const LangOptions &Opts,
6226 MacroBuilder &Builder) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006227 DefineStd(Builder, "MIPSEL", Opts);
6228 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00006229 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006230 }
6231};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00006232} // end anonymous namespace.
6233
Ivan Krasinef05abd2011-08-24 20:22:22 +00006234namespace {
6235class PNaClTargetInfo : public TargetInfo {
6236public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006237 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00006238 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006239 this->UserLabelPrefix = "";
6240 this->LongAlign = 32;
6241 this->LongWidth = 32;
6242 this->PointerAlign = 32;
6243 this->PointerWidth = 32;
6244 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006245 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00006246 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00006247 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00006248 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00006249 this->SizeType = TargetInfo::UnsignedInt;
6250 this->PtrDiffType = TargetInfo::SignedInt;
6251 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +00006252 this->RegParmMax = 0; // Disallow regparm
Ivan Krasinef05abd2011-08-24 20:22:22 +00006253 }
6254
Stephen Hines651f13c2014-04-23 16:59:28 -07006255 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006256 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006257 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006258 Builder.defineMacro("__le32__");
6259 Builder.defineMacro("__pnacl__");
6260 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006261 void getTargetDefines(const LangOptions &Opts,
6262 MacroBuilder &Builder) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006263 getArchDefines(Opts, Builder);
6264 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006265 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00006266 return Feature == "pnacl";
6267 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006268 void getTargetBuiltins(const Builtin::Info *&Records,
6269 unsigned &NumRecords) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006270 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006271 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00006272 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006273 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006274 void getGCCRegNames(const char * const *&Names,
6275 unsigned &NumNames) const override;
6276 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6277 unsigned &NumAliases) const override;
6278 bool validateAsmConstraint(const char *&Name,
6279 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006280 return false;
6281 }
6282
Stephen Hines651f13c2014-04-23 16:59:28 -07006283 const char *getClobbers() const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006284 return "";
6285 }
6286};
6287
6288void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6289 unsigned &NumNames) const {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006290 Names = nullptr;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006291 NumNames = 0;
6292}
6293
6294void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6295 unsigned &NumAliases) const {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006296 Aliases = nullptr;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006297 NumAliases = 0;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006298}
6299} // end anonymous namespace.
6300
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006301namespace {
Stephen Hines176edba2014-12-01 14:53:08 -08006302class Le64TargetInfo : public TargetInfo {
6303 static const Builtin::Info BuiltinInfo[];
6304
6305public:
6306 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6307 BigEndian = false;
6308 NoAsmVariants = true;
6309 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6310 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6311 DescriptionString =
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006312 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
Stephen Hines176edba2014-12-01 14:53:08 -08006313 }
6314
6315 void getTargetDefines(const LangOptions &Opts,
6316 MacroBuilder &Builder) const override {
6317 DefineStd(Builder, "unix", Opts);
6318 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6319 Builder.defineMacro("__ELF__");
6320 }
6321 void getTargetBuiltins(const Builtin::Info *&Records,
6322 unsigned &NumRecords) const override {
6323 Records = BuiltinInfo;
6324 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6325 }
6326 BuiltinVaListKind getBuiltinVaListKind() const override {
6327 return TargetInfo::PNaClABIBuiltinVaList;
6328 }
6329 const char *getClobbers() const override { return ""; }
6330 void getGCCRegNames(const char *const *&Names,
6331 unsigned &NumNames) const override {
6332 Names = nullptr;
6333 NumNames = 0;
6334 }
6335 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6336 unsigned &NumAliases) const override {
6337 Aliases = nullptr;
6338 NumAliases = 0;
6339 }
6340 bool validateAsmConstraint(const char *&Name,
6341 TargetInfo::ConstraintInfo &Info) const override {
6342 return false;
6343 }
6344
6345 bool hasProtectedVisibility() const override { return false; }
6346};
6347} // end anonymous namespace.
6348
6349const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6350#define BUILTIN(ID, TYPE, ATTRS) \
6351 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6352#include "clang/Basic/BuiltinsLe64.def"
6353};
6354
6355namespace {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006356 static const unsigned SPIRAddrSpaceMap[] = {
6357 1, // opencl_global
6358 3, // opencl_local
6359 2, // opencl_constant
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006360 4, // opencl_generic
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006361 0, // cuda_device
6362 0, // cuda_constant
6363 0 // cuda_shared
6364 };
6365 class SPIRTargetInfo : public TargetInfo {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006366 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006367 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006368 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6369 "SPIR target must use unknown OS");
6370 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6371 "SPIR target must use unknown environment type");
6372 BigEndian = false;
6373 TLSSupported = false;
6374 LongWidth = LongAlign = 64;
6375 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00006376 UseAddrSpaceMapMangling = true;
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006377 // Define available target features
6378 // These must be defined in sorted order!
6379 NoAsmVariants = true;
6380 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006381 void getTargetDefines(const LangOptions &Opts,
6382 MacroBuilder &Builder) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006383 DefineStd(Builder, "SPIR", Opts);
6384 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006385 bool hasFeature(StringRef Feature) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006386 return Feature == "spir";
6387 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006388
6389 void getTargetBuiltins(const Builtin::Info *&Records,
6390 unsigned &NumRecords) const override {}
6391 const char *getClobbers() const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006392 return "";
6393 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006394 void getGCCRegNames(const char * const *&Names,
6395 unsigned &NumNames) const override {}
Stephen Hines176edba2014-12-01 14:53:08 -08006396 bool
6397 validateAsmConstraint(const char *&Name,
6398 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006399 return true;
6400 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006401 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6402 unsigned &NumAliases) const override {}
6403 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006404 return TargetInfo::VoidPtrBuiltinVaList;
6405 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006406
6407 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6408 return (CC == CC_SpirFunction ||
6409 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6410 }
6411
6412 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6413 return CC_SpirFunction;
6414 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006415 };
6416
6417
6418 class SPIR32TargetInfo : public SPIRTargetInfo {
6419 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006420 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006421 PointerWidth = PointerAlign = 32;
6422 SizeType = TargetInfo::UnsignedInt;
6423 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6424 DescriptionString
Stephen Hines651f13c2014-04-23 16:59:28 -07006425 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6426 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00006427 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006428 void getTargetDefines(const LangOptions &Opts,
6429 MacroBuilder &Builder) const override {
Guy Benyeif3ddf632013-03-07 13:06:10 +00006430 DefineStd(Builder, "SPIR32", Opts);
6431 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006432 };
6433
6434 class SPIR64TargetInfo : public SPIRTargetInfo {
6435 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006436 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006437 PointerWidth = PointerAlign = 64;
6438 SizeType = TargetInfo::UnsignedLong;
6439 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07006440 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6441 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00006442 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006443 void getTargetDefines(const LangOptions &Opts,
6444 MacroBuilder &Builder) const override {
Guy Benyeif3ddf632013-03-07 13:06:10 +00006445 DefineStd(Builder, "SPIR64", Opts);
6446 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006447 };
6448}
6449
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006450namespace {
6451class XCoreTargetInfo : public TargetInfo {
6452 static const Builtin::Info BuiltinInfo[];
6453public:
6454 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6455 BigEndian = false;
6456 NoAsmVariants = true;
6457 LongLongAlign = 32;
6458 SuitableAlign = 32;
6459 DoubleAlign = LongDoubleAlign = 32;
Robert Lytton18162192013-11-12 10:09:30 +00006460 SizeType = UnsignedInt;
6461 PtrDiffType = SignedInt;
6462 IntPtrType = SignedInt;
6463 WCharType = UnsignedChar;
6464 WIntType = UnsignedInt;
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006465 UseZeroLengthBitfieldAlignment = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07006466 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
6467 "-f64:32-a:0:32-n32";
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006468 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006469 void getTargetDefines(const LangOptions &Opts,
6470 MacroBuilder &Builder) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006471 Builder.defineMacro("__XS1B__");
6472 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006473 void getTargetBuiltins(const Builtin::Info *&Records,
6474 unsigned &NumRecords) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006475 Records = BuiltinInfo;
6476 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6477 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006478 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006479 return TargetInfo::VoidPtrBuiltinVaList;
6480 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006481 const char *getClobbers() const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006482 return "";
6483 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006484 void getGCCRegNames(const char * const *&Names,
6485 unsigned &NumNames) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006486 static const char * const GCCRegNames[] = {
6487 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6488 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6489 };
6490 Names = GCCRegNames;
6491 NumNames = llvm::array_lengthof(GCCRegNames);
6492 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006493 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6494 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006495 Aliases = nullptr;
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006496 NumAliases = 0;
6497 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006498 bool validateAsmConstraint(const char *&Name,
6499 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006500 return false;
6501 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006502 int getEHDataRegisterNumber(unsigned RegNo) const override {
6503 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6504 return (RegNo < 2)? RegNo : -1;
6505 }
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006506};
6507
6508const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6509#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6510#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6511 ALL_LANGUAGES },
6512#include "clang/Basic/BuiltinsXCore.def"
6513};
6514} // end anonymous namespace.
6515
Ivan Krasinef05abd2011-08-24 20:22:22 +00006516
Chris Lattner4b009652007-07-25 00:24:17 +00006517//===----------------------------------------------------------------------===//
6518// Driver code
6519//===----------------------------------------------------------------------===//
6520
Benjamin Kramer9df08232013-06-29 16:37:14 +00006521static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006522 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006523
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006524 switch (Triple.getArch()) {
6525 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006526 return nullptr;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006527
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006528 case llvm::Triple::xcore:
6529 return new XCoreTargetInfo(Triple);
6530
6531 case llvm::Triple::hexagon:
6532 return new HexagonTargetInfo(Triple);
6533
6534 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07006535 if (Triple.isOSDarwin())
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006536 return new DarwinAArch64TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006537
6538 switch (os) {
Stephen Hines176edba2014-12-01 14:53:08 -08006539 case llvm::Triple::FreeBSD:
6540 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006541 case llvm::Triple::Linux:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006542 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
6543 case llvm::Triple::NetBSD:
6544 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006545 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006546 return new AArch64leTargetInfo(Triple);
6547 }
6548
Stephen Hines651f13c2014-04-23 16:59:28 -07006549 case llvm::Triple::aarch64_be:
6550 switch (os) {
Stephen Hines176edba2014-12-01 14:53:08 -08006551 case llvm::Triple::FreeBSD:
6552 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006553 case llvm::Triple::Linux:
6554 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
6555 case llvm::Triple::NetBSD:
6556 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
6557 default:
6558 return new AArch64beTargetInfo(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00006559 }
6560
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006561 case llvm::Triple::arm:
Daniel Dunbar3f361b52009-09-11 01:14:50 +00006562 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07006563 if (Triple.isOSBinFormatMachO())
6564 return new DarwinARMTargetInfo(Triple);
6565
6566 switch (os) {
6567 case llvm::Triple::Linux:
6568 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
6569 case llvm::Triple::FreeBSD:
6570 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
6571 case llvm::Triple::NetBSD:
6572 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
6573 case llvm::Triple::OpenBSD:
6574 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
6575 case llvm::Triple::Bitrig:
6576 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
6577 case llvm::Triple::RTEMS:
6578 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
6579 case llvm::Triple::NaCl:
6580 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006581 case llvm::Triple::Win32:
6582 switch (Triple.getEnvironment()) {
6583 default:
6584 return new ARMleTargetInfo(Triple);
6585 case llvm::Triple::Itanium:
6586 return new ItaniumWindowsARMleTargetInfo(Triple);
6587 case llvm::Triple::MSVC:
6588 return new MicrosoftARMleTargetInfo(Triple);
6589 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006590 default:
6591 return new ARMleTargetInfo(Triple);
6592 }
6593
6594 case llvm::Triple::armeb:
6595 case llvm::Triple::thumbeb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006596 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006597 return new DarwinARMTargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006598
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006599 switch (os) {
Rafael Espindolad16a2202010-06-10 00:46:51 +00006600 case llvm::Triple::Linux:
Stephen Hines651f13c2014-04-23 16:59:28 -07006601 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006602 case llvm::Triple::FreeBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006603 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006604 case llvm::Triple::NetBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006605 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006606 case llvm::Triple::OpenBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006607 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006608 case llvm::Triple::Bitrig:
Stephen Hines651f13c2014-04-23 16:59:28 -07006609 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00006610 case llvm::Triple::RTEMS:
Stephen Hines651f13c2014-04-23 16:59:28 -07006611 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00006612 case llvm::Triple::NaCl:
Stephen Hines651f13c2014-04-23 16:59:28 -07006613 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006614 default:
Stephen Hines651f13c2014-04-23 16:59:28 -07006615 return new ARMbeTargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006616 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006617
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006618 case llvm::Triple::msp430:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006619 return new MSP430TargetInfo(Triple);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006620
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006621 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006622 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006623 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006624 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006625 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006626 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006627 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006628 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006629 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006630 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006631 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006632 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006633 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006634
6635 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006636 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006637 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006638 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006639 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006640 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006641 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006642 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006643 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006644 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicbbac9aa2013-09-21 01:27:01 +00006645 case llvm::Triple::NaCl:
6646 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006647 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006648 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006649 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00006650
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006651 case llvm::Triple::mips64:
6652 switch (os) {
6653 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006654 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006655 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006656 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006657 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006658 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006659 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006660 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006661 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006662 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006663 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006664 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006665 }
6666
6667 case llvm::Triple::mips64el:
6668 switch (os) {
6669 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006670 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006671 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006672 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006673 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006674 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006675 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006676 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006677 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006678 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006679 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006680 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006681 }
6682
Ivan Krasinef05abd2011-08-24 20:22:22 +00006683 case llvm::Triple::le32:
6684 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00006685 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006686 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasinef05abd2011-08-24 20:22:22 +00006687 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006688 return nullptr;
Chris Lattnere03ae302010-02-16 18:14:57 +00006689 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006690
Stephen Hines176edba2014-12-01 14:53:08 -08006691 case llvm::Triple::le64:
6692 return new Le64TargetInfo(Triple);
6693
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006694 case llvm::Triple::ppc:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00006695 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006696 return new DarwinPPC32TargetInfo(Triple);
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00006697 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006698 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006699 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00006700 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006701 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006702 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006703 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006704 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006705 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006706 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006707 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006708 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006709 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006710 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006711
6712 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006713 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006714 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006715 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006716 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006717 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006718 case llvm::Triple::Lv2:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006719 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006720 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006721 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006722 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006723 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006724 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006725 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006726 }
Daniel Dunbard58c03f2009-11-15 06:48:46 +00006727
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006728 case llvm::Triple::ppc64le:
6729 switch (os) {
6730 case llvm::Triple::Linux:
6731 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6732 default:
6733 return new PPC64TargetInfo(Triple);
Reid Spencer5f016e22007-07-11 17:01:13 +00006734 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006735
Peter Collingbourneedb66f32012-05-20 23:28:41 +00006736 case llvm::Triple::nvptx:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006737 return new NVPTX32TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00006738 case llvm::Triple::nvptx64:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006739 return new NVPTX64TargetInfo(Triple);
Chris Lattner2c026472010-03-06 21:21:27 +00006740
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006741 case llvm::Triple::amdgcn:
Eli Friedman6505a292012-10-12 23:32:00 +00006742 case llvm::Triple::r600:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006743 return new R600TargetInfo(Triple);
Eli Friedman6505a292012-10-12 23:32:00 +00006744
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006745 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006746 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006747 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006748 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006749 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006750 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006751 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006752 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006753 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006754 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006755 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006756 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006757 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006758 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006759 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006760
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006761 case llvm::Triple::sparcv9:
6762 switch (os) {
6763 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006764 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006765 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006766 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006767 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006768 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006769 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006770 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006771 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006772 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006773 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006774 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006775 }
6776
Ulrich Weigandb8409212013-05-06 16:26:41 +00006777 case llvm::Triple::systemz:
6778 switch (os) {
6779 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006780 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00006781 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006782 return new SystemZTargetInfo(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00006783 }
6784
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00006785 case llvm::Triple::tce:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006786 return new TCETargetInfo(Triple);
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00006787
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006788 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006789 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006790 return new DarwinI386TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006791
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006792 switch (os) {
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006793 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006794 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006795 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006796 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006797 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006798 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006799 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006800 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006801 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006802 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006803 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006804 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00006805 case llvm::Triple::KFreeBSD:
6806 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner6f4bed52010-07-07 16:01:42 +00006807 case llvm::Triple::Minix:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006808 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006809 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006810 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006811 case llvm::Triple::Win32: {
6812 switch (Triple.getEnvironment()) {
6813 default:
6814 return new X86_32TargetInfo(Triple);
6815 case llvm::Triple::Cygnus:
6816 return new CygwinX86_32TargetInfo(Triple);
6817 case llvm::Triple::GNU:
6818 return new MinGWX86_32TargetInfo(Triple);
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006819 case llvm::Triple::Itanium:
Stephen Hines651f13c2014-04-23 16:59:28 -07006820 case llvm::Triple::MSVC:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006821 return new MicrosoftX86_32TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006822 }
6823 }
Chris Lattnerf853e732010-04-11 19:29:39 +00006824 case llvm::Triple::Haiku:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006825 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00006826 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006827 return new RTEMSX86_32TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00006828 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006829 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006830 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006831 return new X86_32TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006832 }
6833
6834 case llvm::Triple::x86_64:
Stephen Hines651f13c2014-04-23 16:59:28 -07006835 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006836 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006837
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006838 switch (os) {
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006839 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006840 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner1eac0812010-01-09 05:41:14 +00006841 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006842 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006843 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006844 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006845 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006846 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006847 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006848 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006849 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006850 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00006851 case llvm::Triple::KFreeBSD:
6852 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006853 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006854 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006855 case llvm::Triple::Win32: {
6856 switch (Triple.getEnvironment()) {
6857 default:
6858 return new X86_64TargetInfo(Triple);
6859 case llvm::Triple::GNU:
6860 return new MinGWX86_64TargetInfo(Triple);
6861 case llvm::Triple::MSVC:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006862 return new MicrosoftX86_64TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006863 }
6864 }
Eli Bendersky441d9f72012-12-04 18:38:10 +00006865 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006866 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006867 case llvm::Triple::PS4:
6868 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006869 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006870 return new X86_64TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006871 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006872
6873 case llvm::Triple::spir: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006874 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00006875 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006876 return nullptr;
Benjamin Kramer9df08232013-06-29 16:37:14 +00006877 return new SPIR32TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006878 }
6879 case llvm::Triple::spir64: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006880 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00006881 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006882 return nullptr;
Benjamin Kramer9df08232013-06-29 16:37:14 +00006883 return new SPIR64TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006884 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006885 }
Chris Lattner4b009652007-07-25 00:24:17 +00006886}
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006887
6888/// CreateTargetInfo - Return the target info object for the specified target
6889/// triple.
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006890TargetInfo *
6891TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6892 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregor49a87542012-11-16 04:24:59 +00006893 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006894
6895 // Construct the target
Stephen Hines651f13c2014-04-23 16:59:28 -07006896 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006897 if (!Target) {
6898 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006899 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006900 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006901 Target->TargetOpts = Opts;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006902
Daniel Dunbar33b40752009-12-18 18:42:37 +00006903 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00006904 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6905 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006906 return nullptr;
Daniel Dunbar33b40752009-12-18 18:42:37 +00006907 }
6908
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006909 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00006910 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6911 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006912 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006913 }
6914
Rafael Espindola5389b842013-08-21 21:59:03 +00006915 // Set the fp math unit.
6916 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6917 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006918 return nullptr;
Rafael Espindola5389b842013-08-21 21:59:03 +00006919 }
6920
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006921 // Compute the default target features, we need the target to handle this
6922 // because features may have dependencies on one another.
6923 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00006924 Target->getDefaultFeatures(Features);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006925
6926 // Apply the user specified deltas.
Rafael Espindolac84ed542013-08-20 18:57:55 +00006927 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6928 I < N; ++I) {
6929 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006930 // Apply the feature via the target.
Rafael Espindolac84ed542013-08-20 18:57:55 +00006931 bool Enabled = Name[0] == '+';
6932 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006933 }
6934
6935 // Add the features to the compile options.
6936 //
6937 // FIXME: If we are completely confident that we have the right set, we only
6938 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00006939 Opts->Features.clear();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006940 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6941 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00006942 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3d11ced2013-10-16 21:26:26 +00006943 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006944 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006945
Stephen Hines651f13c2014-04-23 16:59:28 -07006946 return Target.release();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006947}