blob: f5249e54670cc2e07c071fca8fc34ed87f1479e3 [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikova7c47172009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenekbbced582007-12-12 18:05:32 +000011// target triple.
Reid Spencer5f016e22007-07-11 17:01:13 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer5f016e22007-07-11 17:01:13 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattner8fc4dfb2008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth103b71c2010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman25531262008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar29a790b2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar77659342009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar29a790b2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner4c28b1c2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chandler Carruth3b844ba2013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner797c3c42009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie9fe8c742011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Benjamin Kramer48725082010-01-09 18:20:57 +000031#include <algorithm>
Reid Spencer5f016e22007-07-11 17:01:13 +000032using namespace clang;
33
Reid Spencer5f016e22007-07-11 17:01:13 +000034//===----------------------------------------------------------------------===//
35// Common code shared among targets.
36//===----------------------------------------------------------------------===//
37
Chris Lattnerca45cff2009-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 Lattnerca45cff2009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000044
Chris Lattnerca45cff2009-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 Kramera9992772010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000049
Chris Lattnerca45cff2009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramera9992772010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000052
Chris Lattnerca45cff2009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramera9992772010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerca45cff2009-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 Lattnerd29b6302008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner797c3c42009-08-10 19:03:04 +000068
Torok Edwin5f6c1942009-06-30 17:10:35 +000069namespace {
Douglas Gregora3844922009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwin5f6c1942009-06-30 17:10:35 +000072protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwin5f6c1942009-06-30 17:10:35 +000075public:
Benjamin Kramer9df08232013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Torok Edwin5f6c1942009-06-30 17:10:35 +000077 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +000078 MacroBuilder &Builder) const {
79 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwinb0a5b242009-06-30 17:00:25 +000081 }
Torok Edwin5f6c1942009-06-30 17:10:35 +000082
83};
Chris Lattner4c28b1c2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwinb0a5b242009-06-30 17:00:25 +000085
Chris Lattner797c3c42009-08-10 19:03:04 +000086
Daniel Dunbar21ae3192010-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 Kramera9992772010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
93 Builder.defineMacro("__MACH__");
94 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenko087c65f2012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Will Dietz4f45bc02013-01-18 11:30:38 +000097 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikova7c47172009-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 Korobeynikova7c47172009-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 Friedman2de4fee2009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +0000117 else
Benjamin Kramera9992772010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-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 Dunbar8d33cd72009-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 Dunbar21ae3192010-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
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000141 // Set the appropriate OS version define.
Cameron Esfahani57b1da12013-09-14 01:09:11 +0000142 if (Triple.isiOS()) {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000144 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__", Str);
152 } else {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000153 // Note that the Driver allows versions which aren't representable in the
154 // define (because we only get a single digit for the minor and micro
155 // revision numbers). So, we limit them to the maximum representable
156 // version.
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000157 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000159 char Str[5];
160 Str[0] = '0' + (Maj / 10);
161 Str[1] = '0' + (Maj % 10);
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000162 Str[2] = '0' + std::min(Min, 9U);
163 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000164 Str[4] = '\0';
165 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000166 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000167
168 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman618234a2008-08-20 02:34:37 +0000169}
Reid Spencer5f016e22007-07-11 17:01:13 +0000170
Chris Lattner797c3c42009-08-10 19:03:04 +0000171namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000172template<typename Target>
173class DarwinTargetInfo : public OSTargetInfo<Target> {
174protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000175 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000176 MacroBuilder &Builder) const {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000177 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000178 this->PlatformMinVersion);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000179 }
Mike Stump1eb44332009-09-09 15:08:12 +0000180
Torok Edwin5f6c1942009-06-30 17:10:35 +0000181public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000182 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
183 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
184 this->MCountName = "\01mcount";
185 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000186
Chris Lattner5f9e2722011-07-23 10:55:15 +0000187 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000188 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000189 StringRef Segment, Section;
Chris Lattner797c3c42009-08-10 19:03:04 +0000190 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000191 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000192 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000193 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000194 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000195
Anders Carlsson18af3682010-06-08 22:47:50 +0000196 virtual const char *getStaticInitSectionSpecifier() const {
197 // FIXME: We should return 0 when building kexts.
198 return "__TEXT,__StaticInit,regular,pure_instructions";
199 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000200
John McCall41887602012-01-29 01:20:30 +0000201 /// Darwin does not support protected visibility. Darwin's "default"
202 /// is very similar to ELF's "protected"; Darwin requires a "weak"
203 /// attribute on declarations that can be dynamically replaced.
204 virtual bool hasProtectedVisibility() const {
205 return false;
206 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000207};
208
Chris Lattner797c3c42009-08-10 19:03:04 +0000209
Torok Edwin5f6c1942009-06-30 17:10:35 +0000210// DragonFlyBSD Target
211template<typename Target>
212class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
213protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000214 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000215 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000216 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000217 Builder.defineMacro("__DragonFly__");
218 Builder.defineMacro("__DragonFly_cc_version", "100001");
219 Builder.defineMacro("__ELF__");
220 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
221 Builder.defineMacro("__tune_i386__");
222 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000223 }
224public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000225 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
226 : OSTargetInfo<Target>(Triple) {
227 this->UserLabelPrefix = "";
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000228
Benjamin Kramer9df08232013-06-29 16:37:14 +0000229 switch (Triple.getArch()) {
230 default:
231 case llvm::Triple::x86:
232 case llvm::Triple::x86_64:
233 this->MCountName = ".mcount";
234 break;
235 }
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000236 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000237};
238
239// FreeBSD Target
240template<typename Target>
241class FreeBSDTargetInfo : public OSTargetInfo<Target> {
242protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000243 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000244 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000245 // FreeBSD defines; list based off of gcc output
246
Benjamin Kramer474202f2011-10-18 10:10:08 +0000247 unsigned Release = Triple.getOSMajorVersion();
248 if (Release == 0U)
249 Release = 8;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000250
Benjamin Kramer474202f2011-10-18 10:10:08 +0000251 Builder.defineMacro("__FreeBSD__", Twine(Release));
252 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramera9992772010-01-09 17:55:51 +0000253 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
254 DefineStd(Builder, "unix", Opts);
255 Builder.defineMacro("__ELF__");
Ed Schouten5ada7a52013-09-29 07:54:52 +0000256
257 // On FreeBSD, wchar_t contains the number of the code point as
258 // used by the character set of the locale. These character sets are
259 // not necessarily a superset of ASCII.
260 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000261 }
262public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000263 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
264 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000265
Benjamin Kramer9df08232013-06-29 16:37:14 +0000266 switch (Triple.getArch()) {
267 default:
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
271 break;
272 case llvm::Triple::mips:
273 case llvm::Triple::mipsel:
274 case llvm::Triple::ppc:
275 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000276 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000277 this->MCountName = "_mcount";
278 break;
279 case llvm::Triple::arm:
280 this->MCountName = "__mcount";
281 break;
Duncan Sands1e90faf2009-07-08 13:55:08 +0000282 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000283 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000284};
285
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000286// GNU/kFreeBSD Target
287template<typename Target>
288class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
289protected:
290 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
291 MacroBuilder &Builder) const {
292 // GNU/kFreeBSD defines; list based off of gcc output
293
294 DefineStd(Builder, "unix", Opts);
295 Builder.defineMacro("__FreeBSD_kernel__");
296 Builder.defineMacro("__GLIBC__");
297 Builder.defineMacro("__ELF__");
298 if (Opts.POSIXThreads)
299 Builder.defineMacro("_REENTRANT");
300 if (Opts.CPlusPlus)
301 Builder.defineMacro("_GNU_SOURCE");
302 }
303public:
Sylvestre Ledrudeb77992013-09-05 13:58:07 +0000304 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000305 this->UserLabelPrefix = "";
306 }
307};
308
Chris Lattner38e317d2010-07-07 16:01:42 +0000309// Minix Target
310template<typename Target>
311class MinixTargetInfo : public OSTargetInfo<Target> {
312protected:
313 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
314 MacroBuilder &Builder) const {
315 // Minix defines
316
317 Builder.defineMacro("__minix", "3");
318 Builder.defineMacro("_EM_WSIZE", "4");
319 Builder.defineMacro("_EM_PSIZE", "4");
320 Builder.defineMacro("_EM_SSIZE", "2");
321 Builder.defineMacro("_EM_LSIZE", "4");
322 Builder.defineMacro("_EM_FSIZE", "4");
323 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000324 Builder.defineMacro("__ELF__");
Chris Lattner38e317d2010-07-07 16:01:42 +0000325 DefineStd(Builder, "unix", Opts);
326 }
327public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000328 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
329 this->UserLabelPrefix = "";
330 }
Chris Lattner38e317d2010-07-07 16:01:42 +0000331};
332
Torok Edwin5f6c1942009-06-30 17:10:35 +0000333// Linux target
334template<typename Target>
335class LinuxTargetInfo : public OSTargetInfo<Target> {
336protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000337 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000338 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000339 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000340 DefineStd(Builder, "unix", Opts);
341 DefineStd(Builder, "linux", Opts);
342 Builder.defineMacro("__gnu_linux__");
343 Builder.defineMacro("__ELF__");
Logan Chien94a71422012-09-02 09:30:11 +0000344 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov32064032012-04-26 12:08:09 +0000345 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000346 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000347 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000348 if (Opts.CPlusPlus)
349 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000350 }
351public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000352 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000353 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000354 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000355 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000356
357 virtual const char *getStaticInitSectionSpecifier() const {
358 return ".text.startup";
359 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000360};
361
Chris Lattnerb62bb282009-07-13 20:29:08 +0000362// NetBSD Target
363template<typename Target>
364class NetBSDTargetInfo : public OSTargetInfo<Target> {
365protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000366 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000367 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000368 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000369 Builder.defineMacro("__NetBSD__");
370 Builder.defineMacro("__unix__");
371 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000372 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000373 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000374 }
375public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000376 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
377 this->UserLabelPrefix = "";
378 }
Chris Lattnerb62bb282009-07-13 20:29:08 +0000379};
380
Torok Edwin5f6c1942009-06-30 17:10:35 +0000381// OpenBSD Target
382template<typename Target>
383class OpenBSDTargetInfo : public OSTargetInfo<Target> {
384protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000385 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000386 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000387 // OpenBSD defines; list based off of gcc output
388
Benjamin Kramera9992772010-01-09 17:55:51 +0000389 Builder.defineMacro("__OpenBSD__");
390 DefineStd(Builder, "unix", Opts);
391 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000392 if (Opts.POSIXThreads)
Chris Lattner4ddcf3b2012-04-25 06:12:24 +0000393 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000394 }
395public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000396 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
397 this->UserLabelPrefix = "";
398 this->TLSSupported = false;
Eli Friedman62d829a2011-12-15 02:15:56 +0000399
Eli Friedman62d829a2011-12-15 02:15:56 +0000400 switch (Triple.getArch()) {
401 default:
402 case llvm::Triple::x86:
403 case llvm::Triple::x86_64:
404 case llvm::Triple::arm:
Eric Christopher825d3862012-11-14 22:08:59 +0000405 case llvm::Triple::sparc:
Eli Friedman62d829a2011-12-15 02:15:56 +0000406 this->MCountName = "__mcount";
407 break;
408 case llvm::Triple::mips64:
409 case llvm::Triple::mips64el:
410 case llvm::Triple::ppc:
Eric Christopher825d3862012-11-14 22:08:59 +0000411 case llvm::Triple::sparcv9:
Eli Friedman62d829a2011-12-15 02:15:56 +0000412 this->MCountName = "_mcount";
413 break;
414 }
415 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000416};
417
Eli Friedman42f74f22012-08-08 23:57:20 +0000418// Bitrig Target
419template<typename Target>
420class BitrigTargetInfo : public OSTargetInfo<Target> {
421protected:
422 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
423 MacroBuilder &Builder) const {
424 // Bitrig defines; list based off of gcc output
425
426 Builder.defineMacro("__Bitrig__");
427 DefineStd(Builder, "unix", Opts);
428 Builder.defineMacro("__ELF__");
429 if (Opts.POSIXThreads)
430 Builder.defineMacro("_REENTRANT");
431 }
432public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000433 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
434 this->UserLabelPrefix = "";
435 this->TLSSupported = false;
436 this->MCountName = "__mcount";
Eli Friedman42f74f22012-08-08 23:57:20 +0000437 }
438};
439
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000440// PSP Target
441template<typename Target>
442class PSPTargetInfo : public OSTargetInfo<Target> {
443protected:
444 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000445 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000446 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000447 Builder.defineMacro("PSP");
448 Builder.defineMacro("_PSP");
449 Builder.defineMacro("__psp__");
450 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000451 }
452public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000453 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000454 this->UserLabelPrefix = "";
455 }
456};
457
John Thompson3f6918a2009-11-19 17:18:50 +0000458// PS3 PPU Target
459template<typename Target>
460class PS3PPUTargetInfo : public OSTargetInfo<Target> {
461protected:
462 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000463 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000464 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000465 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000466 Builder.defineMacro("__PPU__");
467 Builder.defineMacro("__CELLOS_LV2__");
468 Builder.defineMacro("__ELF__");
469 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000470 Builder.defineMacro("_ARCH_PPC64");
471 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000472 }
473public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000474 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompson3f6918a2009-11-19 17:18:50 +0000475 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000476 this->LongWidth = this->LongAlign = 32;
477 this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000478 this->IntMaxType = TargetInfo::SignedLongLong;
479 this->UIntMaxType = TargetInfo::UnsignedLongLong;
480 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000481 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000482 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Nick Lewycky99520702011-12-16 22:32:39 +0000483 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000484 }
485};
486
487// FIXME: Need a real SPU target.
488// PS3 SPU Target
489template<typename Target>
490class PS3SPUTargetInfo : public OSTargetInfo<Target> {
491protected:
492 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000493 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000494 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000495 Builder.defineMacro("__SPU__");
496 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000497 }
498public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000499 PS3SPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompson3f6918a2009-11-19 17:18:50 +0000500 this->UserLabelPrefix = "";
501 }
502};
503
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000504// AuroraUX target
505template<typename Target>
506class AuroraUXTargetInfo : public OSTargetInfo<Target> {
507protected:
508 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000509 MacroBuilder &Builder) const {
510 DefineStd(Builder, "sun", Opts);
511 DefineStd(Builder, "unix", Opts);
512 Builder.defineMacro("__ELF__");
513 Builder.defineMacro("__svr4__");
514 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000515 }
516public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000517 AuroraUXTargetInfo(const llvm::Triple &Triple)
518 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000519 this->UserLabelPrefix = "";
520 this->WCharType = this->SignedLong;
521 // FIXME: WIntType should be SignedLong
522 }
523};
524
Torok Edwin5f6c1942009-06-30 17:10:35 +0000525// Solaris target
526template<typename Target>
527class SolarisTargetInfo : public OSTargetInfo<Target> {
528protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000529 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000530 MacroBuilder &Builder) const {
531 DefineStd(Builder, "sun", Opts);
532 DefineStd(Builder, "unix", Opts);
533 Builder.defineMacro("__ELF__");
534 Builder.defineMacro("__svr4__");
535 Builder.defineMacro("__SVR4");
David Chisnall165329c2012-02-28 17:10:04 +0000536 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
537 // newer, but to 500 for everything else. feature_test.h has a check to
538 // ensure that you are not using C99 with an old version of X/Open or C89
539 // with a new version.
540 if (Opts.C99 || Opts.C11)
541 Builder.defineMacro("_XOPEN_SOURCE", "600");
542 else
543 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnallb4f0bd62012-03-02 10:49:52 +0000544 if (Opts.CPlusPlus)
David Chisnall165329c2012-02-28 17:10:04 +0000545 Builder.defineMacro("__C99FEATURES__");
David Chisnall48fad492012-02-17 18:35:11 +0000546 Builder.defineMacro("_LARGEFILE_SOURCE");
547 Builder.defineMacro("_LARGEFILE64_SOURCE");
548 Builder.defineMacro("__EXTENSIONS__");
David Chisnall165329c2012-02-28 17:10:04 +0000549 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000550 }
551public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000552 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000553 this->UserLabelPrefix = "";
David Chisnallfb027842012-03-28 18:04:14 +0000554 this->WCharType = this->SignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000555 // FIXME: WIntType should be SignedLong
556 }
557};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000558
559// Windows target
560template<typename Target>
561class WindowsTargetInfo : public OSTargetInfo<Target> {
562protected:
563 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
564 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000565 Builder.defineMacro("_WIN32");
566 }
567 void getVisualStudioDefines(const LangOptions &Opts,
568 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000569 if (Opts.CPlusPlus) {
570 if (Opts.RTTI)
571 Builder.defineMacro("_CPPRTTI");
572
573 if (Opts.Exceptions)
574 Builder.defineMacro("_CPPUNWIND");
575 }
576
577 if (!Opts.CharIsSigned)
578 Builder.defineMacro("_CHAR_UNSIGNED");
579
580 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
581 // but it works for now.
582 if (Opts.POSIXThreads)
583 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000584
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000585 if (Opts.MSCVersion != 0)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000586 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000587
Francois Pichet62ec1f22011-09-17 17:15:52 +0000588 if (Opts.MicrosoftExt) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000589 Builder.defineMacro("_MSC_EXTENSIONS");
590
Richard Smith80ad52f2013-01-02 11:42:31 +0000591 if (Opts.CPlusPlus11) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000592 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
593 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
594 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
595 }
596 }
597
598 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000599 }
600
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000601public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000602 WindowsTargetInfo(const llvm::Triple &Triple)
603 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000604};
605
Derek Schuff7da46f92012-10-11 16:55:58 +0000606template <typename Target>
607class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramer9df08232013-06-29 16:37:14 +0000608protected:
Derek Schuff7da46f92012-10-11 16:55:58 +0000609 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
610 MacroBuilder &Builder) const {
611 if (Opts.POSIXThreads)
612 Builder.defineMacro("_REENTRANT");
613 if (Opts.CPlusPlus)
614 Builder.defineMacro("_GNU_SOURCE");
615
616 DefineStd(Builder, "unix", Opts);
617 Builder.defineMacro("__ELF__");
618 Builder.defineMacro("__native_client__");
619 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000620
621public:
622 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff7da46f92012-10-11 16:55:58 +0000623 this->UserLabelPrefix = "";
624 this->LongAlign = 32;
625 this->LongWidth = 32;
626 this->PointerAlign = 32;
627 this->PointerWidth = 32;
628 this->IntMaxType = TargetInfo::SignedLongLong;
629 this->UIntMaxType = TargetInfo::UnsignedLongLong;
630 this->Int64Type = TargetInfo::SignedLongLong;
631 this->DoubleAlign = 64;
632 this->LongDoubleWidth = 64;
633 this->LongDoubleAlign = 64;
634 this->SizeType = TargetInfo::UnsignedInt;
635 this->PtrDiffType = TargetInfo::SignedInt;
636 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000637 // RegParmMax is inherited from the underlying architecture
Derek Schuff7da46f92012-10-11 16:55:58 +0000638 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
639 this->DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
640 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
641 }
Derek Schuff263366f2012-10-16 22:30:41 +0000642 virtual typename Target::CallingConvCheckResult checkCallingConvention(
643 CallingConv CC) const {
644 return CC == CC_PnaclCall ? Target::CCCR_OK :
645 Target::checkCallingConvention(CC);
646 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000647};
Mike Stump1eb44332009-09-09 15:08:12 +0000648} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000649
Chris Lattnerd29b6302008-10-05 21:50:58 +0000650//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000651// Specific target implementations.
652//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000653
Eli Friedmane4277982008-08-20 23:11:40 +0000654namespace {
655// PPC abstract base class
656class PPCTargetInfo : public TargetInfo {
657 static const Builtin::Info BuiltinInfo[];
658 static const char * const GCCRegNames[];
659 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel02a84272012-06-11 22:35:19 +0000660 std::string CPU;
Eric Christopher16543202013-10-16 21:19:26 +0000661
662 // Target cpu features.
663 bool HasVSX;
664
Eli Friedmane4277982008-08-20 23:11:40 +0000665public:
Eric Christopher16543202013-10-16 21:19:26 +0000666 PPCTargetInfo(const llvm::Triple &Triple)
667 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000668 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000669 LongDoubleWidth = LongDoubleAlign = 128;
670 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
671 }
Eli Friedman15b91762009-06-05 07:05:05 +0000672
Hal Finkel39d5fa12012-07-03 16:51:04 +0000673 /// \brief Flags for architecture specific defines.
674 typedef enum {
675 ArchDefineNone = 0,
676 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
677 ArchDefinePpcgr = 1 << 1,
678 ArchDefinePpcsq = 1 << 2,
679 ArchDefine440 = 1 << 3,
680 ArchDefine603 = 1 << 4,
681 ArchDefine604 = 1 << 5,
682 ArchDefinePwr4 = 1 << 6,
Bill Schmidt2821e182013-02-01 20:23:10 +0000683 ArchDefinePwr5 = 1 << 7,
684 ArchDefinePwr5x = 1 << 8,
685 ArchDefinePwr6 = 1 << 9,
686 ArchDefinePwr6x = 1 << 10,
687 ArchDefinePwr7 = 1 << 11,
688 ArchDefineA2 = 1 << 12,
689 ArchDefineA2q = 1 << 13
Hal Finkel39d5fa12012-07-03 16:51:04 +0000690 } ArchDefineTypes;
691
Bill Schmidt2821e182013-02-01 20:23:10 +0000692 // Note: GCC recognizes the following additional cpus:
693 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
694 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
695 // titan, rs64.
Hal Finkel02a84272012-06-11 22:35:19 +0000696 virtual bool setCPU(const std::string &Name) {
697 bool CPUKnown = llvm::StringSwitch<bool>(Name)
698 .Case("generic", true)
699 .Case("440", true)
700 .Case("450", true)
701 .Case("601", true)
702 .Case("602", true)
703 .Case("603", true)
704 .Case("603e", true)
705 .Case("603ev", true)
706 .Case("604", true)
707 .Case("604e", true)
708 .Case("620", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000709 .Case("630", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000710 .Case("g3", true)
711 .Case("7400", true)
712 .Case("g4", true)
713 .Case("7450", true)
714 .Case("g4+", true)
715 .Case("750", true)
716 .Case("970", true)
717 .Case("g5", true)
718 .Case("a2", true)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000719 .Case("a2q", true)
Hal Finkel7de32962012-09-18 22:25:03 +0000720 .Case("e500mc", true)
721 .Case("e5500", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000722 .Case("power3", true)
723 .Case("pwr3", true)
724 .Case("power4", true)
725 .Case("pwr4", true)
726 .Case("power5", true)
727 .Case("pwr5", true)
728 .Case("power5x", true)
729 .Case("pwr5x", true)
730 .Case("power6", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000731 .Case("pwr6", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000732 .Case("power6x", true)
733 .Case("pwr6x", true)
734 .Case("power7", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000735 .Case("pwr7", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000736 .Case("powerpc", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000737 .Case("ppc", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000738 .Case("powerpc64", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000739 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000740 .Case("powerpc64le", true)
741 .Case("ppc64le", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000742 .Default(false);
743
744 if (CPUKnown)
745 CPU = Name;
746
747 return CPUKnown;
748 }
749
Eli Friedmane4277982008-08-20 23:11:40 +0000750 virtual void getTargetBuiltins(const Builtin::Info *&Records,
751 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000752 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000753 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000754 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000755
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000756 virtual bool isCLZForZeroUndef() const { return false; }
757
Chris Lattner33328642009-03-20 15:52:06 +0000758 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000759 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000760
Bill Schmidt199402b2013-02-01 02:14:03 +0000761 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
762
Eric Christopher3d11ced2013-10-16 21:26:26 +0000763 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher16543202013-10-16 21:19:26 +0000764 DiagnosticsEngine &Diags);
Douglas Gregore727d212012-01-30 06:38:25 +0000765 virtual bool hasFeature(StringRef Feature) const;
766
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000767 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000768 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000769 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000770 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000771 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000772 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000773 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000774 default: return false;
775 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000776 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000777 case 'b': // Base register
778 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000779 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000780 break;
781 // FIXME: The following are added to allow parsing.
782 // I just took a guess at what the actions should be.
783 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000784 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000785 case 'v': // Altivec vector register
786 Info.setAllowsRegister();
787 break;
788 case 'w':
789 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000790 case 'd':// VSX vector register to hold vector double data
791 case 'f':// VSX vector register to hold vector float data
792 case 's':// VSX vector register to hold scalar float data
793 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000794 break;
795 default:
796 return false;
797 }
798 Info.setAllowsRegister();
799 Name++; // Skip over 'w'.
800 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000801 case 'h': // `MQ', `CTR', or `LINK' register
802 case 'q': // `MQ' register
803 case 'c': // `CTR' register
804 case 'l': // `LINK' register
805 case 'x': // `CR' register (condition register) number 0
806 case 'y': // `CR' register (condition register)
807 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000808 Info.setAllowsRegister();
809 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000810 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000811 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000812 // (use `L' instead for SImode constants)
813 case 'K': // Unsigned 16-bit constant
814 case 'L': // Signed 16-bit constant shifted left 16 bits
815 case 'M': // Constant larger than 31
816 case 'N': // Exact power of 2
817 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000818 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000819 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000820 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000821 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000822 break;
823 case 'm': // Memory operand. Note that on PowerPC targets, m can
824 // include addresses that update the base register. It
825 // is therefore only safe to use `m' in an asm statement
826 // if that asm statement accesses the operand exactly once.
827 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000828 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000829 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000830 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000831 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000832 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
833 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000834 // register to be updated.
835 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000836 if (Name[1] != 's')
837 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000838 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000839 // include any automodification of the base register. Unlike
840 // `m', this constraint can be used in asm statements that
841 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000842 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000843 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000844 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000845 break;
846 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000847 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000848 case 'Z': // Memory operand that is an indexed or indirect from a
849 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000850 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000851 Info.setAllowsMemory();
852 Info.setAllowsRegister();
853 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000854 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000855 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000856 // register (`p' is preferable for asm statements)
857 case 'S': // Constant suitable as a 64-bit mask operand
858 case 'T': // Constant suitable as a 32-bit mask operand
859 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000860 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000861 // instructions
862 case 'W': // Vector constant that does not require memory
863 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000864 break;
865 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000866 }
John Thompson8e6065a2010-06-24 22:44:13 +0000867 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000868 }
Eli Friedmane4277982008-08-20 23:11:40 +0000869 virtual const char *getClobbers() const {
870 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000871 }
Adhemerval Zanellab0fc94c2013-01-22 20:02:45 +0000872 int getEHDataRegisterNumber(unsigned RegNo) const {
873 if (RegNo == 0) return 3;
874 if (RegNo == 1) return 4;
875 return -1;
876 }
Eli Friedmane4277982008-08-20 23:11:40 +0000877};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000878
Eli Friedmane4277982008-08-20 23:11:40 +0000879const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000880#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000881#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000882 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000883#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000884};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000885
Eric Christopher3d11ced2013-10-16 21:26:26 +0000886 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher16543202013-10-16 21:19:26 +0000887/// configured set of features.
Eric Christopher3d11ced2013-10-16 21:26:26 +0000888bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher16543202013-10-16 21:19:26 +0000889 DiagnosticsEngine &Diags) {
890 // Remember the maximum enabled sselevel.
891 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
892 // Ignore disabled features.
893 if (Features[i][0] == '-')
894 continue;
895
896 StringRef Feature = StringRef(Features[i]).substr(1);
897
898 if (Feature == "vsx") {
899 HasVSX = true;
900 continue;
901 }
902
903 // TODO: Finish this list and add an assert that we've handled them
904 // all.
905 }
906
907 return true;
908}
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000909
Chris Lattnerc0f59212009-03-02 22:27:17 +0000910/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
911/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000912void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000913 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000914 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000915 Builder.defineMacro("__ppc__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000916 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000917 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000918 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000919 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000920 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000921 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnere03ae302010-02-16 18:14:57 +0000922 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000923 Builder.defineMacro("__ppc64__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000924 Builder.defineMacro("__PPC64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000925 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000926
Chris Lattnerc0f59212009-03-02 22:27:17 +0000927 // Target properties.
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000928 if (getTriple().getArch() == llvm::Triple::ppc64le) {
929 Builder.defineMacro("_LITTLE_ENDIAN");
930 Builder.defineMacro("__LITTLE_ENDIAN__");
931 } else {
932 if (getTriple().getOS() != llvm::Triple::NetBSD &&
933 getTriple().getOS() != llvm::Triple::OpenBSD)
934 Builder.defineMacro("_BIG_ENDIAN");
935 Builder.defineMacro("__BIG_ENDIAN__");
936 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000937
Chris Lattnerc0f59212009-03-02 22:27:17 +0000938 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000939 Builder.defineMacro("__NATURAL_ALIGNMENT__");
940 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000941
Chris Lattnerc0f59212009-03-02 22:27:17 +0000942 // FIXME: Should be controlled by command line option.
Roman Divackyb2f6f472013-07-03 19:45:54 +0000943 if (LongDoubleWidth == 128)
944 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000945
John Thompson3f6918a2009-11-19 17:18:50 +0000946 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000947 Builder.defineMacro("__VEC__", "10206");
948 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000949 }
Hal Finkel02a84272012-06-11 22:35:19 +0000950
951 // CPU identification.
Hal Finkel39d5fa12012-07-03 16:51:04 +0000952 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
953 .Case("440", ArchDefineName)
954 .Case("450", ArchDefineName | ArchDefine440)
955 .Case("601", ArchDefineName)
956 .Case("602", ArchDefineName | ArchDefinePpcgr)
957 .Case("603", ArchDefineName | ArchDefinePpcgr)
958 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
959 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
960 .Case("604", ArchDefineName | ArchDefinePpcgr)
961 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
962 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt2821e182013-02-01 20:23:10 +0000963 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000964 .Case("7400", ArchDefineName | ArchDefinePpcgr)
965 .Case("7450", ArchDefineName | ArchDefinePpcgr)
966 .Case("750", ArchDefineName | ArchDefinePpcgr)
967 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
968 | ArchDefinePpcsq)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000969 .Case("a2", ArchDefineA2)
970 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt2821e182013-02-01 20:23:10 +0000971 .Case("pwr3", ArchDefinePpcgr)
972 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
973 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
974 | ArchDefinePpcsq)
975 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
976 | ArchDefinePpcgr | ArchDefinePpcsq)
977 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
978 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
979 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
980 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
981 | ArchDefinePpcsq)
982 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
983 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
984 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
985 .Case("power3", ArchDefinePpcgr)
986 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
987 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
988 | ArchDefinePpcsq)
989 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
990 | ArchDefinePpcgr | ArchDefinePpcsq)
991 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
992 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
993 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
994 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
995 | ArchDefinePpcsq)
996 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
997 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
998 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000999 .Default(ArchDefineNone);
1000
1001 if (defs & ArchDefineName)
1002 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1003 if (defs & ArchDefinePpcgr)
1004 Builder.defineMacro("_ARCH_PPCGR");
1005 if (defs & ArchDefinePpcsq)
1006 Builder.defineMacro("_ARCH_PPCSQ");
1007 if (defs & ArchDefine440)
Hal Finkel02a84272012-06-11 22:35:19 +00001008 Builder.defineMacro("_ARCH_440");
Hal Finkel39d5fa12012-07-03 16:51:04 +00001009 if (defs & ArchDefine603)
1010 Builder.defineMacro("_ARCH_603");
1011 if (defs & ArchDefine604)
1012 Builder.defineMacro("_ARCH_604");
Bill Schmidt2821e182013-02-01 20:23:10 +00001013 if (defs & ArchDefinePwr4)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001014 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt2821e182013-02-01 20:23:10 +00001015 if (defs & ArchDefinePwr5)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001016 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt2821e182013-02-01 20:23:10 +00001017 if (defs & ArchDefinePwr5x)
1018 Builder.defineMacro("_ARCH_PWR5X");
1019 if (defs & ArchDefinePwr6)
Hal Finkel02a84272012-06-11 22:35:19 +00001020 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt2821e182013-02-01 20:23:10 +00001021 if (defs & ArchDefinePwr6x)
1022 Builder.defineMacro("_ARCH_PWR6X");
1023 if (defs & ArchDefinePwr7)
1024 Builder.defineMacro("_ARCH_PWR7");
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001025 if (defs & ArchDefineA2)
1026 Builder.defineMacro("_ARCH_A2");
1027 if (defs & ArchDefineA2q) {
1028 Builder.defineMacro("_ARCH_A2Q");
1029 Builder.defineMacro("_ARCH_QP");
1030 }
1031
1032 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1033 Builder.defineMacro("__bg__");
1034 Builder.defineMacro("__THW_BLUEGENE__");
1035 Builder.defineMacro("__bgq__");
1036 Builder.defineMacro("__TOS_BGQ__");
1037 }
Bill Schmidt2821e182013-02-01 20:23:10 +00001038
Eric Christopher16543202013-10-16 21:19:26 +00001039 if (HasVSX)
1040 Builder.defineMacro("__VSX__");
1041
Bill Schmidt2821e182013-02-01 20:23:10 +00001042 // FIXME: The following are not yet generated here by Clang, but are
1043 // generated by GCC:
1044 //
1045 // _SOFT_FLOAT_
1046 // __RECIP_PRECISION__
1047 // __APPLE_ALTIVEC__
Bill Schmidt2821e182013-02-01 20:23:10 +00001048 // __RECIP__
1049 // __RECIPF__
1050 // __RSQRTE__
1051 // __RSQRTEF__
1052 // _SOFT_DOUBLE_
1053 // __NO_LWSYNC__
1054 // __HAVE_BSWAP__
1055 // __LONGDOUBLE128
1056 // __CMODEL_MEDIUM__
1057 // __CMODEL_LARGE__
1058 // _CALL_SYSV
1059 // _CALL_DARWIN
1060 // __NO_FPRS__
Bill Schmidt199402b2013-02-01 02:14:03 +00001061}
1062
1063void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1064 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1065 .Case("7400", true)
1066 .Case("g4", true)
1067 .Case("7450", true)
1068 .Case("g4+", true)
1069 .Case("970", true)
1070 .Case("g5", true)
1071 .Case("pwr6", true)
1072 .Case("pwr7", true)
1073 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001074 .Case("ppc64le", true)
Bill Schmidt199402b2013-02-01 02:14:03 +00001075 .Default(false);
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001076
1077 Features["qpx"] = (CPU == "a2q");
Bill Schmidt199402b2013-02-01 02:14:03 +00001078}
1079
Douglas Gregore727d212012-01-30 06:38:25 +00001080bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1081 return Feature == "powerpc";
1082}
Chris Lattner393ff042008-04-21 18:56:49 +00001083
Douglas Gregore727d212012-01-30 06:38:25 +00001084
Eli Friedmane4277982008-08-20 23:11:40 +00001085const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +00001086 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1087 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1088 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1089 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1090 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1091 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1092 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1093 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +00001094 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +00001095 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +00001096 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +00001097 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1098 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1099 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1100 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +00001101 "vrsave", "vscr",
1102 "spe_acc", "spefscr",
1103 "sfp"
1104};
Reid Spencer5f016e22007-07-11 17:01:13 +00001105
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001106void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +00001107 unsigned &NumNames) const {
1108 Names = GCCRegNames;
1109 NumNames = llvm::array_lengthof(GCCRegNames);
1110}
Reid Spencer5f016e22007-07-11 17:01:13 +00001111
Eli Friedmane4277982008-08-20 23:11:40 +00001112const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1113 // While some of these aliases do map to different registers
1114 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001115 { { "0" }, "r0" },
1116 { { "1"}, "r1" },
1117 { { "2" }, "r2" },
1118 { { "3" }, "r3" },
1119 { { "4" }, "r4" },
1120 { { "5" }, "r5" },
1121 { { "6" }, "r6" },
1122 { { "7" }, "r7" },
1123 { { "8" }, "r8" },
1124 { { "9" }, "r9" },
1125 { { "10" }, "r10" },
1126 { { "11" }, "r11" },
1127 { { "12" }, "r12" },
1128 { { "13" }, "r13" },
1129 { { "14" }, "r14" },
1130 { { "15" }, "r15" },
1131 { { "16" }, "r16" },
1132 { { "17" }, "r17" },
1133 { { "18" }, "r18" },
1134 { { "19" }, "r19" },
1135 { { "20" }, "r20" },
1136 { { "21" }, "r21" },
1137 { { "22" }, "r22" },
1138 { { "23" }, "r23" },
1139 { { "24" }, "r24" },
1140 { { "25" }, "r25" },
1141 { { "26" }, "r26" },
1142 { { "27" }, "r27" },
1143 { { "28" }, "r28" },
1144 { { "29" }, "r29" },
1145 { { "30" }, "r30" },
1146 { { "31" }, "r31" },
1147 { { "fr0" }, "f0" },
1148 { { "fr1" }, "f1" },
1149 { { "fr2" }, "f2" },
1150 { { "fr3" }, "f3" },
1151 { { "fr4" }, "f4" },
1152 { { "fr5" }, "f5" },
1153 { { "fr6" }, "f6" },
1154 { { "fr7" }, "f7" },
1155 { { "fr8" }, "f8" },
1156 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +00001157 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001158 { { "fr11" }, "f11" },
1159 { { "fr12" }, "f12" },
1160 { { "fr13" }, "f13" },
1161 { { "fr14" }, "f14" },
1162 { { "fr15" }, "f15" },
1163 { { "fr16" }, "f16" },
1164 { { "fr17" }, "f17" },
1165 { { "fr18" }, "f18" },
1166 { { "fr19" }, "f19" },
1167 { { "fr20" }, "f20" },
1168 { { "fr21" }, "f21" },
1169 { { "fr22" }, "f22" },
1170 { { "fr23" }, "f23" },
1171 { { "fr24" }, "f24" },
1172 { { "fr25" }, "f25" },
1173 { { "fr26" }, "f26" },
1174 { { "fr27" }, "f27" },
1175 { { "fr28" }, "f28" },
1176 { { "fr29" }, "f29" },
1177 { { "fr30" }, "f30" },
1178 { { "fr31" }, "f31" },
1179 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +00001180};
1181
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001182void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +00001183 unsigned &NumAliases) const {
1184 Aliases = GCCRegAliases;
1185 NumAliases = llvm::array_lengthof(GCCRegAliases);
1186}
1187} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00001188
1189namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001190class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001191public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001192 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001193 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001194 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +00001195
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001196 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +00001197 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001198 case llvm::Triple::FreeBSD:
1199 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001200 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +00001201 PtrDiffType = SignedInt;
1202 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001203 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +00001204 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001205 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001206 }
Roman Divackye3d175d2012-03-13 16:53:54 +00001207
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001208 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1209 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001210 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001211 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001212
1213 // PPC32 supports atomics up to 4 bytes.
1214 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001215 }
1216
Meador Ingec5613b22012-06-16 03:34:49 +00001217 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001218 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Ingec5613b22012-06-16 03:34:49 +00001219 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001220 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001221};
1222} // end anonymous namespace.
1223
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001224// Note: ABI differences may eventually require us to have a separate
1225// TargetInfo for little endian.
Reid Spencer5f016e22007-07-11 17:01:13 +00001226namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001227class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001228public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001229 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001230 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001231 IntMaxType = SignedLong;
1232 UIntMaxType = UnsignedLong;
1233 Int64Type = SignedLong;
Roman Divackye3d175d2012-03-13 16:53:54 +00001234
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001235 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1236 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001237 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001238 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Bill Schmidtb1baad62013-07-03 21:03:06 +00001239 "i64:64:64-f32:32:32-f64:64:64-"
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001240 "v128:128:128-n32:64";
1241 } else
1242 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1243 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
1244 "v128:128:128-n32:64";
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001245
1246 // PPC64 supports atomics up to 8 bytes.
1247 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerf291b102008-05-09 06:17:04 +00001248 }
Meador Ingec5613b22012-06-16 03:34:49 +00001249 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1250 return TargetInfo::CharPtrBuiltinVaList;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001251 }
Eli Friedmane4277982008-08-20 23:11:40 +00001252};
1253} // end anonymous namespace.
1254
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001255
1256namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001257class DarwinPPC32TargetInfo :
1258 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001259public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001260 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1261 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001262 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001263 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherf2174002013-10-16 21:19:19 +00001264 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001265 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001266 SuitableAlign = 128;
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001267 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1268 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +00001269 }
Meador Ingec5613b22012-06-16 03:34:49 +00001270 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1271 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001272 }
1273};
1274
1275class DarwinPPC64TargetInfo :
1276 public DarwinTargetInfo<PPC64TargetInfo> {
1277public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001278 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1279 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001280 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001281 SuitableAlign = 128;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001282 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1283 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001284 }
1285};
1286} // end anonymous namespace.
1287
Reid Spencer5f016e22007-07-11 17:01:13 +00001288namespace {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001289 static const unsigned NVPTXAddrSpaceMap[] = {
1290 1, // opencl_global
1291 3, // opencl_local
1292 4, // opencl_constant
1293 1, // cuda_device
1294 4, // cuda_constant
1295 3, // cuda_shared
1296 };
1297 class NVPTXTargetInfo : public TargetInfo {
1298 static const char * const GCCRegNames[];
Justin Holewinski2c585b92012-05-24 17:43:12 +00001299 static const Builtin::Info BuiltinInfo[];
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001300 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001301 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001302 BigEndian = false;
1303 TLSSupported = false;
1304 LongWidth = LongAlign = 64;
1305 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00001306 UseAddrSpaceMapMangling = true;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001307 // Define available target features
1308 // These must be defined in sorted order!
Justin Holewinski9903e942012-07-11 15:34:55 +00001309 NoAsmVariants = true;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001310 }
1311 virtual void getTargetDefines(const LangOptions &Opts,
1312 MacroBuilder &Builder) const {
1313 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001314 Builder.defineMacro("__NVPTX__");
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001315 }
1316 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1317 unsigned &NumRecords) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001318 Records = BuiltinInfo;
1319 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001320 }
1321 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001322 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001323 }
1324
1325 virtual void getGCCRegNames(const char * const *&Names,
1326 unsigned &NumNames) const;
1327 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1328 unsigned &NumAliases) const {
1329 // No aliases.
1330 Aliases = 0;
1331 NumAliases = 0;
1332 }
1333 virtual bool validateAsmConstraint(const char *&Name,
Justin Holewinski0ac428e2013-06-21 18:51:24 +00001334 TargetInfo::ConstraintInfo &Info) const {
1335 switch (*Name) {
1336 default: return false;
1337 case 'c':
1338 case 'h':
1339 case 'r':
1340 case 'l':
1341 case 'f':
1342 case 'd':
1343 Info.setAllowsRegister();
1344 return true;
1345 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001346 }
1347 virtual const char *getClobbers() const {
1348 // FIXME: Is this really right?
1349 return "";
1350 }
Meador Ingec5613b22012-06-16 03:34:49 +00001351 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001352 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00001353 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001354 }
1355 virtual bool setCPU(const std::string &Name) {
Justin Holewinskiaffa3af2013-03-30 14:38:26 +00001356 bool Valid = llvm::StringSwitch<bool>(Name)
1357 .Case("sm_20", true)
1358 .Case("sm_21", true)
1359 .Case("sm_30", true)
1360 .Case("sm_35", true)
1361 .Default(false);
1362
1363 return Valid;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001364 }
Justin Holewinski2c585b92012-05-24 17:43:12 +00001365 };
1366
1367 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1368#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1369#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1370 ALL_LANGUAGES },
1371#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001372 };
1373
1374 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1375 "r0"
1376 };
1377
1378 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1379 unsigned &NumNames) const {
1380 Names = GCCRegNames;
1381 NumNames = llvm::array_lengthof(GCCRegNames);
1382 }
1383
1384 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1385 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001386 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001387 PointerWidth = PointerAlign = 32;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001388 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001389 DescriptionString
1390 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1391 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1392 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001393 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001394 };
1395
1396 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1397 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001398 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001399 PointerWidth = PointerAlign = 64;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001400 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001401 DescriptionString
1402 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1403 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1404 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001405 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001406 };
1407}
1408
1409namespace {
Eli Friedman6505a292012-10-12 23:32:00 +00001410
1411static const unsigned R600AddrSpaceMap[] = {
1412 1, // opencl_global
1413 3, // opencl_local
1414 2, // opencl_constant
1415 1, // cuda_device
1416 2, // cuda_constant
1417 3 // cuda_shared
1418};
1419
Tom Stellardfd075912013-03-04 17:40:53 +00001420static const char *DescriptionStringR600 =
1421 "e"
1422 "-p:32:32:32"
1423 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32"
1424 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1425 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1426 "-n32:64";
1427
1428static const char *DescriptionStringR600DoubleOps =
1429 "e"
1430 "-p:32:32:32"
1431 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1432 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1433 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1434 "-n32:64";
1435
1436static const char *DescriptionStringSI =
1437 "e"
1438 "-p:64:64:64"
Tom Stellard9a3d2bd2013-08-27 00:55:26 +00001439 "-p3:32:32:32"
Tom Stellardfd075912013-03-04 17:40:53 +00001440 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1441 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1442 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1443 "-n32:64";
1444
Eli Friedman6505a292012-10-12 23:32:00 +00001445class R600TargetInfo : public TargetInfo {
Tom Stellardfd075912013-03-04 17:40:53 +00001446 /// \brief The GPU profiles supported by the R600 target.
1447 enum GPUKind {
1448 GK_NONE,
1449 GK_R600,
1450 GK_R600_DOUBLE_OPS,
1451 GK_R700,
1452 GK_R700_DOUBLE_OPS,
1453 GK_EVERGREEN,
1454 GK_EVERGREEN_DOUBLE_OPS,
1455 GK_NORTHERN_ISLANDS,
1456 GK_CAYMAN,
1457 GK_SOUTHERN_ISLANDS
1458 } GPU;
1459
Eli Friedman6505a292012-10-12 23:32:00 +00001460public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001461 R600TargetInfo(const llvm::Triple &Triple)
1462 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardfd075912013-03-04 17:40:53 +00001463 DescriptionString = DescriptionStringR600;
Eli Friedman6505a292012-10-12 23:32:00 +00001464 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00001465 UseAddrSpaceMapMangling = true;
Eli Friedman6505a292012-10-12 23:32:00 +00001466 }
1467
1468 virtual const char * getClobbers() const {
1469 return "";
1470 }
1471
1472 virtual void getGCCRegNames(const char * const *&Names,
1473 unsigned &numNames) const {
1474 Names = NULL;
1475 numNames = 0;
1476 }
1477
1478 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1479 unsigned &NumAliases) const {
1480 Aliases = NULL;
1481 NumAliases = 0;
1482 }
1483
1484 virtual bool validateAsmConstraint(const char *&Name,
1485 TargetInfo::ConstraintInfo &info) const {
1486 return true;
1487 }
1488
1489 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1490 unsigned &NumRecords) const {
1491 Records = NULL;
1492 NumRecords = 0;
1493 }
1494
1495
1496 virtual void getTargetDefines(const LangOptions &Opts,
1497 MacroBuilder &Builder) const {
1498 Builder.defineMacro("__R600__");
1499 }
1500
1501 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1502 return TargetInfo::CharPtrBuiltinVaList;
1503 }
1504
Tom Stellardfd075912013-03-04 17:40:53 +00001505 virtual bool setCPU(const std::string &Name) {
1506 GPU = llvm::StringSwitch<GPUKind>(Name)
1507 .Case("r600" , GK_R600)
1508 .Case("rv610", GK_R600)
1509 .Case("rv620", GK_R600)
1510 .Case("rv630", GK_R600)
1511 .Case("rv635", GK_R600)
1512 .Case("rs780", GK_R600)
1513 .Case("rs880", GK_R600)
1514 .Case("rv670", GK_R600_DOUBLE_OPS)
1515 .Case("rv710", GK_R700)
1516 .Case("rv730", GK_R700)
1517 .Case("rv740", GK_R700_DOUBLE_OPS)
1518 .Case("rv770", GK_R700_DOUBLE_OPS)
1519 .Case("palm", GK_EVERGREEN)
1520 .Case("cedar", GK_EVERGREEN)
1521 .Case("sumo", GK_EVERGREEN)
1522 .Case("sumo2", GK_EVERGREEN)
1523 .Case("redwood", GK_EVERGREEN)
1524 .Case("juniper", GK_EVERGREEN)
1525 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1526 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1527 .Case("barts", GK_NORTHERN_ISLANDS)
1528 .Case("turks", GK_NORTHERN_ISLANDS)
1529 .Case("caicos", GK_NORTHERN_ISLANDS)
1530 .Case("cayman", GK_CAYMAN)
1531 .Case("aruba", GK_CAYMAN)
Tom Stellard3b848ec2013-04-01 20:56:49 +00001532 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001533 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1534 .Case("verde", GK_SOUTHERN_ISLANDS)
1535 .Case("oland", GK_SOUTHERN_ISLANDS)
1536 .Default(GK_NONE);
1537
1538 if (GPU == GK_NONE) {
1539 return false;
1540 }
1541
1542 // Set the correct data layout
1543 switch (GPU) {
1544 case GK_NONE:
1545 case GK_R600:
1546 case GK_R700:
1547 case GK_EVERGREEN:
1548 case GK_NORTHERN_ISLANDS:
1549 DescriptionString = DescriptionStringR600;
1550 break;
1551 case GK_R600_DOUBLE_OPS:
1552 case GK_R700_DOUBLE_OPS:
1553 case GK_EVERGREEN_DOUBLE_OPS:
1554 case GK_CAYMAN:
1555 DescriptionString = DescriptionStringR600DoubleOps;
1556 break;
1557 case GK_SOUTHERN_ISLANDS:
1558 DescriptionString = DescriptionStringSI;
1559 break;
1560 }
1561
1562 return true;
1563 }
Eli Friedman6505a292012-10-12 23:32:00 +00001564};
1565
1566} // end anonymous namespace
1567
1568namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001569// Namespace for x86 abstract base class
1570const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001571#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001572#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001573 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001574#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001575};
Eli Friedman61538a72008-05-20 14:21:01 +00001576
Nuno Lopes2550d702009-12-23 17:49:57 +00001577static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001578 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1579 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001580 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001581 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1582 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1583 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001584 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001585 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1586 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001587};
1588
Eric Christophercfd323d2011-06-21 00:05:20 +00001589const TargetInfo::AddlRegName AddlRegNames[] = {
1590 { { "al", "ah", "eax", "rax" }, 0 },
1591 { { "bl", "bh", "ebx", "rbx" }, 3 },
1592 { { "cl", "ch", "ecx", "rcx" }, 2 },
1593 { { "dl", "dh", "edx", "rdx" }, 1 },
1594 { { "esi", "rsi" }, 4 },
1595 { { "edi", "rdi" }, 5 },
1596 { { "esp", "rsp" }, 7 },
1597 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001598};
1599
1600// X86 target abstract base class; x86-32 and x86-64 are very close, so
1601// most of the implementation can be shared.
1602class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001603 enum X86SSEEnum {
Craig Topperb7a95d22013-08-21 03:59:22 +00001604 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner84f0ea82009-03-02 22:40:39 +00001605 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001606 enum MMX3DNowEnum {
1607 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1608 } MMX3DNowLevel;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001609 enum XOPEnum {
1610 NoXOP,
1611 SSE4A,
1612 FMA4,
1613 XOP
1614 } XOPLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001615
Eric Christophereea12d12010-04-02 23:50:19 +00001616 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001617 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001618 bool HasLZCNT;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001619 bool HasRDRND;
Craig Topper31ceea02011-12-25 05:06:45 +00001620 bool HasBMI;
1621 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001622 bool HasPOPCNT;
Michael Liao463eb892012-11-10 05:17:46 +00001623 bool HasRTM;
Michael Liao72339a02013-03-26 17:52:08 +00001624 bool HasPRFCHW;
Michael Liao1bfc28c2013-03-29 05:17:55 +00001625 bool HasRDSEED;
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00001626 bool HasTBM;
Craig Topper2ae95072012-06-03 21:46:30 +00001627 bool HasFMA;
Manman Ren146e5a42012-10-11 00:59:55 +00001628 bool HasF16C;
Craig Topperbca2c4f2013-08-21 05:29:10 +00001629 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuirb83f5a72013-09-19 13:22:04 +00001630 bool HasSHA;
Nick Lewyckyaf945462013-10-05 20:14:27 +00001631 bool HasCX16;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001632
Chandler Carruth499d9722011-09-28 08:55:34 +00001633 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1634 ///
1635 /// Each enumeration represents a particular CPU supported by Clang. These
1636 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1637 enum CPUKind {
1638 CK_Generic,
1639
1640 /// \name i386
1641 /// i386-generation processors.
1642 //@{
1643 CK_i386,
1644 //@}
1645
1646 /// \name i486
1647 /// i486-generation processors.
1648 //@{
1649 CK_i486,
1650 CK_WinChipC6,
1651 CK_WinChip2,
1652 CK_C3,
1653 //@}
1654
1655 /// \name i586
1656 /// i586-generation processors, P5 microarchitecture based.
1657 //@{
1658 CK_i586,
1659 CK_Pentium,
1660 CK_PentiumMMX,
1661 //@}
1662
1663 /// \name i686
1664 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1665 //@{
1666 CK_i686,
1667 CK_PentiumPro,
1668 CK_Pentium2,
1669 CK_Pentium3,
1670 CK_Pentium3M,
1671 CK_PentiumM,
1672 CK_C3_2,
1673
1674 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1675 /// Clang however has some logic to suport this.
1676 // FIXME: Warn, deprecate, and potentially remove this.
1677 CK_Yonah,
1678 //@}
1679
1680 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001681 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001682 //@{
1683 CK_Pentium4,
1684 CK_Pentium4M,
1685 CK_Prescott,
1686 CK_Nocona,
1687 //@}
1688
1689 /// \name Core
1690 /// Core microarchitecture based processors.
1691 //@{
1692 CK_Core2,
1693
1694 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1695 /// codename which GCC no longer accepts as an option to -march, but Clang
1696 /// has some logic for recognizing it.
1697 // FIXME: Warn, deprecate, and potentially remove this.
1698 CK_Penryn,
1699 //@}
1700
1701 /// \name Atom
1702 /// Atom processors
1703 //@{
1704 CK_Atom,
Preston Gurdc57ea682013-09-13 19:27:17 +00001705 CK_Silvermont,
Chandler Carruth499d9722011-09-28 08:55:34 +00001706 //@}
1707
1708 /// \name Nehalem
1709 /// Nehalem microarchitecture based processors.
1710 //@{
1711 CK_Corei7,
1712 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001713 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001714 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001715 //@}
1716
Craig Topper10c2c682013-08-20 07:09:39 +00001717 /// \name Knights Landing
1718 /// Knights Landing processor.
1719 CK_KNL,
1720
Chandler Carruth499d9722011-09-28 08:55:34 +00001721 /// \name K6
1722 /// K6 architecture processors.
1723 //@{
1724 CK_K6,
1725 CK_K6_2,
1726 CK_K6_3,
1727 //@}
1728
1729 /// \name K7
1730 /// K7 architecture processors.
1731 //@{
1732 CK_Athlon,
1733 CK_AthlonThunderbird,
1734 CK_Athlon4,
1735 CK_AthlonXP,
1736 CK_AthlonMP,
1737 //@}
1738
1739 /// \name K8
1740 /// K8 architecture processors.
1741 //@{
1742 CK_Athlon64,
1743 CK_Athlon64SSE3,
1744 CK_AthlonFX,
1745 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001746 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001747 CK_Opteron,
1748 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001749 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001750 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001751
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001752 /// \name Bobcat
1753 /// Bobcat architecture processors.
1754 //@{
1755 CK_BTVER1,
Benjamin Kramer63063f52013-05-03 10:47:15 +00001756 CK_BTVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001757 //@}
1758
1759 /// \name Bulldozer
1760 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001761 //@{
1762 CK_BDVER1,
1763 CK_BDVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001764 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001765
Chandler Carruth499d9722011-09-28 08:55:34 +00001766 /// This specification is deprecated and will be removed in the future.
1767 /// Users should prefer \see CK_K8.
1768 // FIXME: Warn on this when the CPU is set to it.
1769 CK_x86_64,
1770 //@}
1771
1772 /// \name Geode
1773 /// Geode processors.
1774 //@{
1775 CK_Geode
1776 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001777 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001778
Rafael Espindola5389b842013-08-21 21:59:03 +00001779 enum FPMathKind {
1780 FP_Default,
1781 FP_SSE,
1782 FP_387
1783 } FPMath;
1784
Eli Friedman618234a2008-08-20 02:34:37 +00001785public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001786 X86TargetInfo(const llvm::Triple &Triple)
1787 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001788 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1789 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00001790 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1791 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewyckyaf945462013-10-05 20:14:27 +00001792 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1793 FPMath(FP_Default) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001794 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001795 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001796 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001797 virtual unsigned getFloatEvalMethod() const {
1798 // X87 evaluates with 80 bits "long double" precision.
1799 return SSELevel == NoSSE ? 2 : 0;
1800 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001801 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1802 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001803 Records = BuiltinInfo;
1804 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001805 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001806 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001807 unsigned &NumNames) const {
1808 Names = GCCRegNames;
1809 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001810 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001811 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001812 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001813 Aliases = 0;
1814 NumAliases = 0;
1815 }
1816 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopher825d3862012-11-14 22:08:59 +00001817 unsigned &NumNames) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001818 Names = AddlRegNames;
1819 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001820 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001821 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001822 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001823 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001824 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001825 return "~{dirflag},~{fpsr},~{flags}";
1826 }
Chris Lattner33328642009-03-20 15:52:06 +00001827 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001828 MacroBuilder &Builder) const;
Craig Topper319d81f2013-09-17 04:12:55 +00001829 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1830 bool Enabled);
1831 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1832 bool Enabled);
1833 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1834 bool Enabled);
Rafael Espindolaade7cd42013-08-20 15:30:32 +00001835 virtual void setFeatureEnabled(llvm::StringMap<bool> &Features,
Craig Topper85bfef62013-09-17 04:51:29 +00001836 StringRef Name, bool Enabled) const {
1837 setFeatureEnabledImpl(Features, Name, Enabled);
1838 }
1839 // This exists purely to cut down on the number of virtual calls in
1840 // getDefaultFeatures which calls this repeatedly.
1841 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1842 StringRef Name, bool Enabled);
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001843 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregore727d212012-01-30 06:38:25 +00001844 virtual bool hasFeature(StringRef Feature) const;
Eric Christopher3d11ced2013-10-16 21:26:26 +00001845 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindola5389b842013-08-21 21:59:03 +00001846 DiagnosticsEngine &Diags);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001847 virtual const char* getABI() const {
Derek Schuffbabaf312012-10-11 15:52:22 +00001848 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001849 return "avx";
Derek Schuffbabaf312012-10-11 15:52:22 +00001850 else if (getTriple().getArch() == llvm::Triple::x86 &&
1851 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001852 return "no-mmx";
1853 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001854 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001855 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001856 CPU = llvm::StringSwitch<CPUKind>(Name)
1857 .Case("i386", CK_i386)
1858 .Case("i486", CK_i486)
1859 .Case("winchip-c6", CK_WinChipC6)
1860 .Case("winchip2", CK_WinChip2)
1861 .Case("c3", CK_C3)
1862 .Case("i586", CK_i586)
1863 .Case("pentium", CK_Pentium)
1864 .Case("pentium-mmx", CK_PentiumMMX)
1865 .Case("i686", CK_i686)
1866 .Case("pentiumpro", CK_PentiumPro)
1867 .Case("pentium2", CK_Pentium2)
1868 .Case("pentium3", CK_Pentium3)
1869 .Case("pentium3m", CK_Pentium3M)
1870 .Case("pentium-m", CK_PentiumM)
1871 .Case("c3-2", CK_C3_2)
1872 .Case("yonah", CK_Yonah)
1873 .Case("pentium4", CK_Pentium4)
1874 .Case("pentium4m", CK_Pentium4M)
1875 .Case("prescott", CK_Prescott)
1876 .Case("nocona", CK_Nocona)
1877 .Case("core2", CK_Core2)
1878 .Case("penryn", CK_Penryn)
1879 .Case("atom", CK_Atom)
Preston Gurdc57ea682013-09-13 19:27:17 +00001880 .Case("slm", CK_Silvermont)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001881 .Case("corei7", CK_Corei7)
1882 .Case("corei7-avx", CK_Corei7AVX)
1883 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001884 .Case("core-avx2", CK_CoreAVX2)
Craig Topper10c2c682013-08-20 07:09:39 +00001885 .Case("knl", CK_KNL)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001886 .Case("k6", CK_K6)
1887 .Case("k6-2", CK_K6_2)
1888 .Case("k6-3", CK_K6_3)
1889 .Case("athlon", CK_Athlon)
1890 .Case("athlon-tbird", CK_AthlonThunderbird)
1891 .Case("athlon-4", CK_Athlon4)
1892 .Case("athlon-xp", CK_AthlonXP)
1893 .Case("athlon-mp", CK_AthlonMP)
1894 .Case("athlon64", CK_Athlon64)
1895 .Case("athlon64-sse3", CK_Athlon64SSE3)
1896 .Case("athlon-fx", CK_AthlonFX)
1897 .Case("k8", CK_K8)
1898 .Case("k8-sse3", CK_K8SSE3)
1899 .Case("opteron", CK_Opteron)
1900 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001901 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001902 .Case("btver1", CK_BTVER1)
Benjamin Kramer63063f52013-05-03 10:47:15 +00001903 .Case("btver2", CK_BTVER2)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001904 .Case("bdver1", CK_BDVER1)
1905 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001906 .Case("x86-64", CK_x86_64)
1907 .Case("geode", CK_Geode)
1908 .Default(CK_Generic);
1909
Chandler Carruth26a39142011-09-28 09:45:08 +00001910 // Perform any per-CPU checks necessary to determine if this CPU is
1911 // acceptable.
1912 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1913 // invalid without explaining *why*.
1914 switch (CPU) {
1915 case CK_Generic:
1916 // No processor selected!
1917 return false;
1918
1919 case CK_i386:
1920 case CK_i486:
1921 case CK_WinChipC6:
1922 case CK_WinChip2:
1923 case CK_C3:
1924 case CK_i586:
1925 case CK_Pentium:
1926 case CK_PentiumMMX:
1927 case CK_i686:
1928 case CK_PentiumPro:
1929 case CK_Pentium2:
1930 case CK_Pentium3:
1931 case CK_Pentium3M:
1932 case CK_PentiumM:
1933 case CK_Yonah:
1934 case CK_C3_2:
1935 case CK_Pentium4:
1936 case CK_Pentium4M:
1937 case CK_Prescott:
1938 case CK_K6:
1939 case CK_K6_2:
1940 case CK_K6_3:
1941 case CK_Athlon:
1942 case CK_AthlonThunderbird:
1943 case CK_Athlon4:
1944 case CK_AthlonXP:
1945 case CK_AthlonMP:
1946 case CK_Geode:
1947 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffbabaf312012-10-11 15:52:22 +00001948 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth26a39142011-09-28 09:45:08 +00001949 return false;
1950
1951 // Fallthrough
1952 case CK_Nocona:
1953 case CK_Core2:
1954 case CK_Penryn:
1955 case CK_Atom:
Preston Gurdc57ea682013-09-13 19:27:17 +00001956 case CK_Silvermont:
Chandler Carruth26a39142011-09-28 09:45:08 +00001957 case CK_Corei7:
1958 case CK_Corei7AVX:
1959 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001960 case CK_CoreAVX2:
Craig Topper10c2c682013-08-20 07:09:39 +00001961 case CK_KNL:
Chandler Carruth26a39142011-09-28 09:45:08 +00001962 case CK_Athlon64:
1963 case CK_Athlon64SSE3:
1964 case CK_AthlonFX:
1965 case CK_K8:
1966 case CK_K8SSE3:
1967 case CK_Opteron:
1968 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00001969 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001970 case CK_BTVER1:
Benjamin Kramer63063f52013-05-03 10:47:15 +00001971 case CK_BTVER2:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001972 case CK_BDVER1:
1973 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001974 case CK_x86_64:
1975 return true;
1976 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00001977 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001978 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00001979
Rafael Espindola5389b842013-08-21 21:59:03 +00001980 virtual bool setFPMath(StringRef Name);
1981
Aaron Ballman82bfa192012-10-02 14:26:08 +00001982 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1983 // We accept all non-ARM calling conventions
1984 return (CC == CC_X86ThisCall ||
1985 CC == CC_X86FastCall ||
Peter Collingbourne7728cdd2013-02-23 00:06:18 +00001986 CC == CC_X86StdCall ||
1987 CC == CC_C ||
Guy Benyei38980082012-12-25 08:53:55 +00001988 CC == CC_X86Pascal ||
1989 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00001990 }
1991
Aaron Ballmanfff32482012-12-09 17:45:41 +00001992 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1993 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00001994 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001995};
Chris Lattner3daed522009-03-02 22:20:04 +00001996
Rafael Espindola5389b842013-08-21 21:59:03 +00001997bool X86TargetInfo::setFPMath(StringRef Name) {
1998 if (Name == "387") {
1999 FPMath = FP_387;
2000 return true;
2001 }
2002 if (Name == "sse") {
2003 FPMath = FP_SSE;
2004 return true;
2005 }
2006 return false;
2007}
2008
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002009void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002010 // FIXME: This *really* should not be here.
2011
2012 // X86_64 always has SSE2.
Derek Schuffbabaf312012-10-11 15:52:22 +00002013 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper85bfef62013-09-17 04:51:29 +00002014 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002015
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002016 switch (CPU) {
2017 case CK_Generic:
2018 case CK_i386:
2019 case CK_i486:
2020 case CK_i586:
2021 case CK_Pentium:
2022 case CK_i686:
2023 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002024 break;
2025 case CK_PentiumMMX:
2026 case CK_Pentium2:
Craig Topper85bfef62013-09-17 04:51:29 +00002027 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002028 break;
2029 case CK_Pentium3:
2030 case CK_Pentium3M:
Craig Topper85bfef62013-09-17 04:51:29 +00002031 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002032 break;
2033 case CK_PentiumM:
2034 case CK_Pentium4:
2035 case CK_Pentium4M:
2036 case CK_x86_64:
Craig Topper85bfef62013-09-17 04:51:29 +00002037 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002038 break;
2039 case CK_Yonah:
2040 case CK_Prescott:
2041 case CK_Nocona:
Craig Topper85bfef62013-09-17 04:51:29 +00002042 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002043 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002044 break;
2045 case CK_Core2:
Craig Topper85bfef62013-09-17 04:51:29 +00002046 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002047 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002048 break;
2049 case CK_Penryn:
Craig Topper85bfef62013-09-17 04:51:29 +00002050 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002051 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002052 break;
2053 case CK_Atom:
Craig Topper85bfef62013-09-17 04:51:29 +00002054 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002055 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002056 break;
Preston Gurdc57ea682013-09-13 19:27:17 +00002057 case CK_Silvermont:
Craig Topper85bfef62013-09-17 04:51:29 +00002058 setFeatureEnabledImpl(Features, "sse4.2", true);
2059 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002060 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002061 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurdc57ea682013-09-13 19:27:17 +00002062 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002063 case CK_Corei7:
Craig Topper85bfef62013-09-17 04:51:29 +00002064 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002065 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002066 break;
2067 case CK_Corei7AVX:
Craig Topper85bfef62013-09-17 04:51:29 +00002068 setFeatureEnabledImpl(Features, "avx", true);
2069 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002070 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002071 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002072 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002073 case CK_CoreAVXi:
Craig Topper85bfef62013-09-17 04:51:29 +00002074 setFeatureEnabledImpl(Features, "avx", true);
2075 setFeatureEnabledImpl(Features, "aes", true);
2076 setFeatureEnabledImpl(Features, "pclmul", true);
2077 setFeatureEnabledImpl(Features, "rdrnd", true);
2078 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002079 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00002080 case CK_CoreAVX2:
Craig Topper85bfef62013-09-17 04:51:29 +00002081 setFeatureEnabledImpl(Features, "avx2", true);
2082 setFeatureEnabledImpl(Features, "aes", true);
2083 setFeatureEnabledImpl(Features, "pclmul", true);
2084 setFeatureEnabledImpl(Features, "lzcnt", true);
2085 setFeatureEnabledImpl(Features, "rdrnd", true);
2086 setFeatureEnabledImpl(Features, "f16c", true);
2087 setFeatureEnabledImpl(Features, "bmi", true);
2088 setFeatureEnabledImpl(Features, "bmi2", true);
2089 setFeatureEnabledImpl(Features, "rtm", true);
2090 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002091 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002092 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002093 case CK_KNL:
Craig Topper85bfef62013-09-17 04:51:29 +00002094 setFeatureEnabledImpl(Features, "avx512f", true);
2095 setFeatureEnabledImpl(Features, "avx512cd", true);
2096 setFeatureEnabledImpl(Features, "avx512er", true);
2097 setFeatureEnabledImpl(Features, "avx512pf", true);
2098 setFeatureEnabledImpl(Features, "aes", true);
2099 setFeatureEnabledImpl(Features, "pclmul", true);
2100 setFeatureEnabledImpl(Features, "lzcnt", true);
2101 setFeatureEnabledImpl(Features, "rdrnd", true);
2102 setFeatureEnabledImpl(Features, "f16c", true);
2103 setFeatureEnabledImpl(Features, "bmi", true);
2104 setFeatureEnabledImpl(Features, "bmi2", true);
2105 setFeatureEnabledImpl(Features, "rtm", true);
2106 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper10c2c682013-08-20 07:09:39 +00002107 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002108 case CK_K6:
2109 case CK_WinChipC6:
Craig Topper85bfef62013-09-17 04:51:29 +00002110 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002111 break;
2112 case CK_K6_2:
2113 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002114 case CK_WinChip2:
2115 case CK_C3:
Craig Topper85bfef62013-09-17 04:51:29 +00002116 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002117 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00002118 case CK_Athlon:
2119 case CK_AthlonThunderbird:
2120 case CK_Geode:
Craig Topper85bfef62013-09-17 04:51:29 +00002121 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00002122 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002123 case CK_Athlon4:
2124 case CK_AthlonXP:
2125 case CK_AthlonMP:
Craig Topper85bfef62013-09-17 04:51:29 +00002126 setFeatureEnabledImpl(Features, "sse", true);
2127 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002128 break;
2129 case CK_K8:
2130 case CK_Opteron:
2131 case CK_Athlon64:
2132 case CK_AthlonFX:
Craig Topper85bfef62013-09-17 04:51:29 +00002133 setFeatureEnabledImpl(Features, "sse2", true);
2134 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002135 break;
2136 case CK_K8SSE3:
2137 case CK_OpteronSSE3:
2138 case CK_Athlon64SSE3:
Craig Topper85bfef62013-09-17 04:51:29 +00002139 setFeatureEnabledImpl(Features, "sse3", true);
2140 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00002141 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002142 case CK_AMDFAM10:
Craig Topper85bfef62013-09-17 04:51:29 +00002143 setFeatureEnabledImpl(Features, "sse3", true);
2144 setFeatureEnabledImpl(Features, "sse4a", true);
2145 setFeatureEnabledImpl(Features, "3dnowa", true);
2146 setFeatureEnabledImpl(Features, "lzcnt", true);
2147 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002148 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002149 case CK_BTVER1:
Craig Topper85bfef62013-09-17 04:51:29 +00002150 setFeatureEnabledImpl(Features, "ssse3", true);
2151 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002152 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002153 setFeatureEnabledImpl(Features, "lzcnt", true);
2154 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002155 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper90ea0362012-05-30 05:54:54 +00002156 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00002157 case CK_BTVER2:
Craig Topper85bfef62013-09-17 04:51:29 +00002158 setFeatureEnabledImpl(Features, "avx", true);
2159 setFeatureEnabledImpl(Features, "sse4a", true);
2160 setFeatureEnabledImpl(Features, "lzcnt", true);
2161 setFeatureEnabledImpl(Features, "aes", true);
2162 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002163 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002164 setFeatureEnabledImpl(Features, "bmi", true);
2165 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002166 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer63063f52013-05-03 10:47:15 +00002167 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002168 case CK_BDVER1:
Craig Topper85bfef62013-09-17 04:51:29 +00002169 setFeatureEnabledImpl(Features, "xop", true);
2170 setFeatureEnabledImpl(Features, "lzcnt", true);
2171 setFeatureEnabledImpl(Features, "aes", true);
2172 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002173 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002174 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedmanf5824992012-11-26 21:57:28 +00002175 break;
Eli Friedmanfaf35382012-11-17 01:43:10 +00002176 case CK_BDVER2:
Craig Topper85bfef62013-09-17 04:51:29 +00002177 setFeatureEnabledImpl(Features, "xop", true);
2178 setFeatureEnabledImpl(Features, "lzcnt", true);
2179 setFeatureEnabledImpl(Features, "aes", true);
2180 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002181 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002182 setFeatureEnabledImpl(Features, "bmi", true);
2183 setFeatureEnabledImpl(Features, "fma", true);
2184 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002185 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002186 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002187 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002188 case CK_C3_2:
Craig Topper85bfef62013-09-17 04:51:29 +00002189 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002190 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002191 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002192}
2193
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002194void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper319d81f2013-09-17 04:12:55 +00002195 X86SSEEnum Level, bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002196 if (Enabled) {
2197 switch (Level) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002198 case AVX512F:
2199 Features["avx512f"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002200 case AVX2:
2201 Features["avx2"] = true;
2202 case AVX:
2203 Features["avx"] = true;
2204 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002205 Features["sse4.2"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002206 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002207 Features["sse4.1"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002208 case SSSE3:
2209 Features["ssse3"] = true;
2210 case SSE3:
2211 Features["sse3"] = true;
2212 case SSE2:
2213 Features["sse2"] = true;
2214 case SSE1:
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002215 Features["sse"] = true;
2216 case NoSSE:
2217 break;
2218 }
2219 return;
2220 }
2221
2222 switch (Level) {
2223 case NoSSE:
2224 case SSE1:
2225 Features["sse"] = false;
2226 case SSE2:
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002227 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2228 Features["sha"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002229 case SSE3:
2230 Features["sse3"] = false;
2231 setXOPLevel(Features, NoXOP, false);
2232 case SSSE3:
2233 Features["ssse3"] = false;
2234 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002235 Features["sse4.1"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002236 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002237 Features["sse4.2"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002238 case AVX:
Craig Topper84f007b2013-09-16 04:54:13 +00002239 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola29f26de2013-08-21 13:28:02 +00002240 setXOPLevel(Features, FMA4, false);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002241 case AVX2:
2242 Features["avx2"] = false;
Craig Topperb7a95d22013-08-21 03:59:22 +00002243 case AVX512F:
Craig Topperbca2c4f2013-08-21 05:29:10 +00002244 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2245 Features["avx512pf"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002246 }
2247}
2248
2249void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper319d81f2013-09-17 04:12:55 +00002250 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002251 if (Enabled) {
2252 switch (Level) {
2253 case AMD3DNowAthlon:
2254 Features["3dnowa"] = true;
2255 case AMD3DNow:
2256 Features["3dnow"] = true;
2257 case MMX:
2258 Features["mmx"] = true;
2259 case NoMMX3DNow:
2260 break;
2261 }
2262 return;
2263 }
2264
2265 switch (Level) {
2266 case NoMMX3DNow:
2267 case MMX:
2268 Features["mmx"] = false;
2269 case AMD3DNow:
2270 Features["3dnow"] = false;
2271 case AMD3DNowAthlon:
2272 Features["3dnowa"] = false;
2273 }
2274}
2275
2276void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper319d81f2013-09-17 04:12:55 +00002277 bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002278 if (Enabled) {
2279 switch (Level) {
2280 case XOP:
2281 Features["xop"] = true;
2282 case FMA4:
2283 Features["fma4"] = true;
2284 setSSELevel(Features, AVX, true);
2285 case SSE4A:
2286 Features["sse4a"] = true;
2287 setSSELevel(Features, SSE3, true);
2288 case NoXOP:
2289 break;
2290 }
2291 return;
2292 }
2293
2294 switch (Level) {
2295 case NoXOP:
2296 case SSE4A:
2297 Features["sse4a"] = false;
2298 case FMA4:
2299 Features["fma4"] = false;
2300 case XOP:
2301 Features["xop"] = false;
2302 }
2303}
2304
Craig Topper85bfef62013-09-17 04:51:29 +00002305void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2306 StringRef Name, bool Enabled) {
Eric Christopherd39ebe22010-03-04 02:26:37 +00002307 // FIXME: This *really* should not be here. We need some way of translating
2308 // options into llvm subtarget features.
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002309 if (Name == "sse4")
2310 Name = "sse4.2";
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002311
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002312 Features[Name] = Enabled;
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002313
Craig Topperb22352e2013-09-19 01:13:07 +00002314 if (Name == "mmx") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002315 setMMXLevel(Features, MMX, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002316 } else if (Name == "sse") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002317 setSSELevel(Features, SSE1, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002318 } else if (Name == "sse2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002319 setSSELevel(Features, SSE2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002320 } else if (Name == "sse3") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002321 setSSELevel(Features, SSE3, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002322 } else if (Name == "ssse3") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002323 setSSELevel(Features, SSSE3, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002324 } else if (Name == "sse4.2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002325 setSSELevel(Features, SSE42, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002326 } else if (Name == "sse4.1") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002327 setSSELevel(Features, SSE41, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002328 } else if (Name == "3dnow") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002329 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002330 } else if (Name == "3dnowa") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002331 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002332 } else if (Name == "aes") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002333 if (Enabled)
2334 setSSELevel(Features, SSE2, Enabled);
2335 } else if (Name == "pclmul") {
2336 if (Enabled)
2337 setSSELevel(Features, SSE2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002338 } else if (Name == "avx") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002339 setSSELevel(Features, AVX, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002340 } else if (Name == "avx2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002341 setSSELevel(Features, AVX2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002342 } else if (Name == "avx512f") {
Craig Topperb7a95d22013-08-21 03:59:22 +00002343 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002344 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topperbca2c4f2013-08-21 05:29:10 +00002345 if (Enabled)
2346 setSSELevel(Features, AVX512F, Enabled);
2347 } else if (Name == "fma") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002348 if (Enabled)
2349 setSSELevel(Features, AVX, Enabled);
2350 } else if (Name == "fma4") {
2351 setXOPLevel(Features, FMA4, Enabled);
2352 } else if (Name == "xop") {
2353 setXOPLevel(Features, XOP, Enabled);
2354 } else if (Name == "sse4a") {
2355 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper84f007b2013-09-16 04:54:13 +00002356 } else if (Name == "f16c") {
2357 if (Enabled)
2358 setSSELevel(Features, AVX, Enabled);
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002359 } else if (Name == "sha") {
2360 if (Enabled)
2361 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002362 }
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002363}
2364
Eric Christopher3d11ced2013-10-16 21:26:26 +00002365/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002366/// configured set of features.
Eric Christopher3d11ced2013-10-16 21:26:26 +00002367bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindola5389b842013-08-21 21:59:03 +00002368 DiagnosticsEngine &Diags) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002369 // Remember the maximum enabled sselevel.
2370 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2371 // Ignore disabled features.
2372 if (Features[i][0] == '-')
2373 continue;
2374
Benjamin Kramer713575a2012-03-05 15:10:44 +00002375 StringRef Feature = StringRef(Features[i]).substr(1);
2376
2377 if (Feature == "aes") {
Eric Christophereea12d12010-04-02 23:50:19 +00002378 HasAES = true;
2379 continue;
2380 }
2381
Craig Topper3c0bc152012-05-31 05:18:48 +00002382 if (Feature == "pclmul") {
2383 HasPCLMUL = true;
2384 continue;
2385 }
2386
Benjamin Kramer713575a2012-03-05 15:10:44 +00002387 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00002388 HasLZCNT = true;
2389 continue;
2390 }
2391
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002392 if (Feature == "rdrnd") {
Benjamin Kramer84f30802012-07-07 09:39:18 +00002393 HasRDRND = true;
2394 continue;
2395 }
2396
Benjamin Kramer713575a2012-03-05 15:10:44 +00002397 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00002398 HasBMI = true;
2399 continue;
2400 }
2401
Benjamin Kramer713575a2012-03-05 15:10:44 +00002402 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00002403 HasBMI2 = true;
2404 continue;
2405 }
2406
Benjamin Kramer713575a2012-03-05 15:10:44 +00002407 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00002408 HasPOPCNT = true;
2409 continue;
2410 }
2411
Michael Liao463eb892012-11-10 05:17:46 +00002412 if (Feature == "rtm") {
2413 HasRTM = true;
2414 continue;
2415 }
2416
Michael Liao72339a02013-03-26 17:52:08 +00002417 if (Feature == "prfchw") {
2418 HasPRFCHW = true;
2419 continue;
2420 }
2421
Michael Liao1bfc28c2013-03-29 05:17:55 +00002422 if (Feature == "rdseed") {
2423 HasRDSEED = true;
2424 continue;
2425 }
2426
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002427 if (Feature == "tbm") {
2428 HasTBM = true;
2429 continue;
2430 }
2431
Craig Topper2ae95072012-06-03 21:46:30 +00002432 if (Feature == "fma") {
2433 HasFMA = true;
2434 continue;
2435 }
2436
Manman Ren146e5a42012-10-11 00:59:55 +00002437 if (Feature == "f16c") {
2438 HasF16C = true;
2439 continue;
2440 }
2441
Craig Topperbca2c4f2013-08-21 05:29:10 +00002442 if (Feature == "avx512cd") {
2443 HasAVX512CD = true;
2444 continue;
2445 }
2446
2447 if (Feature == "avx512er") {
2448 HasAVX512ER = true;
2449 continue;
2450 }
2451
2452 if (Feature == "avx512pf") {
2453 HasAVX512PF = true;
2454 continue;
2455 }
2456
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002457 if (Feature == "sha") {
2458 HasSHA = true;
2459 continue;
2460 }
2461
Nick Lewyckyaf945462013-10-05 20:14:27 +00002462 if (Feature == "cx16") {
2463 HasCX16 = true;
2464 continue;
2465 }
2466
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002467 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00002468 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topperbca2c4f2013-08-21 05:29:10 +00002469 .Case("avx512f", AVX512F)
Craig Topper05fe4b52012-01-09 09:19:09 +00002470 .Case("avx2", AVX2)
2471 .Case("avx", AVX)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002472 .Case("sse4.2", SSE42)
2473 .Case("sse4.1", SSE41)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002474 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00002475 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002476 .Case("sse2", SSE2)
2477 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002478 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002479 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002480
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002481 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00002482 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002483 .Case("3dnowa", AMD3DNowAthlon)
2484 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002485 .Case("mmx", MMX)
2486 .Default(NoMMX3DNow);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002487 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002488
2489 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2490 .Case("xop", XOP)
2491 .Case("fma4", FMA4)
2492 .Case("sse4a", SSE4A)
2493 .Default(NoXOP);
2494 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002495 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002496
Craig Topper89a5e792013-09-10 06:55:47 +00002497 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2498 // Can't do this earlier because we need to be able to explicitly enable
2499 // popcnt and still disable sse4.2.
2500 if (!HasPOPCNT && SSELevel >= SSE42 &&
2501 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2502 HasPOPCNT = true;
2503 Features.push_back("+popcnt");
2504 }
2505
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002506 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2507 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2508 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2509 HasPRFCHW = true;
2510 Features.push_back("+prfchw");
2511 }
2512
Rafael Espindola5389b842013-08-21 21:59:03 +00002513 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2514 // matches the selected sse level.
2515 if (FPMath == FP_SSE && SSELevel < SSE1) {
2516 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2517 return false;
2518 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2519 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2520 return false;
2521 }
2522
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002523 // Don't tell the backend if we're turning off mmx; it will end up disabling
2524 // SSE, which we don't want.
Craig Topper56bed972013-09-11 06:48:53 +00002525 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2526 // then enable MMX.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002527 std::vector<std::string>::iterator it;
2528 it = std::find(Features.begin(), Features.end(), "-mmx");
2529 if (it != Features.end())
2530 Features.erase(it);
Craig Topper56bed972013-09-11 06:48:53 +00002531 else if (SSELevel > NoSSE)
2532 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindola5389b842013-08-21 21:59:03 +00002533 return true;
Chris Lattner3daed522009-03-02 22:20:04 +00002534}
Chris Lattnerc0f59212009-03-02 22:27:17 +00002535
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002536/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2537/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00002538void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002539 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002540 // Target identification.
Derek Schuffbabaf312012-10-11 15:52:22 +00002541 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002542 Builder.defineMacro("__amd64__");
2543 Builder.defineMacro("__amd64");
2544 Builder.defineMacro("__x86_64");
2545 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00002546 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00002547 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00002548 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002549
Chris Lattnerc0f59212009-03-02 22:27:17 +00002550 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002551 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2552 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002553 switch (CPU) {
2554 case CK_Generic:
2555 break;
2556 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002557 // The rest are coming from the i386 define above.
2558 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002559 break;
2560 case CK_i486:
2561 case CK_WinChipC6:
2562 case CK_WinChip2:
2563 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002564 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002565 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002566 case CK_PentiumMMX:
2567 Builder.defineMacro("__pentium_mmx__");
2568 Builder.defineMacro("__tune_pentium_mmx__");
2569 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002570 case CK_i586:
2571 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002572 defineCPUMacros(Builder, "i586");
2573 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002574 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002575 case CK_Pentium3:
2576 case CK_Pentium3M:
2577 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002578 Builder.defineMacro("__tune_pentium3__");
2579 // Fallthrough
2580 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002581 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002582 Builder.defineMacro("__tune_pentium2__");
2583 // Fallthrough
2584 case CK_PentiumPro:
2585 Builder.defineMacro("__tune_i686__");
2586 Builder.defineMacro("__tune_pentiumpro__");
2587 // Fallthrough
2588 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002589 Builder.defineMacro("__i686");
2590 Builder.defineMacro("__i686__");
2591 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2592 Builder.defineMacro("__pentiumpro");
2593 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002594 break;
2595 case CK_Pentium4:
2596 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002597 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002598 break;
2599 case CK_Yonah:
2600 case CK_Prescott:
2601 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002602 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002603 break;
2604 case CK_Core2:
2605 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002606 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002607 break;
2608 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002609 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002610 break;
Preston Gurdc57ea682013-09-13 19:27:17 +00002611 case CK_Silvermont:
Benjamin Kramerb98ce372013-08-30 14:05:34 +00002612 defineCPUMacros(Builder, "slm");
2613 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002614 case CK_Corei7:
2615 case CK_Corei7AVX:
2616 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002617 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002618 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002619 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002620 case CK_KNL:
2621 defineCPUMacros(Builder, "knl");
2622 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002623 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002624 Builder.defineMacro("__k6_2__");
2625 Builder.defineMacro("__tune_k6_2__");
2626 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002627 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002628 if (CPU != CK_K6_2) { // In case of fallthrough
2629 // FIXME: GCC may be enabling these in cases where some other k6
2630 // architecture is specified but -m3dnow is explicitly provided. The
2631 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002632 Builder.defineMacro("__k6_3__");
2633 Builder.defineMacro("__tune_k6_3__");
2634 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00002635 // Fallthrough
2636 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002637 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002638 break;
2639 case CK_Athlon:
2640 case CK_AthlonThunderbird:
2641 case CK_Athlon4:
2642 case CK_AthlonXP:
2643 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002644 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002645 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002646 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002647 Builder.defineMacro("__tune_athlon_sse__");
2648 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002649 break;
2650 case CK_K8:
2651 case CK_K8SSE3:
2652 case CK_x86_64:
2653 case CK_Opteron:
2654 case CK_OpteronSSE3:
2655 case CK_Athlon64:
2656 case CK_Athlon64SSE3:
2657 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002658 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002659 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002660 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002661 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00002662 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002663 case CK_BTVER1:
2664 defineCPUMacros(Builder, "btver1");
2665 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00002666 case CK_BTVER2:
2667 defineCPUMacros(Builder, "btver2");
2668 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002669 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002670 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002671 break;
2672 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002673 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002674 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002675 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002676 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002677 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002678 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00002679
Chandler Carruth88c75b02011-09-28 09:54:07 +00002680 // Target properties.
2681 Builder.defineMacro("__LITTLE_ENDIAN__");
2682 Builder.defineMacro("__REGISTER_PREFIX__", "");
2683
Chris Lattner54175442009-04-19 17:32:33 +00002684 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2685 // functions in glibc header files that use FP Stack inline asm which the
2686 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00002687 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002688
Chandler Carruth88c75b02011-09-28 09:54:07 +00002689 if (HasAES)
2690 Builder.defineMacro("__AES__");
2691
Craig Topper3c0bc152012-05-31 05:18:48 +00002692 if (HasPCLMUL)
2693 Builder.defineMacro("__PCLMUL__");
2694
Craig Topper31ceea02011-12-25 05:06:45 +00002695 if (HasLZCNT)
2696 Builder.defineMacro("__LZCNT__");
2697
Benjamin Kramer84f30802012-07-07 09:39:18 +00002698 if (HasRDRND)
2699 Builder.defineMacro("__RDRND__");
2700
Craig Topper31ceea02011-12-25 05:06:45 +00002701 if (HasBMI)
2702 Builder.defineMacro("__BMI__");
2703
2704 if (HasBMI2)
2705 Builder.defineMacro("__BMI2__");
2706
Craig Toppere14e08b2011-12-29 16:10:46 +00002707 if (HasPOPCNT)
2708 Builder.defineMacro("__POPCNT__");
2709
Michael Liao463eb892012-11-10 05:17:46 +00002710 if (HasRTM)
2711 Builder.defineMacro("__RTM__");
2712
Michael Liao72339a02013-03-26 17:52:08 +00002713 if (HasPRFCHW)
2714 Builder.defineMacro("__PRFCHW__");
2715
Michael Liao1bfc28c2013-03-29 05:17:55 +00002716 if (HasRDSEED)
2717 Builder.defineMacro("__RDSEED__");
2718
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002719 if (HasTBM)
2720 Builder.defineMacro("__TBM__");
2721
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002722 switch (XOPLevel) {
2723 case XOP:
2724 Builder.defineMacro("__XOP__");
2725 case FMA4:
Craig Topper6a511e12011-12-30 07:33:42 +00002726 Builder.defineMacro("__FMA4__");
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002727 case SSE4A:
2728 Builder.defineMacro("__SSE4A__");
2729 case NoXOP:
2730 break;
2731 }
Craig Topper6a511e12011-12-30 07:33:42 +00002732
Craig Topper2ae95072012-06-03 21:46:30 +00002733 if (HasFMA)
2734 Builder.defineMacro("__FMA__");
2735
Manman Ren146e5a42012-10-11 00:59:55 +00002736 if (HasF16C)
2737 Builder.defineMacro("__F16C__");
2738
Craig Topperbca2c4f2013-08-21 05:29:10 +00002739 if (HasAVX512CD)
2740 Builder.defineMacro("__AVX512CD__");
2741 if (HasAVX512ER)
2742 Builder.defineMacro("__AVX512ER__");
2743 if (HasAVX512PF)
2744 Builder.defineMacro("__AVX512PF__");
2745
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002746 if (HasSHA)
2747 Builder.defineMacro("__SHA__");
2748
Nick Lewyckyaf945462013-10-05 20:14:27 +00002749 if (HasCX16)
2750 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2751
Chris Lattner84f0ea82009-03-02 22:40:39 +00002752 // Each case falls through to the previous one here.
2753 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002754 case AVX512F:
Craig Topper42f98732013-08-20 07:39:54 +00002755 Builder.defineMacro("__AVX512F__");
Craig Topper05fe4b52012-01-09 09:19:09 +00002756 case AVX2:
2757 Builder.defineMacro("__AVX2__");
2758 case AVX:
2759 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002760 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00002761 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002762 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002763 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002764 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002765 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002766 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002767 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002768 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002769 Builder.defineMacro("__SSE2__");
2770 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002771 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002772 Builder.defineMacro("__SSE__");
2773 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002774 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002775 break;
2776 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002777
Derek Schuffbabaf312012-10-11 15:52:22 +00002778 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002779 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002780 case AVX512F:
Craig Topper05fe4b52012-01-09 09:19:09 +00002781 case AVX2:
2782 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002783 case SSE42:
2784 case SSE41:
2785 case SSSE3:
2786 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002787 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002788 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002789 break;
2790 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002791 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002792 break;
2793 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002794 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002795 }
2796 }
2797
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002798 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002799 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002800 case AMD3DNowAthlon:
2801 Builder.defineMacro("__3dNOW_A__");
2802 case AMD3DNow:
2803 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002804 case MMX:
2805 Builder.defineMacro("__MMX__");
2806 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002807 break;
2808 }
Michael J. Spencerd1b33942013-04-04 23:53:43 +00002809
2810 if (CPU >= CK_i486) {
2811 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2812 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2813 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2814 }
2815 if (CPU >= CK_i586)
2816 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerc0f59212009-03-02 22:27:17 +00002817}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002818
Douglas Gregore727d212012-01-30 06:38:25 +00002819bool X86TargetInfo::hasFeature(StringRef Feature) const {
2820 return llvm::StringSwitch<bool>(Feature)
2821 .Case("aes", HasAES)
2822 .Case("avx", SSELevel >= AVX)
2823 .Case("avx2", SSELevel >= AVX2)
Craig Topperb7a95d22013-08-21 03:59:22 +00002824 .Case("avx512f", SSELevel >= AVX512F)
Craig Topperbca2c4f2013-08-21 05:29:10 +00002825 .Case("avx512cd", HasAVX512CD)
2826 .Case("avx512er", HasAVX512ER)
2827 .Case("avx512pf", HasAVX512PF)
Douglas Gregore727d212012-01-30 06:38:25 +00002828 .Case("bmi", HasBMI)
2829 .Case("bmi2", HasBMI2)
Nick Lewyckyaf945462013-10-05 20:14:27 +00002830 .Case("cx16", HasCX16)
2831 .Case("f16c", HasF16C)
Craig Topper2ae95072012-06-03 21:46:30 +00002832 .Case("fma", HasFMA)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002833 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002834 .Case("tbm", HasTBM)
Douglas Gregore727d212012-01-30 06:38:25 +00002835 .Case("lzcnt", HasLZCNT)
Benjamin Kramer84f30802012-07-07 09:39:18 +00002836 .Case("rdrnd", HasRDRND)
Douglas Gregore727d212012-01-30 06:38:25 +00002837 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2838 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2839 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00002840 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00002841 .Case("popcnt", HasPOPCNT)
Michael Liao463eb892012-11-10 05:17:46 +00002842 .Case("rtm", HasRTM)
Michael Liao72339a02013-03-26 17:52:08 +00002843 .Case("prfchw", HasPRFCHW)
Michael Liao1bfc28c2013-03-29 05:17:55 +00002844 .Case("rdseed", HasRDSEED)
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002845 .Case("sha", HasSHA)
Douglas Gregore727d212012-01-30 06:38:25 +00002846 .Case("sse", SSELevel >= SSE1)
2847 .Case("sse2", SSELevel >= SSE2)
2848 .Case("sse3", SSELevel >= SSE3)
2849 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002850 .Case("sse4.1", SSELevel >= SSE41)
2851 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002852 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregore727d212012-01-30 06:38:25 +00002853 .Case("x86", true)
Derek Schuffbabaf312012-10-11 15:52:22 +00002854 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2855 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002856 .Case("xop", XOPLevel >= XOP)
Douglas Gregore727d212012-01-30 06:38:25 +00002857 .Default(false);
2858}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002859
Eli Friedman618234a2008-08-20 02:34:37 +00002860bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002861X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002862 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002863 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002864 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002865 case 'Y': // first letter of a pair:
2866 switch (*(Name+1)) {
2867 default: return false;
2868 case '0': // First SSE register.
2869 case 't': // Any SSE register, when SSE2 is enabled.
2870 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2871 case 'm': // any MMX register, when inter-unit moves enabled.
2872 break; // falls through to setAllowsRegister.
2873 }
Eli Friedman618234a2008-08-20 02:34:37 +00002874 case 'a': // eax.
2875 case 'b': // ebx.
2876 case 'c': // ecx.
2877 case 'd': // edx.
2878 case 'S': // esi.
2879 case 'D': // edi.
2880 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002881 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002882 case 't': // top of floating point stack.
2883 case 'u': // second from top of floating point stack.
2884 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002885 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002886 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002887 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002888 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2889 case 'l': // "Index" registers: any general register that can be used as an
2890 // index in a base+index memory access.
2891 Info.setAllowsRegister();
2892 return true;
2893 case 'C': // SSE floating point constant.
2894 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002895 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002896 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002897 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002898 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002899 return true;
2900 }
2901}
2902
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002903
Eli Friedman618234a2008-08-20 02:34:37 +00002904std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002905X86TargetInfo::convertConstraint(const char *&Constraint) const {
2906 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002907 case 'a': return std::string("{ax}");
2908 case 'b': return std::string("{bx}");
2909 case 'c': return std::string("{cx}");
2910 case 'd': return std::string("{dx}");
2911 case 'S': return std::string("{si}");
2912 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002913 case 'p': // address
2914 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002915 case 't': // top of floating point stack.
2916 return std::string("{st}");
2917 case 'u': // second from top of floating point stack.
2918 return std::string("{st(1)}"); // second from top of floating point stack.
2919 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002920 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002921 }
2922}
Eli Friedman618234a2008-08-20 02:34:37 +00002923} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002924
2925namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002926// X86-32 generic target
2927class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002928public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002929 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002930 DoubleAlign = LongLongAlign = 32;
2931 LongDoubleWidth = 96;
2932 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002933 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002934 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2935 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002936 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002937 SizeType = UnsignedInt;
2938 PtrDiffType = SignedInt;
2939 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002940 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002941
2942 // Use fpret for all types.
2943 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2944 (1 << TargetInfo::Double) |
2945 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002946
2947 // x86-32 has atomics up to 8 bytes
2948 // FIXME: Check that we actually have cmpxchg8b before setting
2949 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2950 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002951 }
Meador Ingec5613b22012-06-16 03:34:49 +00002952 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2953 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman618234a2008-08-20 02:34:37 +00002954 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002955
Chris Lattner21fb98e2009-09-23 06:06:36 +00002956 int getEHDataRegisterNumber(unsigned RegNo) const {
2957 if (RegNo == 0) return 0;
2958 if (RegNo == 1) return 2;
2959 return -1;
2960 }
Bill Wendling68fd6082012-11-12 06:42:51 +00002961 virtual bool validateInputSize(StringRef Constraint,
2962 unsigned Size) const {
2963 switch (Constraint[0]) {
2964 default: break;
2965 case 'a':
2966 case 'b':
2967 case 'c':
2968 case 'd':
Bill Wendlingf634bdf2012-11-12 18:52:32 +00002969 return Size <= 32;
Bill Wendling68fd6082012-11-12 06:42:51 +00002970 }
2971
2972 return true;
2973 }
Eli Friedman618234a2008-08-20 02:34:37 +00002974};
2975} // end anonymous namespace
2976
2977namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002978class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2979public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002980 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2981 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002982
2983 virtual unsigned getFloatEvalMethod() const {
2984 // NetBSD defaults to "double" rounding
2985 return 1;
2986 }
2987};
2988} // end anonymous namespace
2989
2990namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002991class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2992public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002993 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
2994 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman624c1462009-07-05 18:47:56 +00002995 SizeType = UnsignedLong;
2996 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002997 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002998 }
2999};
3000} // end anonymous namespace
3001
3002namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003003class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3004public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003005 BitrigI386TargetInfo(const llvm::Triple &Triple)
3006 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman42f74f22012-08-08 23:57:20 +00003007 SizeType = UnsignedLong;
3008 IntPtrType = SignedLong;
3009 PtrDiffType = SignedLong;
3010 }
3011};
3012} // end anonymous namespace
3013
3014namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00003015class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00003016public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003017 DarwinI386TargetInfo(const llvm::Triple &Triple)
3018 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00003019 LongDoubleWidth = 128;
3020 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003021 SuitableAlign = 128;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003022 MaxVectorAlign = 256;
Eli Friedman1afabd92009-03-29 20:31:09 +00003023 SizeType = UnsignedLong;
3024 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00003025 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3026 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003027 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00003028 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00003029 }
3030
Eli Friedman618234a2008-08-20 02:34:37 +00003031};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00003032} // end anonymous namespace
3033
3034namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00003035// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003036class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00003037public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003038 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3039 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00003040 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00003041 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00003042 DoubleAlign = LongLongAlign = 64;
3043 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Anton Korobeynikovb3814412009-12-19 02:05:07 +00003044 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003045 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00003046 }
Michael J. Spencera764e832010-10-21 08:22:51 +00003047 virtual void getTargetDefines(const LangOptions &Opts,
3048 MacroBuilder &Builder) const {
3049 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3050 }
3051};
3052} // end anonymous namespace
3053
3054namespace {
3055
3056// x86-32 Windows Visual Studio target
3057class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
3058public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003059 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple)
3060 : WindowsX86_32TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003061 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00003062 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3063 }
3064 virtual void getTargetDefines(const LangOptions &Opts,
3065 MacroBuilder &Builder) const {
3066 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3067 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3068 // The value of the following reflects processor type.
3069 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3070 // We lost the original triple, so we use the default.
3071 Builder.defineMacro("_M_IX86", "600");
3072 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003073};
3074} // end anonymous namespace
3075
3076namespace {
3077// x86-32 MinGW target
3078class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3079public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003080 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3081 : WindowsX86_32TargetInfo(Triple) {}
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003082 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003083 MacroBuilder &Builder) const {
3084 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00003085 DefineStd(Builder, "WIN32", Opts);
3086 DefineStd(Builder, "WINNT", Opts);
3087 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00003088 Builder.defineMacro("__MSVCRT__");
3089 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003090
3091 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3092 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00003093 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003094 // Provide "as-is" __declspec.
3095 Builder.defineMacro("__declspec", "__declspec");
3096 else
3097 // Provide alias of __attribute__ like mingw32-gcc.
3098 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003099 }
3100};
3101} // end anonymous namespace
3102
3103namespace {
3104// x86-32 Cygwin target
3105class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3106public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003107 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3108 : X86_32TargetInfo(Triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003109 TLSSupported = false;
3110 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003111 DoubleAlign = LongLongAlign = 64;
3112 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3113 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003114 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003115 }
3116 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003117 MacroBuilder &Builder) const {
3118 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumie72f4d92012-12-14 10:17:26 +00003119 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00003120 Builder.defineMacro("__CYGWIN__");
3121 Builder.defineMacro("__CYGWIN32__");
3122 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00003123 if (Opts.CPlusPlus)
3124 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00003125 }
Eli Friedman29a30502008-08-21 01:40:19 +00003126};
3127} // end anonymous namespace
3128
3129namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00003130// x86-32 Haiku target
3131class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3132public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003133 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattner86ed3a32010-04-11 19:29:39 +00003134 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00003135 IntPtrType = SignedLong;
3136 PtrDiffType = SignedLong;
Eli Friedman6902e412012-11-27 02:58:24 +00003137 ProcessIDType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00003138 this->UserLabelPrefix = "";
Benjamin Krameref7bcea2012-11-08 12:59:15 +00003139 this->TLSSupported = false;
Eli Friedmana7e68452010-08-22 01:00:03 +00003140 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00003141 virtual void getTargetDefines(const LangOptions &Opts,
3142 MacroBuilder &Builder) const {
3143 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3144 Builder.defineMacro("__INTEL__");
3145 Builder.defineMacro("__HAIKU__");
3146 }
3147};
3148} // end anonymous namespace
3149
Douglas Gregordca52262011-07-01 22:41:14 +00003150// RTEMS Target
3151template<typename Target>
3152class RTEMSTargetInfo : public OSTargetInfo<Target> {
3153protected:
3154 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3155 MacroBuilder &Builder) const {
3156 // RTEMS defines; list based off of gcc output
3157
Douglas Gregordca52262011-07-01 22:41:14 +00003158 Builder.defineMacro("__rtems__");
3159 Builder.defineMacro("__ELF__");
3160 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003161
Douglas Gregordca52262011-07-01 22:41:14 +00003162public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003163 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3164 this->UserLabelPrefix = "";
Douglas Gregordca52262011-07-01 22:41:14 +00003165
Benjamin Kramer9df08232013-06-29 16:37:14 +00003166 switch (Triple.getArch()) {
3167 default:
3168 case llvm::Triple::x86:
3169 // this->MCountName = ".mcount";
3170 break;
3171 case llvm::Triple::mips:
3172 case llvm::Triple::mipsel:
3173 case llvm::Triple::ppc:
3174 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003175 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003176 // this->MCountName = "_mcount";
3177 break;
3178 case llvm::Triple::arm:
3179 // this->MCountName = "__mcount";
3180 break;
Douglas Gregordca52262011-07-01 22:41:14 +00003181 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003182 }
Douglas Gregordca52262011-07-01 22:41:14 +00003183};
3184
3185namespace {
3186// x86-32 RTEMS target
3187class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3188public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003189 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregordca52262011-07-01 22:41:14 +00003190 SizeType = UnsignedLong;
3191 IntPtrType = SignedLong;
3192 PtrDiffType = SignedLong;
3193 this->UserLabelPrefix = "";
3194 }
3195 virtual void getTargetDefines(const LangOptions &Opts,
3196 MacroBuilder &Builder) const {
3197 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3198 Builder.defineMacro("__INTEL__");
3199 Builder.defineMacro("__rtems__");
3200 }
3201};
3202} // end anonymous namespace
3203
Chris Lattner86ed3a32010-04-11 19:29:39 +00003204namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00003205// x86-64 generic target
3206class X86_64TargetInfo : public X86TargetInfo {
3207public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003208 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00003209 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00003210 LongDoubleWidth = 128;
3211 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00003212 LargeArrayMinWidth = 128;
3213 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003214 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00003215 IntMaxType = SignedLong;
3216 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003217 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00003218 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00003219
Eli Friedmaned855cb2008-08-21 00:13:15 +00003220 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3221 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003222 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00003223
3224 // Use fpret only for long double.
3225 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00003226
Anders Carlssoneea64802011-10-31 16:27:11 +00003227 // Use fp2ret for _Complex long double.
3228 ComplexLongDoubleUsesFP2Ret = true;
3229
Eli Friedman2be46072011-10-14 20:59:01 +00003230 // x86-64 has atomics up to 16 bytes.
3231 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3232 // on CPUs with cmpxchg16b
3233 MaxAtomicPromoteWidth = 128;
3234 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00003235 }
Meador Ingec5613b22012-06-16 03:34:49 +00003236 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3237 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson3346ae62007-11-24 23:38:12 +00003238 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00003239
Chris Lattner21fb98e2009-09-23 06:06:36 +00003240 int getEHDataRegisterNumber(unsigned RegNo) const {
3241 if (RegNo == 0) return 0;
3242 if (RegNo == 1) return 1;
3243 return -1;
3244 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003245
3246 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Charles Davise8519c32013-08-30 04:39:01 +00003247 return (CC == CC_C ||
3248 CC == CC_IntelOclBicc ||
3249 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003250 }
3251
Aaron Ballmanfff32482012-12-09 17:45:41 +00003252 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3253 return CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003254 }
3255
Eli Friedman618234a2008-08-20 02:34:37 +00003256};
3257} // end anonymous namespace
3258
3259namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003260// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003261class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003262public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003263 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3264 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003265 TLSSupported = false;
3266 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00003267 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00003268 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00003269 IntMaxType = SignedLongLong;
3270 UIntMaxType = UnsignedLongLong;
3271 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00003272 SizeType = UnsignedLongLong;
3273 PtrDiffType = SignedLongLong;
3274 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00003275 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003276 }
3277 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003278 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003279 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003280 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00003281 }
Meador Ingec5613b22012-06-16 03:34:49 +00003282 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3283 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumi79521992011-01-17 22:56:23 +00003284 }
Charles Davise8519c32013-08-30 04:39:01 +00003285 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3286 return (CC == CC_C ||
3287 CC == CC_IntelOclBicc ||
3288 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3289 }
Michael J. Spencera764e832010-10-21 08:22:51 +00003290};
3291} // end anonymous namespace
3292
3293namespace {
3294// x86-64 Windows Visual Studio target
3295class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3296public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003297 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3298 : WindowsX86_64TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003299 LongDoubleWidth = LongDoubleAlign = 64;
3300 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00003301 }
3302 virtual void getTargetDefines(const LangOptions &Opts,
3303 MacroBuilder &Builder) const {
3304 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3305 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00003306 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003307 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003308 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003309};
3310} // end anonymous namespace
3311
3312namespace {
3313// x86-64 MinGW target
3314class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3315public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003316 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3317 : WindowsX86_64TargetInfo(Triple) {}
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003318 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003319 MacroBuilder &Builder) const {
3320 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00003321 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00003322 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00003323 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00003324 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003325
3326 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3327 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00003328 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003329 // Provide "as-is" __declspec.
3330 Builder.defineMacro("__declspec", "__declspec");
3331 else
3332 // Provide alias of __attribute__ like mingw32-gcc.
3333 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003334 }
3335};
3336} // end anonymous namespace
3337
3338namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003339class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3340public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003341 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3342 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003343 Int64Type = SignedLongLong;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003344 MaxVectorAlign = 256;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003345 }
3346};
3347} // end anonymous namespace
3348
3349namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00003350class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3351public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003352 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3353 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman6036ebe2009-07-05 22:31:18 +00003354 IntMaxType = SignedLongLong;
3355 UIntMaxType = UnsignedLongLong;
3356 Int64Type = SignedLongLong;
3357 }
3358};
3359} // end anonymous namespace
3360
3361namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003362class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3363public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003364 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3365 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3366 IntMaxType = SignedLongLong;
3367 UIntMaxType = UnsignedLongLong;
3368 Int64Type = SignedLongLong;
Eli Friedman42f74f22012-08-08 23:57:20 +00003369 }
3370};
Tim Northoverc264e162013-01-31 12:13:10 +00003371}
3372
3373namespace {
3374class AArch64TargetInfo : public TargetInfo {
3375 static const char * const GCCRegNames[];
3376 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northoverff920ee2013-05-04 07:15:13 +00003377
Tim Northoverb793f0d2013-08-01 09:23:19 +00003378 enum FPUModeEnum {
3379 FPUMode,
3380 NeonMode
3381 };
3382
3383 unsigned FPU;
Tim Northoverff920ee2013-05-04 07:15:13 +00003384 static const Builtin::Info BuiltinInfo[];
Tim Northoverb793f0d2013-08-01 09:23:19 +00003385
Tim Northoverc264e162013-01-31 12:13:10 +00003386public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003387 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northoverc264e162013-01-31 12:13:10 +00003388 BigEndian = false;
3389 LongWidth = LongAlign = 64;
3390 LongDoubleWidth = LongDoubleAlign = 128;
3391 PointerWidth = PointerAlign = 64;
3392 SuitableAlign = 128;
3393 DescriptionString = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3394 "i64:64:64-i128:128:128-f32:32:32-f64:64:64-"
3395 "f128:128:128-n32:64-S128";
3396
3397 WCharType = UnsignedInt;
3398 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3399
Tim Northover6a93c862013-02-18 12:11:32 +00003400 // AArch64 backend supports 64-bit operations at the moment. In principle
3401 // 128-bit is possible if register-pairs are used.
3402 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3403
Tim Northoverc264e162013-01-31 12:13:10 +00003404 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3405 }
3406 virtual void getTargetDefines(const LangOptions &Opts,
3407 MacroBuilder &Builder) const {
3408 // GCC defines theses currently
3409 Builder.defineMacro("__aarch64__");
3410 Builder.defineMacro("__AARCH64EL__");
3411
3412 // ACLE predefines. Many can only have one possible value on v8 AArch64.
3413
3414 // FIXME: these were written based on an unreleased version of a 32-bit ACLE
3415 // which was intended to be compatible with a 64-bit implementation. They
3416 // will need updating when a real 64-bit ACLE exists. Particularly pressing
Tim Northoverdabcbf92013-04-05 14:08:55 +00003417 // instances are: __ARM_ARCH_ISA_ARM, __ARM_ARCH_ISA_THUMB, __ARM_PCS.
3418 Builder.defineMacro("__ARM_ACLE", "101");
3419 Builder.defineMacro("__ARM_ARCH", "8");
3420 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northoverc264e162013-01-31 12:13:10 +00003421
Tim Northoverdabcbf92013-04-05 14:08:55 +00003422 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3423 Builder.defineMacro("__ARM_FEATURE_CLZ");
3424 Builder.defineMacro("__ARM_FEATURE_FMA");
Tim Northoverc264e162013-01-31 12:13:10 +00003425
3426 // FIXME: ACLE 1.1 reserves bit 4. Will almost certainly come to mean
3427 // 128-bit LDXP present, at which point this becomes 0x1f.
Tim Northoverdabcbf92013-04-05 14:08:55 +00003428 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xf");
Tim Northoverc264e162013-01-31 12:13:10 +00003429
3430 // 0xe implies support for half, single and double precision operations.
Tim Northoverdabcbf92013-04-05 14:08:55 +00003431 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northoverc264e162013-01-31 12:13:10 +00003432
3433 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverdabcbf92013-04-05 14:08:55 +00003434 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3435 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northoverc264e162013-01-31 12:13:10 +00003436
3437 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverdabcbf92013-04-05 14:08:55 +00003438 Builder.defineMacro("__ARM_FP_FAST");
Tim Northoverc264e162013-01-31 12:13:10 +00003439
3440 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverdabcbf92013-04-05 14:08:55 +00003441 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northoverc264e162013-01-31 12:13:10 +00003442
Tim Northoverdabcbf92013-04-05 14:08:55 +00003443 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northoverc264e162013-01-31 12:13:10 +00003444 Opts.ShortWChar ? "2" : "4");
3445
Tim Northoverdabcbf92013-04-05 14:08:55 +00003446 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northoverc264e162013-01-31 12:13:10 +00003447 Opts.ShortEnums ? "1" : "4");
3448
3449 if (BigEndian)
Tim Northoverb793f0d2013-08-01 09:23:19 +00003450 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3451
3452 if (FPU == NeonMode) {
3453 Builder.defineMacro("__AARCH_FEATURE_ADVSIMD");
3454
3455 // 64-bit NEON supports half, single and double precision operations.
3456 Builder.defineMacro("__AARCH_ADVSIMD_FP", "0xe");
3457 }
Tim Northoverc264e162013-01-31 12:13:10 +00003458 }
3459 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3460 unsigned &NumRecords) const {
Tim Northoverff920ee2013-05-04 07:15:13 +00003461 Records = BuiltinInfo;
3462 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northoverc264e162013-01-31 12:13:10 +00003463 }
3464 virtual bool hasFeature(StringRef Feature) const {
Tim Northoverb793f0d2013-08-01 09:23:19 +00003465 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northoverc264e162013-01-31 12:13:10 +00003466 }
Tim Northoverb793f0d2013-08-01 09:23:19 +00003467
Eric Christopher3d11ced2013-10-16 21:26:26 +00003468 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindola5389b842013-08-21 21:59:03 +00003469 DiagnosticsEngine &Diags) {
Tim Northoverb793f0d2013-08-01 09:23:19 +00003470 FPU = FPUMode;
3471 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3472 if (Features[i] == "+neon")
3473 FPU = NeonMode;
3474 }
Rafael Espindola5389b842013-08-21 21:59:03 +00003475 return true;
Tim Northoverb793f0d2013-08-01 09:23:19 +00003476 }
3477
3478 virtual void getGCCRegNames(const char *const *&Names,
Tim Northoverc264e162013-01-31 12:13:10 +00003479 unsigned &NumNames) const;
3480 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3481 unsigned &NumAliases) const;
3482
3483 virtual bool isCLZForZeroUndef() const { return false; }
3484
3485 virtual bool validateAsmConstraint(const char *&Name,
3486 TargetInfo::ConstraintInfo &Info) const {
3487 switch (*Name) {
3488 default: return false;
3489 case 'w': // An FP/SIMD vector register
3490 Info.setAllowsRegister();
3491 return true;
3492 case 'I': // Constant that can be used with an ADD instruction
3493 case 'J': // Constant that can be used with a SUB instruction
3494 case 'K': // Constant that can be used with a 32-bit logical instruction
3495 case 'L': // Constant that can be used with a 64-bit logical instruction
3496 case 'M': // Constant that can be used as a 32-bit MOV immediate
3497 case 'N': // Constant that can be used as a 64-bit MOV immediate
3498 case 'Y': // Floating point constant zero
3499 case 'Z': // Integer constant zero
3500 return true;
3501 case 'Q': // A memory reference with base register and no offset
3502 Info.setAllowsMemory();
3503 return true;
3504 case 'S': // A symbolic address
3505 Info.setAllowsRegister();
3506 return true;
3507 case 'U':
3508 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3509 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3510 // Usa: An absolute symbolic address
3511 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3512 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3513 }
3514 }
3515
3516 virtual const char *getClobbers() const {
3517 // There are no AArch64 clobbers shared by all asm statements.
3518 return "";
3519 }
3520
3521 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3522 return TargetInfo::AArch64ABIBuiltinVaList;
3523 }
3524};
3525
3526const char * const AArch64TargetInfo::GCCRegNames[] = {
3527 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3528 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3529 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3530 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3531
3532 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3533 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3534 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3535 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3536
3537 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3538 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3539 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3540 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3541
3542 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3543 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3544 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3545 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3546
3547 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3548 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3549 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3550 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3551
3552 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3553 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3554 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3555 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3556
3557 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3558 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3559 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3560 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3561};
3562
3563void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3564 unsigned &NumNames) const {
3565 Names = GCCRegNames;
3566 NumNames = llvm::array_lengthof(GCCRegNames);
3567}
3568
3569const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3570 { { "x16" }, "ip0"},
3571 { { "x17" }, "ip1"},
3572 { { "x29" }, "fp" },
3573 { { "x30" }, "lr" }
3574};
3575
3576void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3577 unsigned &NumAliases) const {
3578 Aliases = GCCRegAliases;
3579 NumAliases = llvm::array_lengthof(GCCRegAliases);
3580
3581}
Tim Northoverff920ee2013-05-04 07:15:13 +00003582
3583const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3584#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3585#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3586 ALL_LANGUAGES },
3587#include "clang/Basic/BuiltinsAArch64.def"
3588};
3589
Eli Friedman42f74f22012-08-08 23:57:20 +00003590} // end anonymous namespace
3591
3592namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00003593class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003594 // Possible FPU choices.
3595 enum FPUMode {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003596 VFP2FPU = (1 << 0),
3597 VFP3FPU = (1 << 1),
3598 VFP4FPU = (1 << 2),
3599 NeonFPU = (1 << 3)
Daniel Dunbara91320b2009-12-21 23:28:17 +00003600 };
3601
Silviu Baranga1db2e272013-10-21 10:54:53 +00003602 // Possible HWDiv features.
3603 enum HWDivMode {
3604 HWDivThumb = (1 << 0),
3605 HWDivARM = (1 << 1)
3606 };
3607
Daniel Dunbara91320b2009-12-21 23:28:17 +00003608 static bool FPUModeIsVFP(FPUMode Mode) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003609 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU);
Daniel Dunbara91320b2009-12-21 23:28:17 +00003610 }
3611
3612 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3613 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003614
Daniel Dunbareac7c532009-12-18 18:42:37 +00003615 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003616
Rafael Espindola5389b842013-08-21 21:59:03 +00003617 enum {
3618 FP_Default,
3619 FP_VFP,
3620 FP_Neon
3621 } FPMath;
3622
Bob Wilsoncfaab002012-09-29 23:52:52 +00003623 unsigned FPU : 4;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003624
Logan Chieneae5a8202012-10-10 06:56:20 +00003625 unsigned IsAAPCS : 1;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003626 unsigned IsThumb : 1;
Silviu Baranga1db2e272013-10-21 10:54:53 +00003627 unsigned HWDiv : 2;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003628
3629 // Initialized via features.
3630 unsigned SoftFloat : 1;
3631 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003632
Chris Lattner2752c012010-03-03 19:03:45 +00003633 static const Builtin::Info BuiltinInfo[];
3634
Rafael Espindola620c0af2013-05-13 20:09:47 +00003635 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3636 // On linux, binaries targeting old cpus call functions in libgcc to
3637 // perform atomic operations. The implementation in libgcc then calls into
3638 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3639 // is that if we assume the kernel is at least as recent as the hardware,
3640 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003641 if (!T.isOSLinux() &&
Rafael Espindolae1e03422013-06-17 20:00:15 +00003642 T.getOS() != llvm::Triple::FreeBSD &&
3643 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten04491632013-06-15 09:40:14 +00003644 return false;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003645 StringRef ArchName = T.getArchName();
Rafael Espindola69db5552013-05-14 00:44:24 +00003646 if (T.getArch() == llvm::Triple::arm) {
3647 if (!ArchName.startswith("armv"))
3648 return false;
3649 StringRef VersionStr = ArchName.substr(4);
3650 unsigned Version;
3651 if (VersionStr.getAsInteger(10, Version))
3652 return false;
3653 return Version >= 6;
3654 }
3655 assert(T.getArch() == llvm::Triple::thumb);
3656 if (!ArchName.startswith("thumbv"))
3657 return false;
3658 StringRef VersionStr = ArchName.substr(6);
3659 unsigned Version;
3660 if (VersionStr.getAsInteger(10, Version))
3661 return false;
3662 return Version >= 7;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003663 }
3664
Chris Lattner393ff042008-04-21 18:56:49 +00003665public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003666 ARMTargetInfo(const llvm::Triple &Triple)
3667 : TargetInfo(Triple), ABI("aapcs-linux"), CPU("arm1136j-s"),
Rafael Espindola5389b842013-08-21 21:59:03 +00003668 FPMath(FP_Default), IsAAPCS(true) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003669 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003670 SizeType = UnsignedInt;
3671 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00003672 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3673 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003674
Chris Lattner9bffb072010-04-23 16:29:58 +00003675 // {} in inline assembly are neon specifiers, not assembly variant
3676 // specifiers.
3677 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00003678
Daniel Dunbareac7c532009-12-18 18:42:37 +00003679 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00003680 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003681 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003682 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3683 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003684 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
3685 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003686 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003687 } else {
3688 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3689 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003690 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003691 }
John McCallee79a4c2010-08-21 22:46:04 +00003692
3693 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00003694 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00003695
3696 // ARM has atomics up to 8 bytes
Eli Friedman2be46072011-10-14 20:59:01 +00003697 MaxAtomicPromoteWidth = 64;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003698 if (shouldUseInlineAtomic(getTriple()))
3699 MaxAtomicInlineWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00003700
3701 // Do force alignment of members that follow zero length bitfields. If
3702 // the alignment of the zero-length bitfield is greater than the member
3703 // that follows it, `bar', `bar' will be aligned as the type of the
3704 // zero length bitfield.
3705 UseZeroLengthBitfieldAlignment = true;
Eli Friedman61538a72008-05-20 14:21:01 +00003706 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003707 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00003708 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003709 ABI = Name;
3710
Daniel Dunbara2a41612009-09-14 00:02:24 +00003711 // The defaults (above) are for AAPCS, check if we need to change them.
3712 //
3713 // FIXME: We need support for -meabi... we could just mangle it into the
3714 // name.
3715 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003716 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindola27fa2362012-12-13 04:17:14 +00003717 // size_t is unsigned int on FreeBSD.
3718 if (getTriple().getOS() != llvm::Triple::FreeBSD)
3719 SizeType = UnsignedLong;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003720
James Molloya6d81f92011-11-23 13:35:08 +00003721 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3722 WCharType = SignedInt;
3723
Daniel Dunbar684de632010-04-22 16:14:54 +00003724 // Do not respect the alignment of bit-field types when laying out
3725 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3726 UseBitFieldTypeAlignment = false;
3727
Chad Rosier61a62212011-08-04 01:21:14 +00003728 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00003729 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3730 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00003731 ZeroLengthBitfieldBoundary = 32;
3732
Logan Chieneae5a8202012-10-10 06:56:20 +00003733 IsAAPCS = false;
3734
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003735 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003736 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3737 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003738 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
Bob Wilson949fd1a2011-06-29 16:09:20 +00003739 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003740 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003741 } else {
3742 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00003743 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003744 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003745 }
3746
Chad Rosier9f1210c2011-07-26 07:03:04 +00003747 // FIXME: Override "preferred align" for double and long long.
David Tweedb16abb12012-10-25 13:33:01 +00003748 } else if (Name == "aapcs" || Name == "aapcs-vfp") {
Bob Wilsone4bce7a2013-06-18 05:36:04 +00003749 // size_t is unsigned long on Darwin.
3750 if (getTriple().isOSDarwin())
3751 SizeType = UnsignedLong;
Logan Chieneae5a8202012-10-10 06:56:20 +00003752 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003753 // FIXME: Enumerated types are variable width in straight AAPCS.
3754 } else if (Name == "aapcs-linux") {
Logan Chieneae5a8202012-10-10 06:56:20 +00003755 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003756 } else
3757 return false;
3758
3759 return true;
3760 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003761
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003762 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003763 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3764 Features["vfp2"] = true;
Renato Golin1302f9f2013-09-13 17:02:45 +00003765 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3766 CPU == "cortex-a9-mp") {
3767 Features["vfp3"] = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003768 Features["neon"] = true;
Renato Golin1302f9f2013-09-13 17:02:45 +00003769 } else if (CPU == "swift" || CPU == "cortex-a5" ||
3770 CPU == "cortex-a7" || CPU == "cortex-a15") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003771 Features["vfp4"] = true;
3772 Features["neon"] = true;
3773 }
Daniel Dunbara91320b2009-12-21 23:28:17 +00003774 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00003775
Eric Christopher3d11ced2013-10-16 21:26:26 +00003776 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindola5389b842013-08-21 21:59:03 +00003777 DiagnosticsEngine &Diags) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003778 FPU = 0;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003779 SoftFloat = SoftFloatABI = false;
Silviu Baranga1db2e272013-10-21 10:54:53 +00003780 HWDiv = 0;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003781 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3782 if (Features[i] == "+soft-float")
3783 SoftFloat = true;
3784 else if (Features[i] == "+soft-float-abi")
3785 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003786 else if (Features[i] == "+vfp2")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003787 FPU |= VFP2FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003788 else if (Features[i] == "+vfp3")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003789 FPU |= VFP3FPU;
3790 else if (Features[i] == "+vfp4")
3791 FPU |= VFP4FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003792 else if (Features[i] == "+neon")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003793 FPU |= NeonFPU;
Silviu Baranga1db2e272013-10-21 10:54:53 +00003794 else if (Features[i] == "+hwdiv")
3795 HWDiv |= HWDivThumb;
3796 else if (Features[i] == "+hwdiv-arm")
3797 HWDiv |= HWDivARM;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003798 }
3799
Rafael Espindola5389b842013-08-21 21:59:03 +00003800 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3801 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3802 return false;
3803 }
3804
3805 if (FPMath == FP_Neon)
3806 Features.push_back("+neonfp");
3807 else if (FPMath == FP_VFP)
3808 Features.push_back("-neonfp");
3809
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003810 // Remove front-end specific options which the backend handles differently.
3811 std::vector<std::string>::iterator it;
3812 it = std::find(Features.begin(), Features.end(), "+soft-float");
3813 if (it != Features.end())
3814 Features.erase(it);
3815 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3816 if (it != Features.end())
3817 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00003818 return true;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003819 }
3820
Douglas Gregore727d212012-01-30 06:38:25 +00003821 virtual bool hasFeature(StringRef Feature) const {
3822 return llvm::StringSwitch<bool>(Feature)
3823 .Case("arm", true)
3824 .Case("softfloat", SoftFloat)
3825 .Case("thumb", IsThumb)
Amara Emerson2440fb12013-09-16 18:07:35 +00003826 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Baranga1db2e272013-10-21 10:54:53 +00003827 .Case("hwdiv", HWDiv & HWDivThumb)
3828 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregore727d212012-01-30 06:38:25 +00003829 .Default(false);
3830 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003831 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00003832 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00003833 return llvm::StringSwitch<const char*>(Name)
3834 .Cases("arm8", "arm810", "4")
3835 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3836 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3837 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3838 .Case("ep9312", "4T")
3839 .Cases("arm10tdmi", "arm1020t", "5T")
3840 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3841 .Case("arm926ej-s", "5TEJ")
3842 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3843 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003844 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003845 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003846 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003847 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonfc553452013-03-04 22:37:46 +00003848 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
Renato Golin5df40452013-09-13 17:02:54 +00003849 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "7A")
3850 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilson336bfa32012-09-29 23:52:50 +00003851 .Case("cortex-a9-mp", "7F")
3852 .Case("swift", "7S")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003853 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00003854 .Case("cortex-m0", "6M")
Joey Gouly4ec8d5b2013-06-26 17:19:48 +00003855 .Case("cortex-a53", "8A")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003856 .Default(0);
3857 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003858 static const char *getCPUProfile(StringRef Name) {
3859 return llvm::StringSwitch<const char*>(Name)
Renato Golin5df40452013-09-13 17:02:54 +00003860 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
3861 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "A")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003862 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin5df40452013-09-13 17:02:54 +00003863 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov8b0703d2012-09-08 08:22:13 +00003864 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003865 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003866 virtual bool setCPU(const std::string &Name) {
3867 if (!getCPUDefineSuffix(Name))
3868 return false;
3869
3870 CPU = Name;
3871 return true;
3872 }
Rafael Espindola5389b842013-08-21 21:59:03 +00003873 virtual bool setFPMath(StringRef Name);
Chris Lattner33328642009-03-20 15:52:06 +00003874 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003875 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00003876 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00003877 Builder.defineMacro("__arm");
3878 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003879
Chris Lattnerc0f59212009-03-02 22:27:17 +00003880 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00003881 Builder.defineMacro("__ARMEL__");
3882 Builder.defineMacro("__LITTLE_ENDIAN__");
3883 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003884
Chris Lattner5f9e2722011-07-23 10:55:15 +00003885 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00003886 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003887 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3888 StringRef CPUProfile = getCPUProfile(CPU);
3889 if (!CPUProfile.empty())
3890 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3891
Mike Stump437bb4b2009-04-08 02:07:04 +00003892 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003893
Daniel Dunbareac7c532009-12-18 18:42:37 +00003894 // FIXME: It's more complicated than this and we don't really support
3895 // interworking.
3896 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00003897 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003898
David Tweedb16abb12012-10-25 13:33:01 +00003899 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Daniel Dunbar849289e2012-10-22 18:51:13 +00003900 // M-class CPUs on Darwin follow AAPCS, but not EABI.
Daniel Dunbar4d3ee9b2012-10-22 18:56:43 +00003901 if (!(getTriple().isOSDarwin() && CPUProfile == "M"))
Daniel Dunbar849289e2012-10-22 18:51:13 +00003902 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003903 Builder.defineMacro("__ARM_PCS", "1");
3904
David Tweedb16abb12012-10-25 13:33:01 +00003905 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003906 Builder.defineMacro("__ARM_PCS_VFP", "1");
3907 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003908
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003909 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00003910 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003911
3912 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00003913 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003914
Bob Wilson84f95cf2011-05-13 18:56:03 +00003915 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003916 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003917 Builder.defineMacro("__THUMBEL__");
3918 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00003919 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003920 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003921 }
Silviu Baranga1db2e272013-10-21 10:54:53 +00003922 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
3923 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003924
3925 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00003926 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00003927
Bob Wilsoncfaab002012-09-29 23:52:52 +00003928 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003929 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00003930 if (FPU & VFP2FPU)
3931 Builder.defineMacro("__ARM_VFPV2__");
3932 if (FPU & VFP3FPU)
3933 Builder.defineMacro("__ARM_VFPV3__");
3934 if (FPU & VFP4FPU)
3935 Builder.defineMacro("__ARM_VFPV4__");
3936 }
3937
Daniel Dunbara91320b2009-12-21 23:28:17 +00003938 // This only gets set when Neon instructions are actually available, unlike
3939 // the VFP define, hence the soft float and arch check. This is subtly
3940 // different from gcc, we follow the intent which was that it should be set
3941 // when Neon instructions are actually available.
Bob Wilsoncfaab002012-09-29 23:52:52 +00003942 if ((FPU & NeonFPU) && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003943 Builder.defineMacro("__ARM_NEON__");
Joey Gouly520ec1e2013-09-18 10:07:09 +00003944
3945 if (CPUArch.startswith("8"))
3946 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao8712ded2013-09-30 22:51:32 +00003947
3948 if (CPUArch[0] >= '6' && CPUArch != "6M") {
3949 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3950 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3951 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3952 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
3953 }
Chris Lattner393ff042008-04-21 18:56:49 +00003954 }
3955 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3956 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00003957 Records = BuiltinInfo;
3958 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00003959 }
Bob Wilson8b30a932012-01-26 22:14:27 +00003960 virtual bool isCLZForZeroUndef() const { return false; }
Meador Ingec5613b22012-06-16 03:34:49 +00003961 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chieneae5a8202012-10-10 06:56:20 +00003962 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner393ff042008-04-21 18:56:49 +00003963 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003964 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003965 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003966 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003967 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003968 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00003969 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003970 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00003971 default: break;
Nate Begemanad487f42008-04-22 05:03:19 +00003972 case 'l': // r0-r7
3973 case 'h': // r8-r15
3974 case 'w': // VFP Floating point register single precision
3975 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00003976 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00003977 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00003978 case 'Q': // A memory address that is a single base register.
3979 Info.setAllowsMemory();
3980 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00003981 case 'U': // a memory reference...
3982 switch (Name[1]) {
3983 case 'q': // ...ARMV4 ldrsb
3984 case 'v': // ...VFP load/store (reg+constant offset)
3985 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00003986 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00003987 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00003988 case 'n': // valid address for Neon doubleword vector load/store
3989 case 'm': // valid address for Neon element and structure load/store
3990 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00003991 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00003992 Info.setAllowsMemory();
3993 Name++;
3994 return true;
3995 }
Nate Begemanad487f42008-04-22 05:03:19 +00003996 }
Chris Lattner393ff042008-04-21 18:56:49 +00003997 return false;
3998 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00003999 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00004000 std::string R;
4001 switch (*Constraint) {
4002 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00004003 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00004004 Constraint++;
4005 break;
Eric Christopher283f4472011-06-17 00:40:18 +00004006 case 'p': // 'p' should be translated to 'r' by default.
4007 R = std::string("r");
4008 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00004009 default:
4010 return std::string(1, *Constraint);
4011 }
4012 return R;
4013 }
Bill Wendling50d46ca2012-10-25 23:28:48 +00004014 virtual bool validateConstraintModifier(StringRef Constraint,
4015 const char Modifier,
4016 unsigned Size) const {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004017 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00004018 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004019
Bill Wendling50d46ca2012-10-25 23:28:48 +00004020 // Strip off constraint modifiers.
4021 while (Constraint[0] == '=' ||
4022 Constraint[0] == '+' ||
4023 Constraint[0] == '&')
4024 Constraint = Constraint.substr(1);
4025
4026 switch (Constraint[0]) {
4027 default: break;
4028 case 'r': {
4029 switch (Modifier) {
4030 default:
Bob Wilson221a8902013-06-03 23:57:13 +00004031 return (isInOut || isOutput || Size <= 32);
Bill Wendling50d46ca2012-10-25 23:28:48 +00004032 case 'q':
4033 // A register of size 32 cannot fit a vector type.
4034 return false;
4035 }
4036 }
4037 }
4038
4039 return true;
4040 }
Chris Lattner393ff042008-04-21 18:56:49 +00004041 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00004042 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00004043 return "";
4044 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00004045
4046 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
4047 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4048 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004049
4050 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4051 if (RegNo == 0) return 0;
4052 if (RegNo == 1) return 1;
4053 return -1;
4054 }
Chris Lattner393ff042008-04-21 18:56:49 +00004055};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004056
Rafael Espindola5389b842013-08-21 21:59:03 +00004057bool ARMTargetInfo::setFPMath(StringRef Name) {
4058 if (Name == "neon") {
4059 FPMath = FP_Neon;
4060 return true;
4061 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4062 Name == "vfp4") {
4063 FPMath = FP_VFP;
4064 return true;
4065 }
4066 return false;
4067}
4068
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004069const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00004070 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004071 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00004072 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4073
4074 // Float registers
4075 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4076 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4077 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00004078 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00004079
Dale Johannesen20eb49b2010-10-27 23:34:42 +00004080 // Double registers
4081 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4082 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00004083 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4084 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00004085
4086 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00004087 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4088 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004089};
4090
4091void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00004092 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004093 Names = GCCRegNames;
4094 NumNames = llvm::array_lengthof(GCCRegNames);
4095}
4096
4097const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004098 { { "a1" }, "r0" },
4099 { { "a2" }, "r1" },
4100 { { "a3" }, "r2" },
4101 { { "a4" }, "r3" },
4102 { { "v1" }, "r4" },
4103 { { "v2" }, "r5" },
4104 { { "v3" }, "r6" },
4105 { { "v4" }, "r7" },
4106 { { "v5" }, "r8" },
4107 { { "v6", "rfp" }, "r9" },
4108 { { "sl" }, "r10" },
4109 { { "fp" }, "r11" },
4110 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00004111 { { "r13" }, "sp" },
4112 { { "r14" }, "lr" },
4113 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00004114 // The S, D and Q registers overlap, but aren't really aliases; we
4115 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004116};
4117
4118void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4119 unsigned &NumAliases) const {
4120 Aliases = GCCRegAliases;
4121 NumAliases = llvm::array_lengthof(GCCRegAliases);
4122}
Chris Lattner2752c012010-03-03 19:03:45 +00004123
4124const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00004125#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00004126#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00004127 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00004128#include "clang/Basic/BuiltinsARM.def"
4129};
Chris Lattner393ff042008-04-21 18:56:49 +00004130} // end anonymous namespace.
4131
Eli Friedmana9f54962008-08-20 07:44:10 +00004132namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00004133class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00004134 public DarwinTargetInfo<ARMTargetInfo> {
4135protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00004136 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00004137 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00004138 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00004139 }
Eli Friedmana9f54962008-08-20 07:44:10 +00004140
Torok Edwin5f6c1942009-06-30 17:10:35 +00004141public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004142 DarwinARMTargetInfo(const llvm::Triple &Triple)
4143 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar350b9f32010-05-27 07:00:26 +00004144 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00004145 // iOS always has 64-bit atomic instructions.
4146 // FIXME: This should be based off of the target features in ARMTargetInfo.
4147 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00004148
4149 // Darwin on iOS uses a variant of the ARM C++ ABI.
4150 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar350b9f32010-05-27 07:00:26 +00004151 }
Eli Friedmana9f54962008-08-20 07:44:10 +00004152};
4153} // end anonymous namespace.
4154
Tony Linthicum96319392011-12-12 21:14:55 +00004155
4156namespace {
4157// Hexagon abstract base class
4158class HexagonTargetInfo : public TargetInfo {
4159 static const Builtin::Info BuiltinInfo[];
4160 static const char * const GCCRegNames[];
4161 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4162 std::string CPU;
4163public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004164 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004165 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00004166 DescriptionString = ("e-p:32:32:32-"
Anshuman Dasgupta1a090f12013-01-02 21:25:57 +00004167 "i64:64:64-i32:32:32-i16:16:16-i1:32:32-"
Sirish Pande5f9688b2012-05-10 20:19:54 +00004168 "f64:64:64-f32:32:32-a0:0-n32");
Tony Linthicum96319392011-12-12 21:14:55 +00004169
4170 // {} in inline assembly are packet specifiers, not assembly variant
4171 // specifiers.
4172 NoAsmVariants = true;
4173 }
4174
4175 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4176 unsigned &NumRecords) const {
4177 Records = BuiltinInfo;
4178 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4179 }
4180
4181 virtual bool validateAsmConstraint(const char *&Name,
4182 TargetInfo::ConstraintInfo &Info) const {
4183 return true;
4184 }
4185
4186 virtual void getTargetDefines(const LangOptions &Opts,
4187 MacroBuilder &Builder) const;
4188
Douglas Gregore727d212012-01-30 06:38:25 +00004189 virtual bool hasFeature(StringRef Feature) const {
4190 return Feature == "hexagon";
4191 }
4192
Meador Ingec5613b22012-06-16 03:34:49 +00004193 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4194 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00004195 }
4196 virtual void getGCCRegNames(const char * const *&Names,
4197 unsigned &NumNames) const;
4198 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4199 unsigned &NumAliases) const;
4200 virtual const char *getClobbers() const {
4201 return "";
4202 }
Sebastian Pop43115d42012-01-13 20:37:10 +00004203
4204 static const char *getHexagonCPUSuffix(StringRef Name) {
4205 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop43115d42012-01-13 20:37:10 +00004206 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00004207 .Case("hexagonv5", "5")
Sebastian Pop43115d42012-01-13 20:37:10 +00004208 .Default(0);
4209 }
4210
Tony Linthicum96319392011-12-12 21:14:55 +00004211 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00004212 if (!getHexagonCPUSuffix(Name))
4213 return false;
4214
Tony Linthicum96319392011-12-12 21:14:55 +00004215 CPU = Name;
4216 return true;
4217 }
4218};
4219
4220void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4221 MacroBuilder &Builder) const {
4222 Builder.defineMacro("qdsp6");
4223 Builder.defineMacro("__qdsp6", "1");
4224 Builder.defineMacro("__qdsp6__", "1");
4225
4226 Builder.defineMacro("hexagon");
4227 Builder.defineMacro("__hexagon", "1");
4228 Builder.defineMacro("__hexagon__", "1");
4229
4230 if(CPU == "hexagonv1") {
4231 Builder.defineMacro("__HEXAGON_V1__");
4232 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4233 if(Opts.HexagonQdsp6Compat) {
4234 Builder.defineMacro("__QDSP6_V1__");
4235 Builder.defineMacro("__QDSP6_ARCH__", "1");
4236 }
4237 }
4238 else if(CPU == "hexagonv2") {
4239 Builder.defineMacro("__HEXAGON_V2__");
4240 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4241 if(Opts.HexagonQdsp6Compat) {
4242 Builder.defineMacro("__QDSP6_V2__");
4243 Builder.defineMacro("__QDSP6_ARCH__", "2");
4244 }
4245 }
4246 else if(CPU == "hexagonv3") {
4247 Builder.defineMacro("__HEXAGON_V3__");
4248 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4249 if(Opts.HexagonQdsp6Compat) {
4250 Builder.defineMacro("__QDSP6_V3__");
4251 Builder.defineMacro("__QDSP6_ARCH__", "3");
4252 }
4253 }
4254 else if(CPU == "hexagonv4") {
4255 Builder.defineMacro("__HEXAGON_V4__");
4256 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4257 if(Opts.HexagonQdsp6Compat) {
4258 Builder.defineMacro("__QDSP6_V4__");
4259 Builder.defineMacro("__QDSP6_ARCH__", "4");
4260 }
4261 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00004262 else if(CPU == "hexagonv5") {
4263 Builder.defineMacro("__HEXAGON_V5__");
4264 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4265 if(Opts.HexagonQdsp6Compat) {
4266 Builder.defineMacro("__QDSP6_V5__");
4267 Builder.defineMacro("__QDSP6_ARCH__", "5");
4268 }
4269 }
Tony Linthicum96319392011-12-12 21:14:55 +00004270}
4271
4272const char * const HexagonTargetInfo::GCCRegNames[] = {
4273 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4274 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4275 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4276 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4277 "p0", "p1", "p2", "p3",
4278 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4279};
4280
4281void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4282 unsigned &NumNames) const {
4283 Names = GCCRegNames;
4284 NumNames = llvm::array_lengthof(GCCRegNames);
4285}
4286
4287
4288const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4289 { { "sp" }, "r29" },
4290 { { "fp" }, "r30" },
4291 { { "lr" }, "r31" },
4292 };
4293
4294void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4295 unsigned &NumAliases) const {
4296 Aliases = GCCRegAliases;
4297 NumAliases = llvm::array_lengthof(GCCRegAliases);
4298}
4299
4300
4301const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4302#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4303#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4304 ALL_LANGUAGES },
4305#include "clang/Basic/BuiltinsHexagon.def"
4306};
4307}
4308
4309
Reid Spencer5f016e22007-07-11 17:01:13 +00004310namespace {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004311// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4312class SparcTargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00004313 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4314 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004315 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00004316public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004317 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004318
Eric Christopher3d11ced2013-10-16 21:26:26 +00004319 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindola5389b842013-08-21 21:59:03 +00004320 DiagnosticsEngine &Diags) {
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004321 SoftFloat = false;
4322 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4323 if (Features[i] == "+soft-float")
4324 SoftFloat = true;
Rafael Espindola5389b842013-08-21 21:59:03 +00004325 return true;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004326 }
Chris Lattner33328642009-03-20 15:52:06 +00004327 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004328 MacroBuilder &Builder) const {
4329 DefineStd(Builder, "sparc", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00004330 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004331
4332 if (SoftFloat)
4333 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00004334 }
Douglas Gregore727d212012-01-30 06:38:25 +00004335
4336 virtual bool hasFeature(StringRef Feature) const {
4337 return llvm::StringSwitch<bool>(Feature)
4338 .Case("softfloat", SoftFloat)
4339 .Case("sparc", true)
4340 .Default(false);
4341 }
4342
Gabor Greif26658672008-02-21 16:29:08 +00004343 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4344 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004345 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00004346 }
Meador Ingec5613b22012-06-16 03:34:49 +00004347 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4348 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif26658672008-02-21 16:29:08 +00004349 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004350 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00004351 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004352 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00004353 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00004354 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00004355 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004356 // FIXME: Implement!
4357 return false;
Gabor Greif26658672008-02-21 16:29:08 +00004358 }
4359 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00004360 // FIXME: Implement!
4361 return "";
Gabor Greif26658672008-02-21 16:29:08 +00004362 }
4363};
4364
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004365const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattnere957f532009-01-27 01:58:38 +00004366 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4367 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4368 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4369 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4370};
4371
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004372void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4373 unsigned &NumNames) const {
Chris Lattnere957f532009-01-27 01:58:38 +00004374 Names = GCCRegNames;
4375 NumNames = llvm::array_lengthof(GCCRegNames);
4376}
4377
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004378const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004379 { { "g0" }, "r0" },
4380 { { "g1" }, "r1" },
4381 { { "g2" }, "r2" },
4382 { { "g3" }, "r3" },
4383 { { "g4" }, "r4" },
4384 { { "g5" }, "r5" },
4385 { { "g6" }, "r6" },
4386 { { "g7" }, "r7" },
4387 { { "o0" }, "r8" },
4388 { { "o1" }, "r9" },
4389 { { "o2" }, "r10" },
4390 { { "o3" }, "r11" },
4391 { { "o4" }, "r12" },
4392 { { "o5" }, "r13" },
4393 { { "o6", "sp" }, "r14" },
4394 { { "o7" }, "r15" },
4395 { { "l0" }, "r16" },
4396 { { "l1" }, "r17" },
4397 { { "l2" }, "r18" },
4398 { { "l3" }, "r19" },
4399 { { "l4" }, "r20" },
4400 { { "l5" }, "r21" },
4401 { { "l6" }, "r22" },
4402 { { "l7" }, "r23" },
4403 { { "i0" }, "r24" },
4404 { { "i1" }, "r25" },
4405 { { "i2" }, "r26" },
4406 { { "i3" }, "r27" },
4407 { { "i4" }, "r28" },
4408 { { "i5" }, "r29" },
4409 { { "i6", "fp" }, "r30" },
4410 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00004411};
4412
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004413void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4414 unsigned &NumAliases) const {
Chris Lattnere957f532009-01-27 01:58:38 +00004415 Aliases = GCCRegAliases;
4416 NumAliases = llvm::array_lengthof(GCCRegAliases);
4417}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004418
4419// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4420class SparcV8TargetInfo : public SparcTargetInfo {
4421public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004422 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004423 // FIXME: Support Sparc quad-precision long double?
4424 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
4425 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
4426 }
4427
4428 virtual void getTargetDefines(const LangOptions &Opts,
4429 MacroBuilder &Builder) const {
4430 SparcTargetInfo::getTargetDefines(Opts, Builder);
4431 Builder.defineMacro("__sparcv8");
4432 }
4433};
4434
4435// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4436class SparcV9TargetInfo : public SparcTargetInfo {
4437public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004438 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004439 // FIXME: Support Sparc quad-precision long double?
4440 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
4441 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32:64-S128";
Jakob Stoklund Olesenfcec0c92013-05-15 03:22:33 +00004442 // This is an LP64 platform.
4443 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00004444
4445 // OpenBSD uses long long for int64_t and intmax_t.
4446 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4447 IntMaxType = SignedLongLong;
4448 UIntMaxType = UnsignedLongLong;
4449 } else {
4450 IntMaxType = SignedLong;
4451 UIntMaxType = UnsignedLong;
4452 }
4453 Int64Type = IntMaxType;
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004454 }
4455
4456 virtual void getTargetDefines(const LangOptions &Opts,
4457 MacroBuilder &Builder) const {
4458 SparcTargetInfo::getTargetDefines(Opts, Builder);
4459 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesen44f72d32013-04-24 04:36:38 +00004460 Builder.defineMacro("__arch64__");
4461 // Solaris and its derivative AuroraUX don't need these variants, but the
4462 // BSDs do.
4463 if (getTriple().getOS() != llvm::Triple::Solaris &&
4464 getTriple().getOS() != llvm::Triple::AuroraUX) {
4465 Builder.defineMacro("__sparc64__");
4466 Builder.defineMacro("__sparc_v9__");
4467 Builder.defineMacro("__sparcv9__");
4468 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004469 }
4470};
4471
Gabor Greif26658672008-02-21 16:29:08 +00004472} // end anonymous namespace.
4473
Eli Friedman01b86682008-08-20 07:28:14 +00004474namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004475class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4476public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004477 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4478 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004479 SizeType = UnsignedInt;
4480 PtrDiffType = SignedInt;
4481 }
4482};
Torok Edwin5f6c1942009-06-30 17:10:35 +00004483class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00004484public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004485 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4486 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00004487 SizeType = UnsignedInt;
4488 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00004489 }
4490};
4491} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00004492
Chris Lattner2621fd12008-05-08 05:58:21 +00004493namespace {
Ulrich Weigandb8409212013-05-06 16:26:41 +00004494 class SystemZTargetInfo : public TargetInfo {
4495 static const char *const GCCRegNames[];
4496
4497 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004498 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigandb8409212013-05-06 16:26:41 +00004499 TLSSupported = true;
4500 IntWidth = IntAlign = 32;
4501 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4502 PointerWidth = PointerAlign = 64;
4503 LongDoubleWidth = 128;
4504 LongDoubleAlign = 64;
4505 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4506 MinGlobalAlign = 16;
4507 DescriptionString = "E-p:64:64:64-i1:8:16-i8:8:16-i16:16-i32:32-i64:64"
4508 "-f32:32-f64:64-f128:64-a0:8:16-n32:64";
4509 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4510 }
4511 virtual void getTargetDefines(const LangOptions &Opts,
4512 MacroBuilder &Builder) const {
4513 Builder.defineMacro("__s390__");
4514 Builder.defineMacro("__s390x__");
4515 Builder.defineMacro("__zarch__");
4516 Builder.defineMacro("__LONG_DOUBLE_128__");
4517 }
4518 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4519 unsigned &NumRecords) const {
4520 // FIXME: Implement.
4521 Records = 0;
4522 NumRecords = 0;
4523 }
4524
4525 virtual void getGCCRegNames(const char *const *&Names,
4526 unsigned &NumNames) const;
4527 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4528 unsigned &NumAliases) const {
4529 // No aliases.
4530 Aliases = 0;
4531 NumAliases = 0;
4532 }
4533 virtual bool validateAsmConstraint(const char *&Name,
4534 TargetInfo::ConstraintInfo &info) const;
4535 virtual const char *getClobbers() const {
4536 // FIXME: Is this really right?
4537 return "";
4538 }
4539 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4540 return TargetInfo::SystemZBuiltinVaList;
4541 }
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00004542 virtual bool setCPU(const std::string &Name) {
4543 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4544 .Case("z10", true)
4545 .Case("z196", true)
4546 .Case("zEC12", true)
4547 .Default(false);
4548
4549 // No need to store the CPU yet. There aren't any CPU-specific
4550 // macros to define.
4551 return CPUKnown;
4552 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00004553 };
4554
4555 const char *const SystemZTargetInfo::GCCRegNames[] = {
4556 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4557 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4558 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4559 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4560 };
4561
4562 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4563 unsigned &NumNames) const {
4564 Names = GCCRegNames;
4565 NumNames = llvm::array_lengthof(GCCRegNames);
4566 }
4567
4568 bool SystemZTargetInfo::
4569 validateAsmConstraint(const char *&Name,
4570 TargetInfo::ConstraintInfo &Info) const {
4571 switch (*Name) {
4572 default:
4573 return false;
4574
4575 case 'a': // Address register
4576 case 'd': // Data register (equivalent to 'r')
4577 case 'f': // Floating-point register
4578 Info.setAllowsRegister();
4579 return true;
4580
4581 case 'I': // Unsigned 8-bit constant
4582 case 'J': // Unsigned 12-bit constant
4583 case 'K': // Signed 16-bit constant
4584 case 'L': // Signed 20-bit displacement (on all targets we support)
4585 case 'M': // 0x7fffffff
4586 return true;
4587
4588 case 'Q': // Memory with base and unsigned 12-bit displacement
4589 case 'R': // Likewise, plus an index
4590 case 'S': // Memory with base and signed 20-bit displacement
4591 case 'T': // Likewise, plus an index
4592 Info.setAllowsMemory();
4593 return true;
4594 }
4595 }
4596}
4597
4598namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004599 class MSP430TargetInfo : public TargetInfo {
4600 static const char * const GCCRegNames[];
4601 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004602 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004603 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004604 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00004605 IntWidth = 16; IntAlign = 16;
4606 LongWidth = 32; LongLongWidth = 64;
4607 LongAlign = LongLongAlign = 16;
4608 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004609 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004610 SizeType = UnsignedInt;
Anton Korobeynikov18a295d2013-07-01 19:42:40 +00004611 IntMaxType = SignedLongLong;
4612 UIntMaxType = UnsignedLongLong;
4613 IntPtrType = SignedInt;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004614 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00004615 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00004616 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004617 }
4618 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004619 MacroBuilder &Builder) const {
4620 Builder.defineMacro("MSP430");
4621 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004622 // FIXME: defines for different 'flavours' of MCU
4623 }
4624 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4625 unsigned &NumRecords) const {
4626 // FIXME: Implement.
4627 Records = 0;
4628 NumRecords = 0;
4629 }
Douglas Gregore727d212012-01-30 06:38:25 +00004630 virtual bool hasFeature(StringRef Feature) const {
4631 return Feature == "msp430";
4632 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004633 virtual void getGCCRegNames(const char * const *&Names,
4634 unsigned &NumNames) const;
4635 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4636 unsigned &NumAliases) const {
4637 // No aliases.
4638 Aliases = 0;
4639 NumAliases = 0;
4640 }
4641 virtual bool validateAsmConstraint(const char *&Name,
4642 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00004643 // No target constraints for now.
4644 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004645 }
4646 virtual const char *getClobbers() const {
4647 // FIXME: Is this really right?
4648 return "";
4649 }
Meador Ingec5613b22012-06-16 03:34:49 +00004650 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004651 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00004652 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004653 }
4654 };
4655
4656 const char * const MSP430TargetInfo::GCCRegNames[] = {
4657 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4658 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4659 };
4660
4661 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4662 unsigned &NumNames) const {
4663 Names = GCCRegNames;
4664 NumNames = llvm::array_lengthof(GCCRegNames);
4665 }
4666}
4667
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00004668namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00004669
Mike Stump1eb44332009-09-09 15:08:12 +00004670 // LLVM and Clang cannot be used directly to output native binaries for
4671 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00004672 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00004673 //
4674 // TCE uses the llvm bitcode as input and uses it for generating customized
4675 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00004676 // publicly available in http://tce.cs.tut.fi
4677
Eli Friedman209f5bb2011-10-07 19:51:42 +00004678 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4679 3, // opencl_global
4680 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00004681 5, // opencl_constant
4682 0, // cuda_device
4683 0, // cuda_constant
4684 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00004685 };
4686
Eli Friedmanb63decf2009-08-19 20:47:07 +00004687 class TCETargetInfo : public TargetInfo{
4688 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004689 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmanb63decf2009-08-19 20:47:07 +00004690 TLSSupported = false;
4691 IntWidth = 32;
4692 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004693 PointerWidth = 32;
4694 IntAlign = 32;
4695 LongAlign = LongLongAlign = 32;
4696 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004697 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004698 SizeType = UnsignedInt;
4699 IntMaxType = SignedLong;
4700 UIntMaxType = UnsignedLong;
4701 IntPtrType = SignedInt;
4702 PtrDiffType = SignedInt;
4703 FloatWidth = 32;
4704 FloatAlign = 32;
4705 DoubleWidth = 32;
4706 DoubleAlign = 32;
4707 LongDoubleWidth = 32;
4708 LongDoubleAlign = 32;
4709 FloatFormat = &llvm::APFloat::IEEEsingle;
4710 DoubleFormat = &llvm::APFloat::IEEEsingle;
4711 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00004712 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
4713 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00004714 "f32:32:32-f64:32:32-v64:32:32-"
4715 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00004716 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00004717 UseAddrSpaceMapMangling = true;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004718 }
4719
4720 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004721 MacroBuilder &Builder) const {
4722 DefineStd(Builder, "tce", Opts);
4723 Builder.defineMacro("__TCE__");
4724 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00004725 }
Douglas Gregore727d212012-01-30 06:38:25 +00004726 virtual bool hasFeature(StringRef Feature) const {
4727 return Feature == "tce";
4728 }
4729
Eli Friedmanb63decf2009-08-19 20:47:07 +00004730 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4731 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00004732 virtual const char *getClobbers() const {
4733 return "";
4734 }
Meador Ingec5613b22012-06-16 03:34:49 +00004735 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4736 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004737 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00004738 virtual void getGCCRegNames(const char * const *&Names,
4739 unsigned &NumNames) const {}
4740 virtual bool validateAsmConstraint(const char *&Name,
4741 TargetInfo::ConstraintInfo &info) const {
4742 return true;
4743 }
4744 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4745 unsigned &NumAliases) const {}
4746 };
4747}
4748
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004749namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004750class MipsTargetInfoBase : public TargetInfo {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004751 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004752 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004753 bool IsMips16;
Simon Atanasyan321ae792013-04-14 14:07:51 +00004754 bool IsMicromips;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004755 bool IsNan2008;
Simon Atanasyand96e3152013-04-14 14:07:30 +00004756 bool IsSingleFloat;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004757 enum MipsFloatABI {
Simon Atanasyand96e3152013-04-14 14:07:30 +00004758 HardFloat, SoftFloat
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004759 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004760 enum DspRevEnum {
4761 NoDSP, DSP1, DSP2
4762 } DspRev;
Jack Carterc613b672013-08-12 17:20:29 +00004763 bool HasMSA;
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00004764 bool HasFP64;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004765
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004766protected:
4767 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004768
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004769public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004770 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4771 const std::string &CPUStr)
4772 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004773 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00004774 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004775
Eric Christophered734732010-03-02 02:41:08 +00004776 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004777 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00004778 virtual bool setCPU(const std::string &Name) {
4779 CPU = Name;
4780 return true;
4781 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004782 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00004783 Features[ABI] = true;
4784 Features[CPU] = true;
4785 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004786
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004787 virtual void getTargetDefines(const LangOptions &Opts,
4788 MacroBuilder &Builder) const {
Simon Atanasyand4935a02012-08-29 19:14:58 +00004789 DefineStd(Builder, "mips", Opts);
4790 Builder.defineMacro("_mips");
4791 Builder.defineMacro("__REGISTER_PREFIX__", "");
4792
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004793 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004794 case HardFloat:
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004795 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004796 break;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004797 case SoftFloat:
4798 Builder.defineMacro("__mips_soft_float", Twine(1));
4799 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004800 }
Simon Atanasyan90913892012-04-05 19:28:31 +00004801
Simon Atanasyand96e3152013-04-14 14:07:30 +00004802 if (IsSingleFloat)
4803 Builder.defineMacro("__mips_single_float", Twine(1));
4804
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00004805 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
4806 Builder.defineMacro("_MIPS_FPSET",
4807 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
4808
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004809 if (IsMips16)
4810 Builder.defineMacro("__mips16", Twine(1));
4811
Simon Atanasyan321ae792013-04-14 14:07:51 +00004812 if (IsMicromips)
4813 Builder.defineMacro("__mips_micromips", Twine(1));
4814
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004815 if (IsNan2008)
4816 Builder.defineMacro("__mips_nan2008", Twine(1));
4817
Simon Atanasyana1b62272012-07-05 20:16:22 +00004818 switch (DspRev) {
4819 default:
4820 break;
4821 case DSP1:
4822 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4823 Builder.defineMacro("__mips_dsp", Twine(1));
4824 break;
4825 case DSP2:
4826 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4827 Builder.defineMacro("__mips_dspr2", Twine(1));
4828 Builder.defineMacro("__mips_dsp", Twine(1));
4829 break;
4830 }
4831
Jack Carterc613b672013-08-12 17:20:29 +00004832 if (HasMSA)
4833 Builder.defineMacro("__mips_msa", Twine(1));
4834
Simon Atanasyan90913892012-04-05 19:28:31 +00004835 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4836 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4837 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00004838
4839 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4840 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004841 }
4842
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004843 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4844 unsigned &NumRecords) const {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004845 Records = BuiltinInfo;
4846 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004847 }
Douglas Gregore727d212012-01-30 06:38:25 +00004848 virtual bool hasFeature(StringRef Feature) const {
4849 return Feature == "mips";
4850 }
Meador Ingec5613b22012-06-16 03:34:49 +00004851 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4852 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004853 }
4854 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004855 unsigned &NumNames) const {
4856 static const char * const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00004857 // CPU register names
4858 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004859 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4860 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4861 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004862 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4863 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004864 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4865 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4866 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4867 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004868 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004869 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
4870 "$fcc5","$fcc6","$fcc7"
4871 };
4872 Names = GCCRegNames;
4873 NumNames = llvm::array_lengthof(GCCRegNames);
4874 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004875 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004876 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004877 virtual bool validateAsmConstraint(const char *&Name,
4878 TargetInfo::ConstraintInfo &Info) const {
4879 switch (*Name) {
4880 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00004881 return false;
4882
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004883 case 'r': // CPU registers.
4884 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4885 case 'y': // Equivalent to "r", backwards compatibility only.
4886 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00004887 case 'c': // $25 for indirect jumps
4888 case 'l': // lo register
4889 case 'x': // hilo register pair
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004890 Info.setAllowsRegister();
4891 return true;
Jack Carter97102302013-03-05 19:10:54 +00004892 case 'R': // An address that can be used in a non-macro load or store
Jack Carterd2ab6d32013-03-04 21:36:11 +00004893 Info.setAllowsMemory();
4894 return true;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004895 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004896 }
4897
4898 virtual const char *getClobbers() const {
4899 // FIXME: Implement!
4900 return "";
4901 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004902
Eric Christopher3d11ced2013-10-16 21:26:26 +00004903 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindola5389b842013-08-21 21:59:03 +00004904 DiagnosticsEngine &Diags) {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004905 IsMips16 = false;
Simon Atanasyan321ae792013-04-14 14:07:51 +00004906 IsMicromips = false;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004907 IsNan2008 = false;
Simon Atanasyand96e3152013-04-14 14:07:30 +00004908 IsSingleFloat = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004909 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004910 DspRev = NoDSP;
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00004911 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004912
4913 for (std::vector<std::string>::iterator it = Features.begin(),
4914 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004915 if (*it == "+single-float")
Simon Atanasyand96e3152013-04-14 14:07:30 +00004916 IsSingleFloat = true;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004917 else if (*it == "+soft-float")
4918 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004919 else if (*it == "+mips16")
4920 IsMips16 = true;
Simon Atanasyan321ae792013-04-14 14:07:51 +00004921 else if (*it == "+micromips")
4922 IsMicromips = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004923 else if (*it == "+dsp")
4924 DspRev = std::max(DspRev, DSP1);
4925 else if (*it == "+dspr2")
4926 DspRev = std::max(DspRev, DSP2);
Jack Carterc613b672013-08-12 17:20:29 +00004927 else if (*it == "+msa")
4928 HasMSA = true;
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00004929 else if (*it == "+fp64")
4930 HasFP64 = true;
4931 else if (*it == "-fp64")
4932 HasFP64 = false;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004933 else if (*it == "+nan2008")
4934 IsNan2008 = true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004935 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004936
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004937 // Remove front-end specific options.
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004938 std::vector<std::string>::iterator it =
4939 std::find(Features.begin(), Features.end(), "+soft-float");
4940 if (it != Features.end())
4941 Features.erase(it);
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004942 it = std::find(Features.begin(), Features.end(), "+nan2008");
4943 if (it != Features.end())
4944 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00004945
4946 return true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004947 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004948
4949 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4950 if (RegNo == 0) return 4;
4951 if (RegNo == 1) return 5;
4952 return -1;
4953 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004954};
4955
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004956const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
4957#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4958#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4959 ALL_LANGUAGES },
4960#include "clang/Basic/BuiltinsMips.def"
4961};
4962
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004963class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004964public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004965 Mips32TargetInfoBase(const llvm::Triple &Triple)
4966 : MipsTargetInfoBase(Triple, "o32", "mips32") {
Akira Hatanaka148735e2011-11-05 01:48:34 +00004967 SizeType = UnsignedInt;
4968 PtrDiffType = SignedInt;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004969 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka148735e2011-11-05 01:48:34 +00004970 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004971 virtual bool setABI(const std::string &Name) {
4972 if ((Name == "o32") || (Name == "eabi")) {
4973 ABI = Name;
4974 return true;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004975 } else if (Name == "32") {
4976 ABI = "o32";
4977 return true;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004978 } else
4979 return false;
4980 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004981 virtual void getTargetDefines(const LangOptions &Opts,
4982 MacroBuilder &Builder) const {
4983 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004984
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004985 if (ABI == "o32") {
4986 Builder.defineMacro("__mips_o32");
4987 Builder.defineMacro("_ABIO32", "1");
4988 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
4989 }
4990 else if (ABI == "eabi")
4991 Builder.defineMacro("__mips_eabi");
4992 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004993 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004994 }
4995 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4996 unsigned &NumAliases) const {
4997 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4998 { { "at" }, "$1" },
4999 { { "v0" }, "$2" },
5000 { { "v1" }, "$3" },
5001 { { "a0" }, "$4" },
5002 { { "a1" }, "$5" },
5003 { { "a2" }, "$6" },
5004 { { "a3" }, "$7" },
5005 { { "t0" }, "$8" },
5006 { { "t1" }, "$9" },
5007 { { "t2" }, "$10" },
5008 { { "t3" }, "$11" },
5009 { { "t4" }, "$12" },
5010 { { "t5" }, "$13" },
5011 { { "t6" }, "$14" },
5012 { { "t7" }, "$15" },
5013 { { "s0" }, "$16" },
5014 { { "s1" }, "$17" },
5015 { { "s2" }, "$18" },
5016 { { "s3" }, "$19" },
5017 { { "s4" }, "$20" },
5018 { { "s5" }, "$21" },
5019 { { "s6" }, "$22" },
5020 { { "s7" }, "$23" },
5021 { { "t8" }, "$24" },
5022 { { "t9" }, "$25" },
5023 { { "k0" }, "$26" },
5024 { { "k1" }, "$27" },
5025 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00005026 { { "sp","$sp" }, "$29" },
5027 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005028 { { "ra" }, "$31" }
5029 };
5030 Aliases = GCCRegAliases;
5031 NumAliases = llvm::array_lengthof(GCCRegAliases);
5032 }
5033};
5034
5035class Mips32EBTargetInfo : public Mips32TargetInfoBase {
5036public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005037 Mips32EBTargetInfo(const llvm::Triple &Triple)
5038 : Mips32TargetInfoBase(Triple) {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005039 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005040 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005041 }
5042 virtual void getTargetDefines(const LangOptions &Opts,
5043 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005044 DefineStd(Builder, "MIPSEB", Opts);
5045 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005046 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005047 }
5048};
5049
5050class Mips32ELTargetInfo : public Mips32TargetInfoBase {
5051public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005052 Mips32ELTargetInfo(const llvm::Triple &Triple)
5053 : Mips32TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005054 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005055 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005056 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005057 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005058 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005059 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005060 DefineStd(Builder, "MIPSEL", Opts);
5061 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005062 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005063 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005064};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005065
5066class Mips64TargetInfoBase : public MipsTargetInfoBase {
5067 virtual void SetDescriptionString(const std::string &Name) = 0;
5068public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005069 Mips64TargetInfoBase(const llvm::Triple &Triple)
5070 : MipsTargetInfoBase(Triple, "n64", "mips64") {
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00005071 LongWidth = LongAlign = 64;
5072 PointerWidth = PointerAlign = 64;
5073 LongDoubleWidth = LongDoubleAlign = 128;
5074 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00005075 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5076 LongDoubleWidth = LongDoubleAlign = 64;
5077 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5078 }
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005079 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00005080 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00005081 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005082 virtual bool setABI(const std::string &Name) {
5083 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00005084 if (Name == "n32") {
5085 LongWidth = LongAlign = 32;
5086 PointerWidth = PointerAlign = 32;
Simon Atanasyane9616a42013-02-27 14:55:49 +00005087 ABI = Name;
5088 return true;
5089 } else if (Name == "n64") {
5090 ABI = Name;
5091 return true;
5092 } else if (Name == "64") {
5093 ABI = "n64";
5094 return true;
5095 } else
5096 return false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005097 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005098 virtual void getTargetDefines(const LangOptions &Opts,
5099 MacroBuilder &Builder) const {
5100 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005101
Simon Atanasyan600a5132012-08-29 20:50:11 +00005102 Builder.defineMacro("__mips64");
5103 Builder.defineMacro("__mips64__");
5104
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005105 if (ABI == "n32") {
5106 Builder.defineMacro("__mips_n32");
5107 Builder.defineMacro("_ABIN32", "2");
5108 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5109 }
5110 else if (ABI == "n64") {
5111 Builder.defineMacro("__mips_n64");
5112 Builder.defineMacro("_ABI64", "3");
5113 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5114 }
5115 else
David Blaikieb219cfc2011-09-23 05:06:16 +00005116 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005117 }
5118 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5119 unsigned &NumAliases) const {
5120 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5121 { { "at" }, "$1" },
5122 { { "v0" }, "$2" },
5123 { { "v1" }, "$3" },
5124 { { "a0" }, "$4" },
5125 { { "a1" }, "$5" },
5126 { { "a2" }, "$6" },
5127 { { "a3" }, "$7" },
5128 { { "a4" }, "$8" },
5129 { { "a5" }, "$9" },
5130 { { "a6" }, "$10" },
5131 { { "a7" }, "$11" },
5132 { { "t0" }, "$12" },
5133 { { "t1" }, "$13" },
5134 { { "t2" }, "$14" },
5135 { { "t3" }, "$15" },
5136 { { "s0" }, "$16" },
5137 { { "s1" }, "$17" },
5138 { { "s2" }, "$18" },
5139 { { "s3" }, "$19" },
5140 { { "s4" }, "$20" },
5141 { { "s5" }, "$21" },
5142 { { "s6" }, "$22" },
5143 { { "s7" }, "$23" },
5144 { { "t8" }, "$24" },
5145 { { "t9" }, "$25" },
5146 { { "k0" }, "$26" },
5147 { { "k1" }, "$27" },
5148 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00005149 { { "sp","$sp" }, "$29" },
5150 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005151 { { "ra" }, "$31" }
5152 };
5153 Aliases = GCCRegAliases;
5154 NumAliases = llvm::array_lengthof(GCCRegAliases);
5155 }
5156};
5157
5158class Mips64EBTargetInfo : public Mips64TargetInfoBase {
5159 virtual void SetDescriptionString(const std::string &Name) {
5160 // Change DescriptionString only if ABI is n32.
5161 if (Name == "n32")
5162 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00005163 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005164 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005165 }
5166public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005167 Mips64EBTargetInfo(const llvm::Triple &Triple)
5168 : Mips64TargetInfoBase(Triple) {
5169 // Default ABI is n64.
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005170 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00005171 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005172 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005173 }
5174 virtual void getTargetDefines(const LangOptions &Opts,
5175 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005176 DefineStd(Builder, "MIPSEB", Opts);
5177 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005178 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005179 }
5180};
5181
5182class Mips64ELTargetInfo : public Mips64TargetInfoBase {
5183 virtual void SetDescriptionString(const std::string &Name) {
5184 // Change DescriptionString only if ABI is n32.
5185 if (Name == "n32")
5186 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00005187 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005188 "-v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005189 }
5190public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005191 Mips64ELTargetInfo(const llvm::Triple &Triple)
5192 : Mips64TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005193 // Default ABI is n64.
5194 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005195 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00005196 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005197 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005198 }
5199 virtual void getTargetDefines(const LangOptions &Opts,
5200 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005201 DefineStd(Builder, "MIPSEL", Opts);
5202 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005203 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005204 }
5205};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005206} // end anonymous namespace.
5207
Ivan Krasinef05abd2011-08-24 20:22:22 +00005208namespace {
5209class PNaClTargetInfo : public TargetInfo {
5210public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005211 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005212 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005213 this->UserLabelPrefix = "";
5214 this->LongAlign = 32;
5215 this->LongWidth = 32;
5216 this->PointerAlign = 32;
5217 this->PointerWidth = 32;
5218 this->IntMaxType = TargetInfo::SignedLongLong;
5219 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5220 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005221 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005222 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005223 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005224 this->SizeType = TargetInfo::UnsignedInt;
5225 this->PtrDiffType = TargetInfo::SignedInt;
5226 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +00005227 this->RegParmMax = 0; // Disallow regparm
Ivan Krasinef05abd2011-08-24 20:22:22 +00005228 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
5229 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
5230 }
5231
Chandler Carruthc3a2e652011-09-28 05:56:05 +00005232 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005233 }
5234 virtual void getArchDefines(const LangOptions &Opts,
5235 MacroBuilder &Builder) const {
5236 Builder.defineMacro("__le32__");
5237 Builder.defineMacro("__pnacl__");
5238 }
5239 virtual void getTargetDefines(const LangOptions &Opts,
5240 MacroBuilder &Builder) const {
Jan Wen Voungdde3bdb2012-03-29 00:05:59 +00005241 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasinef05abd2011-08-24 20:22:22 +00005242 getArchDefines(Opts, Builder);
5243 }
Douglas Gregore727d212012-01-30 06:38:25 +00005244 virtual bool hasFeature(StringRef Feature) const {
5245 return Feature == "pnacl";
5246 }
Ivan Krasinef05abd2011-08-24 20:22:22 +00005247 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5248 unsigned &NumRecords) const {
5249 }
Meador Ingec5613b22012-06-16 03:34:49 +00005250 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5251 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005252 }
5253 virtual void getGCCRegNames(const char * const *&Names,
5254 unsigned &NumNames) const;
5255 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5256 unsigned &NumAliases) const;
5257 virtual bool validateAsmConstraint(const char *&Name,
5258 TargetInfo::ConstraintInfo &Info) const {
5259 return false;
5260 }
5261
5262 virtual const char *getClobbers() const {
5263 return "";
5264 }
5265};
5266
5267void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5268 unsigned &NumNames) const {
5269 Names = NULL;
5270 NumNames = 0;
5271}
5272
5273void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5274 unsigned &NumAliases) const {
5275 Aliases = NULL;
5276 NumAliases = 0;
5277}
5278} // end anonymous namespace.
5279
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005280namespace {
5281 static const unsigned SPIRAddrSpaceMap[] = {
5282 1, // opencl_global
5283 3, // opencl_local
5284 2, // opencl_constant
5285 0, // cuda_device
5286 0, // cuda_constant
5287 0 // cuda_shared
5288 };
5289 class SPIRTargetInfo : public TargetInfo {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005290 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005291 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005292 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5293 "SPIR target must use unknown OS");
5294 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5295 "SPIR target must use unknown environment type");
5296 BigEndian = false;
5297 TLSSupported = false;
5298 LongWidth = LongAlign = 64;
5299 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00005300 UseAddrSpaceMapMangling = true;
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005301 // Define available target features
5302 // These must be defined in sorted order!
5303 NoAsmVariants = true;
5304 }
5305 virtual void getTargetDefines(const LangOptions &Opts,
5306 MacroBuilder &Builder) const {
5307 DefineStd(Builder, "SPIR", Opts);
5308 }
5309 virtual bool hasFeature(StringRef Feature) const {
5310 return Feature == "spir";
5311 }
5312
5313 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5314 unsigned &NumRecords) const {}
5315 virtual const char *getClobbers() const {
5316 return "";
5317 }
5318 virtual void getGCCRegNames(const char * const *&Names,
5319 unsigned &NumNames) const {}
5320 virtual bool validateAsmConstraint(const char *&Name,
5321 TargetInfo::ConstraintInfo &info) const {
5322 return true;
5323 }
5324 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5325 unsigned &NumAliases) const {}
5326 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5327 return TargetInfo::VoidPtrBuiltinVaList;
5328 }
5329 };
5330
5331
5332 class SPIR32TargetInfo : public SPIRTargetInfo {
5333 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005334 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005335 PointerWidth = PointerAlign = 32;
5336 SizeType = TargetInfo::UnsignedInt;
5337 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5338 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00005339 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005340 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
5341 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
5342 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00005343 }
5344 virtual void getTargetDefines(const LangOptions &Opts,
5345 MacroBuilder &Builder) const {
5346 DefineStd(Builder, "SPIR32", Opts);
5347 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005348 };
5349
5350 class SPIR64TargetInfo : public SPIRTargetInfo {
5351 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005352 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005353 PointerWidth = PointerAlign = 64;
5354 SizeType = TargetInfo::UnsignedLong;
5355 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
5356 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00005357 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005358 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
5359 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
5360 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00005361 }
5362 virtual void getTargetDefines(const LangOptions &Opts,
5363 MacroBuilder &Builder) const {
5364 DefineStd(Builder, "SPIR64", Opts);
5365 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005366 };
5367}
5368
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005369namespace {
5370class XCoreTargetInfo : public TargetInfo {
5371 static const Builtin::Info BuiltinInfo[];
5372public:
5373 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5374 BigEndian = false;
5375 NoAsmVariants = true;
5376 LongLongAlign = 32;
5377 SuitableAlign = 32;
5378 DoubleAlign = LongDoubleAlign = 32;
5379 UseZeroLengthBitfieldAlignment = true;
5380 DescriptionString = "e-p:32:32:32-a0:0:32-n32"
5381 "-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32"
5382 "-f16:16:32-f32:32:32-f64:32:32";
5383 }
5384 virtual void getTargetDefines(const LangOptions &Opts,
5385 MacroBuilder &Builder) const {
5386 Builder.defineMacro("__XS1B__");
5387 }
5388 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5389 unsigned &NumRecords) const {
5390 Records = BuiltinInfo;
5391 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5392 }
5393 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5394 return TargetInfo::VoidPtrBuiltinVaList;
5395 }
5396 virtual const char *getClobbers() const {
5397 return "";
5398 }
5399 virtual void getGCCRegNames(const char * const *&Names,
5400 unsigned &NumNames) const {
5401 static const char * const GCCRegNames[] = {
5402 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5403 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5404 };
5405 Names = GCCRegNames;
5406 NumNames = llvm::array_lengthof(GCCRegNames);
5407 }
5408 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5409 unsigned &NumAliases) const {
5410 Aliases = NULL;
5411 NumAliases = 0;
5412 }
5413 virtual bool validateAsmConstraint(const char *&Name,
5414 TargetInfo::ConstraintInfo &Info) const {
5415 return false;
5416 }
5417};
5418
5419const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5420#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5421#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5422 ALL_LANGUAGES },
5423#include "clang/Basic/BuiltinsXCore.def"
5424};
5425} // end anonymous namespace.
5426
Ivan Krasinef05abd2011-08-24 20:22:22 +00005427
Reid Spencer5f016e22007-07-11 17:01:13 +00005428//===----------------------------------------------------------------------===//
5429// Driver code
5430//===----------------------------------------------------------------------===//
5431
Benjamin Kramer9df08232013-06-29 16:37:14 +00005432static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005433 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00005434
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005435 switch (Triple.getArch()) {
5436 default:
5437 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00005438
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005439 case llvm::Triple::xcore:
5440 return new XCoreTargetInfo(Triple);
5441
Tony Linthicum96319392011-12-12 21:14:55 +00005442 case llvm::Triple::hexagon:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005443 return new HexagonTargetInfo(Triple);
Tony Linthicum96319392011-12-12 21:14:55 +00005444
Tim Northoverc264e162013-01-31 12:13:10 +00005445 case llvm::Triple::aarch64:
5446 switch (os) {
5447 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005448 return new LinuxTargetInfo<AArch64TargetInfo>(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00005449 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005450 return new AArch64TargetInfo(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00005451 }
5452
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005453 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00005454 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005455 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005456 return new DarwinARMTargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005457
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005458 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00005459 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005460 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005461 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005462 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005463 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005464 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005465 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005466 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00005467 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005468 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00005469 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005470 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005471 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005472 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005473 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005474 return new ARMTargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005475 }
Eli Friedman61538a72008-05-20 14:21:01 +00005476
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005477 case llvm::Triple::msp430:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005478 return new MSP430TargetInfo(Triple);
Eli Friedman61538a72008-05-20 14:21:01 +00005479
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005480 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005481 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005482 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005483 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005484 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005485 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005486 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005487 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005488 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005489 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005490 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005491 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005492 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005493
5494 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005495 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005496 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005497 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005498 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005499 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005500 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005501 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005502 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005503 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicbbac9aa2013-09-21 01:27:01 +00005504 case llvm::Triple::NaCl:
5505 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005506 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005507 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005508 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005509
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005510 case llvm::Triple::mips64:
5511 switch (os) {
5512 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005513 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005514 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005515 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005516 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005517 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005518 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005519 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005520 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005521 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005522 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005523 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005524 }
5525
5526 case llvm::Triple::mips64el:
5527 switch (os) {
5528 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005529 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005530 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005531 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005532 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005533 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005534 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005535 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005536 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005537 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005538 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005539 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005540 }
5541
Ivan Krasinef05abd2011-08-24 20:22:22 +00005542 case llvm::Triple::le32:
5543 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00005544 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005545 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasinef05abd2011-08-24 20:22:22 +00005546 default:
5547 return NULL;
5548 }
5549
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005550 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005551 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005552 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005553 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005554 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005555 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005556 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005557 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005558 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005559 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005560 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005561 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005562 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005563 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005564 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005565 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005566 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005567
5568 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005569 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005570 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005571 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005572 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005573 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005574 case llvm::Triple::Lv2:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005575 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005576 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005577 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005578 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005579 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005580 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005581 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005582 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005583
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00005584 case llvm::Triple::ppc64le:
5585 switch (os) {
5586 case llvm::Triple::Linux:
5587 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5588 default:
5589 return new PPC64TargetInfo(Triple);
5590 }
5591
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005592 case llvm::Triple::nvptx:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005593 return new NVPTX32TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005594 case llvm::Triple::nvptx64:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005595 return new NVPTX64TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005596
Eli Friedman6505a292012-10-12 23:32:00 +00005597 case llvm::Triple::r600:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005598 return new R600TargetInfo(Triple);
Eli Friedman6505a292012-10-12 23:32:00 +00005599
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005600 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005601 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005602 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005603 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005604 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005605 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005606 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005607 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005608 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005609 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005610 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005611 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005612 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005613 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005614 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005615 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005616 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005617
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005618 case llvm::Triple::sparcv9:
5619 switch (os) {
5620 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005621 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005622 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005623 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005624 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005625 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005626 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005627 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005628 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005629 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005630 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005631 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005632 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005633 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005634 }
5635
Ulrich Weigandb8409212013-05-06 16:26:41 +00005636 case llvm::Triple::systemz:
5637 switch (os) {
5638 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005639 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00005640 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005641 return new SystemZTargetInfo(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00005642 }
5643
Eli Friedmanb63decf2009-08-19 20:47:07 +00005644 case llvm::Triple::tce:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005645 return new TCETargetInfo(Triple);
Eli Friedmanb63decf2009-08-19 20:47:07 +00005646
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005647 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005648 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005649 return new DarwinI386TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005650
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005651 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005652 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005653 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005654 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005655 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005656 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005657 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005658 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005659 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005660 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005661 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00005662 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005663 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005664 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005665 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00005666 case llvm::Triple::KFreeBSD:
5667 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner38e317d2010-07-07 16:01:42 +00005668 case llvm::Triple::Minix:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005669 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005670 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005671 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005672 case llvm::Triple::Cygwin:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005673 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005674 case llvm::Triple::MinGW32:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005675 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005676 case llvm::Triple::Win32:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005677 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattner86ed3a32010-04-11 19:29:39 +00005678 case llvm::Triple::Haiku:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005679 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00005680 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005681 return new RTEMSX86_32TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005682 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005683 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005684 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005685 return new X86_32TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005686 }
5687
5688 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005689 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
Benjamin Kramer9df08232013-06-29 16:37:14 +00005690 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005691
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005692 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005693 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005694 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005695 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005696 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner7a7ca282010-01-09 05:41:14 +00005697 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005698 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005699 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005700 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005701 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005702 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00005703 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005704 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005705 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005706 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00005707 case llvm::Triple::KFreeBSD:
5708 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005709 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005710 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00005711 case llvm::Triple::MinGW32:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005712 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005713 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramer9df08232013-06-29 16:37:14 +00005714 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005715 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005716 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005717 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005718 return new X86_64TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005719 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005720
5721 case llvm::Triple::spir: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005722 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00005723 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005724 return NULL;
Benjamin Kramer9df08232013-06-29 16:37:14 +00005725 return new SPIR32TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005726 }
5727 case llvm::Triple::spir64: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005728 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00005729 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005730 return NULL;
Benjamin Kramer9df08232013-06-29 16:37:14 +00005731 return new SPIR64TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005732 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005733 }
Reid Spencer5f016e22007-07-11 17:01:13 +00005734}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005735
5736/// CreateTargetInfo - Return the target info object for the specified target
5737/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00005738TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregor49a87542012-11-16 04:24:59 +00005739 TargetOptions *Opts) {
5740 llvm::Triple Triple(Opts->Triple);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005741
5742 // Construct the target
Benjamin Kramer9df08232013-06-29 16:37:14 +00005743 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005744 if (!Target) {
5745 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5746 return 0;
5747 }
Douglas Gregor9a022bb2012-10-15 16:45:32 +00005748 Target->setTargetOpts(Opts);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005749
Daniel Dunbareac7c532009-12-18 18:42:37 +00005750 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005751 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5752 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbareac7c532009-12-18 18:42:37 +00005753 return 0;
5754 }
5755
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005756 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005757 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5758 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005759 return 0;
5760 }
5761
Charles Davis98b7c5c2010-06-11 01:06:47 +00005762 // Set the target C++ ABI.
Douglas Gregor49a87542012-11-16 04:24:59 +00005763 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5764 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis98b7c5c2010-06-11 01:06:47 +00005765 return 0;
5766 }
5767
Rafael Espindola5389b842013-08-21 21:59:03 +00005768 // Set the fp math unit.
5769 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5770 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5771 return 0;
5772 }
5773
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005774 // Compute the default target features, we need the target to handle this
5775 // because features may have dependencies on one another.
5776 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00005777 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005778
Rafael Espindolac84ed542013-08-20 18:57:55 +00005779 // Apply the user specified deltas.
5780 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5781 I < N; ++I) {
5782 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005783 // Apply the feature via the target.
Rafael Espindolac84ed542013-08-20 18:57:55 +00005784 bool Enabled = Name[0] == '+';
5785 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005786 }
5787
5788 // Add the features to the compile options.
5789 //
5790 // FIXME: If we are completely confident that we have the right set, we only
5791 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00005792 Opts->Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005793 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5794 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00005795 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3d11ced2013-10-16 21:26:26 +00005796 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindola5389b842013-08-21 21:59:03 +00005797 return 0;
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005798
5799 return Target.take();
5800}