blob: 8037ebad863a18754d86c8ea1b668d6bb0a11368 [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 Christopher16543202013-10-16 21:19:26 +0000763 virtual bool HandleTargetFeatures(std::vector<std::string> &Features,
764 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 Christopher16543202013-10-16 21:19:26 +0000886 /// HandleTargetFeatures - Perform initialization based on the user
887/// configured set of features.
888bool PPCTargetInfo::HandleTargetFeatures(std::vector<std::string> &Features,
889 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;
Rafael Espindola5389b842013-08-21 21:59:03 +00001845 virtual bool HandleTargetFeatures(std::vector<std::string> &Features,
1846 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 Christopherf2174002013-10-16 21:19:19 +00002365/// HandleTargetFeatures - Perform initialization based on the user
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002366/// configured set of features.
Rafael Espindola5389b842013-08-21 21:59:03 +00002367bool X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features,
2368 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
Rafael Espindola5389b842013-08-21 21:59:03 +00003468 virtual bool HandleTargetFeatures(std::vector<std::string> &Features,
3469 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
3602 static bool FPUModeIsVFP(FPUMode Mode) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003603 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU);
Daniel Dunbara91320b2009-12-21 23:28:17 +00003604 }
3605
3606 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3607 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003608
Daniel Dunbareac7c532009-12-18 18:42:37 +00003609 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003610
Rafael Espindola5389b842013-08-21 21:59:03 +00003611 enum {
3612 FP_Default,
3613 FP_VFP,
3614 FP_Neon
3615 } FPMath;
3616
Bob Wilsoncfaab002012-09-29 23:52:52 +00003617 unsigned FPU : 4;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003618
Logan Chieneae5a8202012-10-10 06:56:20 +00003619 unsigned IsAAPCS : 1;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003620 unsigned IsThumb : 1;
3621
3622 // Initialized via features.
3623 unsigned SoftFloat : 1;
3624 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003625
Chris Lattner2752c012010-03-03 19:03:45 +00003626 static const Builtin::Info BuiltinInfo[];
3627
Rafael Espindola620c0af2013-05-13 20:09:47 +00003628 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3629 // On linux, binaries targeting old cpus call functions in libgcc to
3630 // perform atomic operations. The implementation in libgcc then calls into
3631 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3632 // is that if we assume the kernel is at least as recent as the hardware,
3633 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003634 if (!T.isOSLinux() &&
Rafael Espindolae1e03422013-06-17 20:00:15 +00003635 T.getOS() != llvm::Triple::FreeBSD &&
3636 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten04491632013-06-15 09:40:14 +00003637 return false;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003638 StringRef ArchName = T.getArchName();
Rafael Espindola69db5552013-05-14 00:44:24 +00003639 if (T.getArch() == llvm::Triple::arm) {
3640 if (!ArchName.startswith("armv"))
3641 return false;
3642 StringRef VersionStr = ArchName.substr(4);
3643 unsigned Version;
3644 if (VersionStr.getAsInteger(10, Version))
3645 return false;
3646 return Version >= 6;
3647 }
3648 assert(T.getArch() == llvm::Triple::thumb);
3649 if (!ArchName.startswith("thumbv"))
3650 return false;
3651 StringRef VersionStr = ArchName.substr(6);
3652 unsigned Version;
3653 if (VersionStr.getAsInteger(10, Version))
3654 return false;
3655 return Version >= 7;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003656 }
3657
Chris Lattner393ff042008-04-21 18:56:49 +00003658public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003659 ARMTargetInfo(const llvm::Triple &Triple)
3660 : TargetInfo(Triple), ABI("aapcs-linux"), CPU("arm1136j-s"),
Rafael Espindola5389b842013-08-21 21:59:03 +00003661 FPMath(FP_Default), IsAAPCS(true) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003662 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003663 SizeType = UnsignedInt;
3664 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00003665 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3666 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003667
Chris Lattner9bffb072010-04-23 16:29:58 +00003668 // {} in inline assembly are neon specifiers, not assembly variant
3669 // specifiers.
3670 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00003671
Daniel Dunbareac7c532009-12-18 18:42:37 +00003672 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00003673 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003674 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003675 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3676 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003677 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
3678 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003679 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003680 } else {
3681 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3682 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003683 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003684 }
John McCallee79a4c2010-08-21 22:46:04 +00003685
3686 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00003687 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00003688
3689 // ARM has atomics up to 8 bytes
Eli Friedman2be46072011-10-14 20:59:01 +00003690 MaxAtomicPromoteWidth = 64;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003691 if (shouldUseInlineAtomic(getTriple()))
3692 MaxAtomicInlineWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00003693
3694 // Do force alignment of members that follow zero length bitfields. If
3695 // the alignment of the zero-length bitfield is greater than the member
3696 // that follows it, `bar', `bar' will be aligned as the type of the
3697 // zero length bitfield.
3698 UseZeroLengthBitfieldAlignment = true;
Eli Friedman61538a72008-05-20 14:21:01 +00003699 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003700 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00003701 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003702 ABI = Name;
3703
Daniel Dunbara2a41612009-09-14 00:02:24 +00003704 // The defaults (above) are for AAPCS, check if we need to change them.
3705 //
3706 // FIXME: We need support for -meabi... we could just mangle it into the
3707 // name.
3708 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003709 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindola27fa2362012-12-13 04:17:14 +00003710 // size_t is unsigned int on FreeBSD.
3711 if (getTriple().getOS() != llvm::Triple::FreeBSD)
3712 SizeType = UnsignedLong;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003713
James Molloya6d81f92011-11-23 13:35:08 +00003714 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3715 WCharType = SignedInt;
3716
Daniel Dunbar684de632010-04-22 16:14:54 +00003717 // Do not respect the alignment of bit-field types when laying out
3718 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3719 UseBitFieldTypeAlignment = false;
3720
Chad Rosier61a62212011-08-04 01:21:14 +00003721 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00003722 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3723 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00003724 ZeroLengthBitfieldBoundary = 32;
3725
Logan Chieneae5a8202012-10-10 06:56:20 +00003726 IsAAPCS = false;
3727
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003728 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003729 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3730 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003731 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 +00003732 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003733 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003734 } else {
3735 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 +00003736 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003737 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003738 }
3739
Chad Rosier9f1210c2011-07-26 07:03:04 +00003740 // FIXME: Override "preferred align" for double and long long.
David Tweedb16abb12012-10-25 13:33:01 +00003741 } else if (Name == "aapcs" || Name == "aapcs-vfp") {
Bob Wilsone4bce7a2013-06-18 05:36:04 +00003742 // size_t is unsigned long on Darwin.
3743 if (getTriple().isOSDarwin())
3744 SizeType = UnsignedLong;
Logan Chieneae5a8202012-10-10 06:56:20 +00003745 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003746 // FIXME: Enumerated types are variable width in straight AAPCS.
3747 } else if (Name == "aapcs-linux") {
Logan Chieneae5a8202012-10-10 06:56:20 +00003748 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003749 } else
3750 return false;
3751
3752 return true;
3753 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003754
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003755 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003756 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3757 Features["vfp2"] = true;
Renato Golin1302f9f2013-09-13 17:02:45 +00003758 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3759 CPU == "cortex-a9-mp") {
3760 Features["vfp3"] = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003761 Features["neon"] = true;
Renato Golin1302f9f2013-09-13 17:02:45 +00003762 } else if (CPU == "swift" || CPU == "cortex-a5" ||
3763 CPU == "cortex-a7" || CPU == "cortex-a15") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003764 Features["vfp4"] = true;
3765 Features["neon"] = true;
3766 }
Daniel Dunbara91320b2009-12-21 23:28:17 +00003767 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00003768
Rafael Espindola5389b842013-08-21 21:59:03 +00003769 virtual bool HandleTargetFeatures(std::vector<std::string> &Features,
3770 DiagnosticsEngine &Diags) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003771 FPU = 0;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003772 SoftFloat = SoftFloatABI = false;
3773 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3774 if (Features[i] == "+soft-float")
3775 SoftFloat = true;
3776 else if (Features[i] == "+soft-float-abi")
3777 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003778 else if (Features[i] == "+vfp2")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003779 FPU |= VFP2FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003780 else if (Features[i] == "+vfp3")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003781 FPU |= VFP3FPU;
3782 else if (Features[i] == "+vfp4")
3783 FPU |= VFP4FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003784 else if (Features[i] == "+neon")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003785 FPU |= NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003786 }
3787
Rafael Espindola5389b842013-08-21 21:59:03 +00003788 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3789 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3790 return false;
3791 }
3792
3793 if (FPMath == FP_Neon)
3794 Features.push_back("+neonfp");
3795 else if (FPMath == FP_VFP)
3796 Features.push_back("-neonfp");
3797
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003798 // Remove front-end specific options which the backend handles differently.
3799 std::vector<std::string>::iterator it;
3800 it = std::find(Features.begin(), Features.end(), "+soft-float");
3801 if (it != Features.end())
3802 Features.erase(it);
3803 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3804 if (it != Features.end())
3805 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00003806 return true;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003807 }
3808
Douglas Gregore727d212012-01-30 06:38:25 +00003809 virtual bool hasFeature(StringRef Feature) const {
3810 return llvm::StringSwitch<bool>(Feature)
3811 .Case("arm", true)
3812 .Case("softfloat", SoftFloat)
3813 .Case("thumb", IsThumb)
Amara Emerson2440fb12013-09-16 18:07:35 +00003814 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Douglas Gregore727d212012-01-30 06:38:25 +00003815 .Default(false);
3816 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003817 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00003818 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00003819 return llvm::StringSwitch<const char*>(Name)
3820 .Cases("arm8", "arm810", "4")
3821 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3822 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3823 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3824 .Case("ep9312", "4T")
3825 .Cases("arm10tdmi", "arm1020t", "5T")
3826 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3827 .Case("arm926ej-s", "5TEJ")
3828 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3829 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003830 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003831 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003832 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003833 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonfc553452013-03-04 22:37:46 +00003834 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
Renato Golin5df40452013-09-13 17:02:54 +00003835 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "7A")
3836 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilson336bfa32012-09-29 23:52:50 +00003837 .Case("cortex-a9-mp", "7F")
3838 .Case("swift", "7S")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003839 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00003840 .Case("cortex-m0", "6M")
Joey Gouly4ec8d5b2013-06-26 17:19:48 +00003841 .Case("cortex-a53", "8A")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003842 .Default(0);
3843 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003844 static const char *getCPUProfile(StringRef Name) {
3845 return llvm::StringSwitch<const char*>(Name)
Renato Golin5df40452013-09-13 17:02:54 +00003846 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
3847 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "A")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003848 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin5df40452013-09-13 17:02:54 +00003849 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov8b0703d2012-09-08 08:22:13 +00003850 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003851 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003852 virtual bool setCPU(const std::string &Name) {
3853 if (!getCPUDefineSuffix(Name))
3854 return false;
3855
3856 CPU = Name;
3857 return true;
3858 }
Rafael Espindola5389b842013-08-21 21:59:03 +00003859 virtual bool setFPMath(StringRef Name);
Chris Lattner33328642009-03-20 15:52:06 +00003860 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003861 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00003862 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00003863 Builder.defineMacro("__arm");
3864 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003865
Chris Lattnerc0f59212009-03-02 22:27:17 +00003866 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00003867 Builder.defineMacro("__ARMEL__");
3868 Builder.defineMacro("__LITTLE_ENDIAN__");
3869 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003870
Chris Lattner5f9e2722011-07-23 10:55:15 +00003871 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00003872 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003873 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3874 StringRef CPUProfile = getCPUProfile(CPU);
3875 if (!CPUProfile.empty())
3876 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3877
Mike Stump437bb4b2009-04-08 02:07:04 +00003878 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003879
Daniel Dunbareac7c532009-12-18 18:42:37 +00003880 // FIXME: It's more complicated than this and we don't really support
3881 // interworking.
3882 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00003883 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003884
David Tweedb16abb12012-10-25 13:33:01 +00003885 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Daniel Dunbar849289e2012-10-22 18:51:13 +00003886 // M-class CPUs on Darwin follow AAPCS, but not EABI.
Daniel Dunbar4d3ee9b2012-10-22 18:56:43 +00003887 if (!(getTriple().isOSDarwin() && CPUProfile == "M"))
Daniel Dunbar849289e2012-10-22 18:51:13 +00003888 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003889 Builder.defineMacro("__ARM_PCS", "1");
3890
David Tweedb16abb12012-10-25 13:33:01 +00003891 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003892 Builder.defineMacro("__ARM_PCS_VFP", "1");
3893 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003894
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003895 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00003896 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003897
3898 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00003899 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003900
Bob Wilson84f95cf2011-05-13 18:56:03 +00003901 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003902 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003903 Builder.defineMacro("__THUMBEL__");
3904 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00003905 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003906 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003907 }
3908
3909 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00003910 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00003911
Bob Wilsoncfaab002012-09-29 23:52:52 +00003912 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003913 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00003914 if (FPU & VFP2FPU)
3915 Builder.defineMacro("__ARM_VFPV2__");
3916 if (FPU & VFP3FPU)
3917 Builder.defineMacro("__ARM_VFPV3__");
3918 if (FPU & VFP4FPU)
3919 Builder.defineMacro("__ARM_VFPV4__");
3920 }
3921
Daniel Dunbara91320b2009-12-21 23:28:17 +00003922 // This only gets set when Neon instructions are actually available, unlike
3923 // the VFP define, hence the soft float and arch check. This is subtly
3924 // different from gcc, we follow the intent which was that it should be set
3925 // when Neon instructions are actually available.
Bob Wilsoncfaab002012-09-29 23:52:52 +00003926 if ((FPU & NeonFPU) && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003927 Builder.defineMacro("__ARM_NEON__");
Joey Gouly520ec1e2013-09-18 10:07:09 +00003928
3929 if (CPUArch.startswith("8"))
3930 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao8712ded2013-09-30 22:51:32 +00003931
3932 if (CPUArch[0] >= '6' && CPUArch != "6M") {
3933 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3934 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3935 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3936 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
3937 }
Chris Lattner393ff042008-04-21 18:56:49 +00003938 }
3939 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3940 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00003941 Records = BuiltinInfo;
3942 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00003943 }
Bob Wilson8b30a932012-01-26 22:14:27 +00003944 virtual bool isCLZForZeroUndef() const { return false; }
Meador Ingec5613b22012-06-16 03:34:49 +00003945 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chieneae5a8202012-10-10 06:56:20 +00003946 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner393ff042008-04-21 18:56:49 +00003947 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003948 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003949 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003950 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003951 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003952 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00003953 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003954 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00003955 default: break;
Nate Begemanad487f42008-04-22 05:03:19 +00003956 case 'l': // r0-r7
3957 case 'h': // r8-r15
3958 case 'w': // VFP Floating point register single precision
3959 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00003960 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00003961 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00003962 case 'Q': // A memory address that is a single base register.
3963 Info.setAllowsMemory();
3964 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00003965 case 'U': // a memory reference...
3966 switch (Name[1]) {
3967 case 'q': // ...ARMV4 ldrsb
3968 case 'v': // ...VFP load/store (reg+constant offset)
3969 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00003970 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00003971 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00003972 case 'n': // valid address for Neon doubleword vector load/store
3973 case 'm': // valid address for Neon element and structure load/store
3974 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00003975 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00003976 Info.setAllowsMemory();
3977 Name++;
3978 return true;
3979 }
Nate Begemanad487f42008-04-22 05:03:19 +00003980 }
Chris Lattner393ff042008-04-21 18:56:49 +00003981 return false;
3982 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00003983 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00003984 std::string R;
3985 switch (*Constraint) {
3986 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00003987 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00003988 Constraint++;
3989 break;
Eric Christopher283f4472011-06-17 00:40:18 +00003990 case 'p': // 'p' should be translated to 'r' by default.
3991 R = std::string("r");
3992 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00003993 default:
3994 return std::string(1, *Constraint);
3995 }
3996 return R;
3997 }
Bill Wendling50d46ca2012-10-25 23:28:48 +00003998 virtual bool validateConstraintModifier(StringRef Constraint,
3999 const char Modifier,
4000 unsigned Size) const {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004001 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00004002 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004003
Bill Wendling50d46ca2012-10-25 23:28:48 +00004004 // Strip off constraint modifiers.
4005 while (Constraint[0] == '=' ||
4006 Constraint[0] == '+' ||
4007 Constraint[0] == '&')
4008 Constraint = Constraint.substr(1);
4009
4010 switch (Constraint[0]) {
4011 default: break;
4012 case 'r': {
4013 switch (Modifier) {
4014 default:
Bob Wilson221a8902013-06-03 23:57:13 +00004015 return (isInOut || isOutput || Size <= 32);
Bill Wendling50d46ca2012-10-25 23:28:48 +00004016 case 'q':
4017 // A register of size 32 cannot fit a vector type.
4018 return false;
4019 }
4020 }
4021 }
4022
4023 return true;
4024 }
Chris Lattner393ff042008-04-21 18:56:49 +00004025 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00004026 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00004027 return "";
4028 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00004029
4030 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
4031 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4032 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004033
4034 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4035 if (RegNo == 0) return 0;
4036 if (RegNo == 1) return 1;
4037 return -1;
4038 }
Chris Lattner393ff042008-04-21 18:56:49 +00004039};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004040
Rafael Espindola5389b842013-08-21 21:59:03 +00004041bool ARMTargetInfo::setFPMath(StringRef Name) {
4042 if (Name == "neon") {
4043 FPMath = FP_Neon;
4044 return true;
4045 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4046 Name == "vfp4") {
4047 FPMath = FP_VFP;
4048 return true;
4049 }
4050 return false;
4051}
4052
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004053const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00004054 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004055 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00004056 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4057
4058 // Float registers
4059 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4060 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4061 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00004062 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00004063
Dale Johannesen20eb49b2010-10-27 23:34:42 +00004064 // Double registers
4065 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4066 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00004067 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4068 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00004069
4070 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00004071 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4072 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004073};
4074
4075void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00004076 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004077 Names = GCCRegNames;
4078 NumNames = llvm::array_lengthof(GCCRegNames);
4079}
4080
4081const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004082 { { "a1" }, "r0" },
4083 { { "a2" }, "r1" },
4084 { { "a3" }, "r2" },
4085 { { "a4" }, "r3" },
4086 { { "v1" }, "r4" },
4087 { { "v2" }, "r5" },
4088 { { "v3" }, "r6" },
4089 { { "v4" }, "r7" },
4090 { { "v5" }, "r8" },
4091 { { "v6", "rfp" }, "r9" },
4092 { { "sl" }, "r10" },
4093 { { "fp" }, "r11" },
4094 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00004095 { { "r13" }, "sp" },
4096 { { "r14" }, "lr" },
4097 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00004098 // The S, D and Q registers overlap, but aren't really aliases; we
4099 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00004100};
4101
4102void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4103 unsigned &NumAliases) const {
4104 Aliases = GCCRegAliases;
4105 NumAliases = llvm::array_lengthof(GCCRegAliases);
4106}
Chris Lattner2752c012010-03-03 19:03:45 +00004107
4108const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00004109#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00004110#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00004111 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00004112#include "clang/Basic/BuiltinsARM.def"
4113};
Chris Lattner393ff042008-04-21 18:56:49 +00004114} // end anonymous namespace.
4115
Eli Friedmana9f54962008-08-20 07:44:10 +00004116namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00004117class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00004118 public DarwinTargetInfo<ARMTargetInfo> {
4119protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00004120 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00004121 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00004122 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00004123 }
Eli Friedmana9f54962008-08-20 07:44:10 +00004124
Torok Edwin5f6c1942009-06-30 17:10:35 +00004125public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004126 DarwinARMTargetInfo(const llvm::Triple &Triple)
4127 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar350b9f32010-05-27 07:00:26 +00004128 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00004129 // iOS always has 64-bit atomic instructions.
4130 // FIXME: This should be based off of the target features in ARMTargetInfo.
4131 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00004132
4133 // Darwin on iOS uses a variant of the ARM C++ ABI.
4134 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar350b9f32010-05-27 07:00:26 +00004135 }
Eli Friedmana9f54962008-08-20 07:44:10 +00004136};
4137} // end anonymous namespace.
4138
Tony Linthicum96319392011-12-12 21:14:55 +00004139
4140namespace {
4141// Hexagon abstract base class
4142class HexagonTargetInfo : public TargetInfo {
4143 static const Builtin::Info BuiltinInfo[];
4144 static const char * const GCCRegNames[];
4145 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4146 std::string CPU;
4147public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004148 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004149 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00004150 DescriptionString = ("e-p:32:32:32-"
Anshuman Dasgupta1a090f12013-01-02 21:25:57 +00004151 "i64:64:64-i32:32:32-i16:16:16-i1:32:32-"
Sirish Pande5f9688b2012-05-10 20:19:54 +00004152 "f64:64:64-f32:32:32-a0:0-n32");
Tony Linthicum96319392011-12-12 21:14:55 +00004153
4154 // {} in inline assembly are packet specifiers, not assembly variant
4155 // specifiers.
4156 NoAsmVariants = true;
4157 }
4158
4159 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4160 unsigned &NumRecords) const {
4161 Records = BuiltinInfo;
4162 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4163 }
4164
4165 virtual bool validateAsmConstraint(const char *&Name,
4166 TargetInfo::ConstraintInfo &Info) const {
4167 return true;
4168 }
4169
4170 virtual void getTargetDefines(const LangOptions &Opts,
4171 MacroBuilder &Builder) const;
4172
Douglas Gregore727d212012-01-30 06:38:25 +00004173 virtual bool hasFeature(StringRef Feature) const {
4174 return Feature == "hexagon";
4175 }
4176
Meador Ingec5613b22012-06-16 03:34:49 +00004177 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4178 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00004179 }
4180 virtual void getGCCRegNames(const char * const *&Names,
4181 unsigned &NumNames) const;
4182 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4183 unsigned &NumAliases) const;
4184 virtual const char *getClobbers() const {
4185 return "";
4186 }
Sebastian Pop43115d42012-01-13 20:37:10 +00004187
4188 static const char *getHexagonCPUSuffix(StringRef Name) {
4189 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop43115d42012-01-13 20:37:10 +00004190 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00004191 .Case("hexagonv5", "5")
Sebastian Pop43115d42012-01-13 20:37:10 +00004192 .Default(0);
4193 }
4194
Tony Linthicum96319392011-12-12 21:14:55 +00004195 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00004196 if (!getHexagonCPUSuffix(Name))
4197 return false;
4198
Tony Linthicum96319392011-12-12 21:14:55 +00004199 CPU = Name;
4200 return true;
4201 }
4202};
4203
4204void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4205 MacroBuilder &Builder) const {
4206 Builder.defineMacro("qdsp6");
4207 Builder.defineMacro("__qdsp6", "1");
4208 Builder.defineMacro("__qdsp6__", "1");
4209
4210 Builder.defineMacro("hexagon");
4211 Builder.defineMacro("__hexagon", "1");
4212 Builder.defineMacro("__hexagon__", "1");
4213
4214 if(CPU == "hexagonv1") {
4215 Builder.defineMacro("__HEXAGON_V1__");
4216 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4217 if(Opts.HexagonQdsp6Compat) {
4218 Builder.defineMacro("__QDSP6_V1__");
4219 Builder.defineMacro("__QDSP6_ARCH__", "1");
4220 }
4221 }
4222 else if(CPU == "hexagonv2") {
4223 Builder.defineMacro("__HEXAGON_V2__");
4224 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4225 if(Opts.HexagonQdsp6Compat) {
4226 Builder.defineMacro("__QDSP6_V2__");
4227 Builder.defineMacro("__QDSP6_ARCH__", "2");
4228 }
4229 }
4230 else if(CPU == "hexagonv3") {
4231 Builder.defineMacro("__HEXAGON_V3__");
4232 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4233 if(Opts.HexagonQdsp6Compat) {
4234 Builder.defineMacro("__QDSP6_V3__");
4235 Builder.defineMacro("__QDSP6_ARCH__", "3");
4236 }
4237 }
4238 else if(CPU == "hexagonv4") {
4239 Builder.defineMacro("__HEXAGON_V4__");
4240 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4241 if(Opts.HexagonQdsp6Compat) {
4242 Builder.defineMacro("__QDSP6_V4__");
4243 Builder.defineMacro("__QDSP6_ARCH__", "4");
4244 }
4245 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00004246 else if(CPU == "hexagonv5") {
4247 Builder.defineMacro("__HEXAGON_V5__");
4248 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4249 if(Opts.HexagonQdsp6Compat) {
4250 Builder.defineMacro("__QDSP6_V5__");
4251 Builder.defineMacro("__QDSP6_ARCH__", "5");
4252 }
4253 }
Tony Linthicum96319392011-12-12 21:14:55 +00004254}
4255
4256const char * const HexagonTargetInfo::GCCRegNames[] = {
4257 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4258 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4259 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4260 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4261 "p0", "p1", "p2", "p3",
4262 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4263};
4264
4265void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4266 unsigned &NumNames) const {
4267 Names = GCCRegNames;
4268 NumNames = llvm::array_lengthof(GCCRegNames);
4269}
4270
4271
4272const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4273 { { "sp" }, "r29" },
4274 { { "fp" }, "r30" },
4275 { { "lr" }, "r31" },
4276 };
4277
4278void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4279 unsigned &NumAliases) const {
4280 Aliases = GCCRegAliases;
4281 NumAliases = llvm::array_lengthof(GCCRegAliases);
4282}
4283
4284
4285const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4286#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4287#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4288 ALL_LANGUAGES },
4289#include "clang/Basic/BuiltinsHexagon.def"
4290};
4291}
4292
4293
Reid Spencer5f016e22007-07-11 17:01:13 +00004294namespace {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004295// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4296class SparcTargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00004297 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4298 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004299 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00004300public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004301 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004302
Rafael Espindola5389b842013-08-21 21:59:03 +00004303 virtual bool HandleTargetFeatures(std::vector<std::string> &Features,
4304 DiagnosticsEngine &Diags) {
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004305 SoftFloat = false;
4306 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4307 if (Features[i] == "+soft-float")
4308 SoftFloat = true;
Rafael Espindola5389b842013-08-21 21:59:03 +00004309 return true;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004310 }
Chris Lattner33328642009-03-20 15:52:06 +00004311 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004312 MacroBuilder &Builder) const {
4313 DefineStd(Builder, "sparc", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00004314 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004315
4316 if (SoftFloat)
4317 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00004318 }
Douglas Gregore727d212012-01-30 06:38:25 +00004319
4320 virtual bool hasFeature(StringRef Feature) const {
4321 return llvm::StringSwitch<bool>(Feature)
4322 .Case("softfloat", SoftFloat)
4323 .Case("sparc", true)
4324 .Default(false);
4325 }
4326
Gabor Greif26658672008-02-21 16:29:08 +00004327 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4328 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004329 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00004330 }
Meador Ingec5613b22012-06-16 03:34:49 +00004331 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4332 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif26658672008-02-21 16:29:08 +00004333 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004334 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00004335 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004336 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00004337 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00004338 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00004339 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004340 // FIXME: Implement!
4341 return false;
Gabor Greif26658672008-02-21 16:29:08 +00004342 }
4343 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00004344 // FIXME: Implement!
4345 return "";
Gabor Greif26658672008-02-21 16:29:08 +00004346 }
4347};
4348
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004349const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattnere957f532009-01-27 01:58:38 +00004350 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4351 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4352 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4353 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4354};
4355
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004356void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4357 unsigned &NumNames) const {
Chris Lattnere957f532009-01-27 01:58:38 +00004358 Names = GCCRegNames;
4359 NumNames = llvm::array_lengthof(GCCRegNames);
4360}
4361
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004362const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004363 { { "g0" }, "r0" },
4364 { { "g1" }, "r1" },
4365 { { "g2" }, "r2" },
4366 { { "g3" }, "r3" },
4367 { { "g4" }, "r4" },
4368 { { "g5" }, "r5" },
4369 { { "g6" }, "r6" },
4370 { { "g7" }, "r7" },
4371 { { "o0" }, "r8" },
4372 { { "o1" }, "r9" },
4373 { { "o2" }, "r10" },
4374 { { "o3" }, "r11" },
4375 { { "o4" }, "r12" },
4376 { { "o5" }, "r13" },
4377 { { "o6", "sp" }, "r14" },
4378 { { "o7" }, "r15" },
4379 { { "l0" }, "r16" },
4380 { { "l1" }, "r17" },
4381 { { "l2" }, "r18" },
4382 { { "l3" }, "r19" },
4383 { { "l4" }, "r20" },
4384 { { "l5" }, "r21" },
4385 { { "l6" }, "r22" },
4386 { { "l7" }, "r23" },
4387 { { "i0" }, "r24" },
4388 { { "i1" }, "r25" },
4389 { { "i2" }, "r26" },
4390 { { "i3" }, "r27" },
4391 { { "i4" }, "r28" },
4392 { { "i5" }, "r29" },
4393 { { "i6", "fp" }, "r30" },
4394 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00004395};
4396
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004397void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4398 unsigned &NumAliases) const {
Chris Lattnere957f532009-01-27 01:58:38 +00004399 Aliases = GCCRegAliases;
4400 NumAliases = llvm::array_lengthof(GCCRegAliases);
4401}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004402
4403// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4404class SparcV8TargetInfo : public SparcTargetInfo {
4405public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004406 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004407 // FIXME: Support Sparc quad-precision long double?
4408 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
4409 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
4410 }
4411
4412 virtual void getTargetDefines(const LangOptions &Opts,
4413 MacroBuilder &Builder) const {
4414 SparcTargetInfo::getTargetDefines(Opts, Builder);
4415 Builder.defineMacro("__sparcv8");
4416 }
4417};
4418
4419// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4420class SparcV9TargetInfo : public SparcTargetInfo {
4421public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004422 SparcV9TargetInfo(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:64:64:64-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:64-S128";
Jakob Stoklund Olesenfcec0c92013-05-15 03:22:33 +00004426 // This is an LP64 platform.
4427 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00004428
4429 // OpenBSD uses long long for int64_t and intmax_t.
4430 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4431 IntMaxType = SignedLongLong;
4432 UIntMaxType = UnsignedLongLong;
4433 } else {
4434 IntMaxType = SignedLong;
4435 UIntMaxType = UnsignedLong;
4436 }
4437 Int64Type = IntMaxType;
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004438 }
4439
4440 virtual void getTargetDefines(const LangOptions &Opts,
4441 MacroBuilder &Builder) const {
4442 SparcTargetInfo::getTargetDefines(Opts, Builder);
4443 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesen44f72d32013-04-24 04:36:38 +00004444 Builder.defineMacro("__arch64__");
4445 // Solaris and its derivative AuroraUX don't need these variants, but the
4446 // BSDs do.
4447 if (getTriple().getOS() != llvm::Triple::Solaris &&
4448 getTriple().getOS() != llvm::Triple::AuroraUX) {
4449 Builder.defineMacro("__sparc64__");
4450 Builder.defineMacro("__sparc_v9__");
4451 Builder.defineMacro("__sparcv9__");
4452 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004453 }
4454};
4455
Gabor Greif26658672008-02-21 16:29:08 +00004456} // end anonymous namespace.
4457
Eli Friedman01b86682008-08-20 07:28:14 +00004458namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004459class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4460public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004461 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4462 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004463 SizeType = UnsignedInt;
4464 PtrDiffType = SignedInt;
4465 }
4466};
Torok Edwin5f6c1942009-06-30 17:10:35 +00004467class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00004468public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004469 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4470 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00004471 SizeType = UnsignedInt;
4472 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00004473 }
4474};
4475} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00004476
Chris Lattner2621fd12008-05-08 05:58:21 +00004477namespace {
Ulrich Weigandb8409212013-05-06 16:26:41 +00004478 class SystemZTargetInfo : public TargetInfo {
4479 static const char *const GCCRegNames[];
4480
4481 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004482 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigandb8409212013-05-06 16:26:41 +00004483 TLSSupported = true;
4484 IntWidth = IntAlign = 32;
4485 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4486 PointerWidth = PointerAlign = 64;
4487 LongDoubleWidth = 128;
4488 LongDoubleAlign = 64;
4489 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4490 MinGlobalAlign = 16;
4491 DescriptionString = "E-p:64:64:64-i1:8:16-i8:8:16-i16:16-i32:32-i64:64"
4492 "-f32:32-f64:64-f128:64-a0:8:16-n32:64";
4493 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4494 }
4495 virtual void getTargetDefines(const LangOptions &Opts,
4496 MacroBuilder &Builder) const {
4497 Builder.defineMacro("__s390__");
4498 Builder.defineMacro("__s390x__");
4499 Builder.defineMacro("__zarch__");
4500 Builder.defineMacro("__LONG_DOUBLE_128__");
4501 }
4502 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4503 unsigned &NumRecords) const {
4504 // FIXME: Implement.
4505 Records = 0;
4506 NumRecords = 0;
4507 }
4508
4509 virtual void getGCCRegNames(const char *const *&Names,
4510 unsigned &NumNames) const;
4511 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4512 unsigned &NumAliases) const {
4513 // No aliases.
4514 Aliases = 0;
4515 NumAliases = 0;
4516 }
4517 virtual bool validateAsmConstraint(const char *&Name,
4518 TargetInfo::ConstraintInfo &info) const;
4519 virtual const char *getClobbers() const {
4520 // FIXME: Is this really right?
4521 return "";
4522 }
4523 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4524 return TargetInfo::SystemZBuiltinVaList;
4525 }
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00004526 virtual bool setCPU(const std::string &Name) {
4527 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4528 .Case("z10", true)
4529 .Case("z196", true)
4530 .Case("zEC12", true)
4531 .Default(false);
4532
4533 // No need to store the CPU yet. There aren't any CPU-specific
4534 // macros to define.
4535 return CPUKnown;
4536 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00004537 };
4538
4539 const char *const SystemZTargetInfo::GCCRegNames[] = {
4540 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4541 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4542 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4543 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4544 };
4545
4546 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4547 unsigned &NumNames) const {
4548 Names = GCCRegNames;
4549 NumNames = llvm::array_lengthof(GCCRegNames);
4550 }
4551
4552 bool SystemZTargetInfo::
4553 validateAsmConstraint(const char *&Name,
4554 TargetInfo::ConstraintInfo &Info) const {
4555 switch (*Name) {
4556 default:
4557 return false;
4558
4559 case 'a': // Address register
4560 case 'd': // Data register (equivalent to 'r')
4561 case 'f': // Floating-point register
4562 Info.setAllowsRegister();
4563 return true;
4564
4565 case 'I': // Unsigned 8-bit constant
4566 case 'J': // Unsigned 12-bit constant
4567 case 'K': // Signed 16-bit constant
4568 case 'L': // Signed 20-bit displacement (on all targets we support)
4569 case 'M': // 0x7fffffff
4570 return true;
4571
4572 case 'Q': // Memory with base and unsigned 12-bit displacement
4573 case 'R': // Likewise, plus an index
4574 case 'S': // Memory with base and signed 20-bit displacement
4575 case 'T': // Likewise, plus an index
4576 Info.setAllowsMemory();
4577 return true;
4578 }
4579 }
4580}
4581
4582namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004583 class MSP430TargetInfo : public TargetInfo {
4584 static const char * const GCCRegNames[];
4585 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004586 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004587 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004588 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00004589 IntWidth = 16; IntAlign = 16;
4590 LongWidth = 32; LongLongWidth = 64;
4591 LongAlign = LongLongAlign = 16;
4592 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004593 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004594 SizeType = UnsignedInt;
Anton Korobeynikov18a295d2013-07-01 19:42:40 +00004595 IntMaxType = SignedLongLong;
4596 UIntMaxType = UnsignedLongLong;
4597 IntPtrType = SignedInt;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004598 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00004599 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00004600 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004601 }
4602 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004603 MacroBuilder &Builder) const {
4604 Builder.defineMacro("MSP430");
4605 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004606 // FIXME: defines for different 'flavours' of MCU
4607 }
4608 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4609 unsigned &NumRecords) const {
4610 // FIXME: Implement.
4611 Records = 0;
4612 NumRecords = 0;
4613 }
Douglas Gregore727d212012-01-30 06:38:25 +00004614 virtual bool hasFeature(StringRef Feature) const {
4615 return Feature == "msp430";
4616 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004617 virtual void getGCCRegNames(const char * const *&Names,
4618 unsigned &NumNames) const;
4619 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4620 unsigned &NumAliases) const {
4621 // No aliases.
4622 Aliases = 0;
4623 NumAliases = 0;
4624 }
4625 virtual bool validateAsmConstraint(const char *&Name,
4626 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00004627 // No target constraints for now.
4628 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004629 }
4630 virtual const char *getClobbers() const {
4631 // FIXME: Is this really right?
4632 return "";
4633 }
Meador Ingec5613b22012-06-16 03:34:49 +00004634 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004635 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00004636 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004637 }
4638 };
4639
4640 const char * const MSP430TargetInfo::GCCRegNames[] = {
4641 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4642 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4643 };
4644
4645 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4646 unsigned &NumNames) const {
4647 Names = GCCRegNames;
4648 NumNames = llvm::array_lengthof(GCCRegNames);
4649 }
4650}
4651
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00004652namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00004653
Mike Stump1eb44332009-09-09 15:08:12 +00004654 // LLVM and Clang cannot be used directly to output native binaries for
4655 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00004656 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00004657 //
4658 // TCE uses the llvm bitcode as input and uses it for generating customized
4659 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00004660 // publicly available in http://tce.cs.tut.fi
4661
Eli Friedman209f5bb2011-10-07 19:51:42 +00004662 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4663 3, // opencl_global
4664 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00004665 5, // opencl_constant
4666 0, // cuda_device
4667 0, // cuda_constant
4668 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00004669 };
4670
Eli Friedmanb63decf2009-08-19 20:47:07 +00004671 class TCETargetInfo : public TargetInfo{
4672 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004673 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmanb63decf2009-08-19 20:47:07 +00004674 TLSSupported = false;
4675 IntWidth = 32;
4676 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004677 PointerWidth = 32;
4678 IntAlign = 32;
4679 LongAlign = LongLongAlign = 32;
4680 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004681 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004682 SizeType = UnsignedInt;
4683 IntMaxType = SignedLong;
4684 UIntMaxType = UnsignedLong;
4685 IntPtrType = SignedInt;
4686 PtrDiffType = SignedInt;
4687 FloatWidth = 32;
4688 FloatAlign = 32;
4689 DoubleWidth = 32;
4690 DoubleAlign = 32;
4691 LongDoubleWidth = 32;
4692 LongDoubleAlign = 32;
4693 FloatFormat = &llvm::APFloat::IEEEsingle;
4694 DoubleFormat = &llvm::APFloat::IEEEsingle;
4695 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00004696 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
4697 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00004698 "f32:32:32-f64:32:32-v64:32:32-"
4699 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00004700 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00004701 UseAddrSpaceMapMangling = true;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004702 }
4703
4704 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004705 MacroBuilder &Builder) const {
4706 DefineStd(Builder, "tce", Opts);
4707 Builder.defineMacro("__TCE__");
4708 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00004709 }
Douglas Gregore727d212012-01-30 06:38:25 +00004710 virtual bool hasFeature(StringRef Feature) const {
4711 return Feature == "tce";
4712 }
4713
Eli Friedmanb63decf2009-08-19 20:47:07 +00004714 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4715 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00004716 virtual const char *getClobbers() const {
4717 return "";
4718 }
Meador Ingec5613b22012-06-16 03:34:49 +00004719 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4720 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004721 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00004722 virtual void getGCCRegNames(const char * const *&Names,
4723 unsigned &NumNames) const {}
4724 virtual bool validateAsmConstraint(const char *&Name,
4725 TargetInfo::ConstraintInfo &info) const {
4726 return true;
4727 }
4728 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4729 unsigned &NumAliases) const {}
4730 };
4731}
4732
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004733namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004734class MipsTargetInfoBase : public TargetInfo {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004735 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004736 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004737 bool IsMips16;
Simon Atanasyan321ae792013-04-14 14:07:51 +00004738 bool IsMicromips;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004739 bool IsNan2008;
Simon Atanasyand96e3152013-04-14 14:07:30 +00004740 bool IsSingleFloat;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004741 enum MipsFloatABI {
Simon Atanasyand96e3152013-04-14 14:07:30 +00004742 HardFloat, SoftFloat
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004743 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004744 enum DspRevEnum {
4745 NoDSP, DSP1, DSP2
4746 } DspRev;
Jack Carterc613b672013-08-12 17:20:29 +00004747 bool HasMSA;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004748
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004749protected:
4750 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004751
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004752public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004753 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4754 const std::string &CPUStr)
4755 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004756 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
4757 DspRev(NoDSP), HasMSA(false), ABI(ABIStr) {}
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004758
Eric Christophered734732010-03-02 02:41:08 +00004759 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004760 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00004761 virtual bool setCPU(const std::string &Name) {
4762 CPU = Name;
4763 return true;
4764 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004765 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00004766 Features[ABI] = true;
4767 Features[CPU] = true;
4768 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004769
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004770 virtual void getTargetDefines(const LangOptions &Opts,
4771 MacroBuilder &Builder) const {
Simon Atanasyand4935a02012-08-29 19:14:58 +00004772 DefineStd(Builder, "mips", Opts);
4773 Builder.defineMacro("_mips");
4774 Builder.defineMacro("__REGISTER_PREFIX__", "");
4775
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004776 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004777 case HardFloat:
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004778 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004779 break;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004780 case SoftFloat:
4781 Builder.defineMacro("__mips_soft_float", Twine(1));
4782 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004783 }
Simon Atanasyan90913892012-04-05 19:28:31 +00004784
Simon Atanasyand96e3152013-04-14 14:07:30 +00004785 if (IsSingleFloat)
4786 Builder.defineMacro("__mips_single_float", Twine(1));
4787
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004788 if (IsMips16)
4789 Builder.defineMacro("__mips16", Twine(1));
4790
Simon Atanasyan321ae792013-04-14 14:07:51 +00004791 if (IsMicromips)
4792 Builder.defineMacro("__mips_micromips", Twine(1));
4793
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004794 if (IsNan2008)
4795 Builder.defineMacro("__mips_nan2008", Twine(1));
4796
Simon Atanasyana1b62272012-07-05 20:16:22 +00004797 switch (DspRev) {
4798 default:
4799 break;
4800 case DSP1:
4801 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4802 Builder.defineMacro("__mips_dsp", Twine(1));
4803 break;
4804 case DSP2:
4805 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4806 Builder.defineMacro("__mips_dspr2", Twine(1));
4807 Builder.defineMacro("__mips_dsp", Twine(1));
4808 break;
4809 }
4810
Jack Carterc613b672013-08-12 17:20:29 +00004811 if (HasMSA)
4812 Builder.defineMacro("__mips_msa", Twine(1));
4813
Simon Atanasyan90913892012-04-05 19:28:31 +00004814 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4815 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4816 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00004817
4818 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4819 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004820 }
4821
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004822 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4823 unsigned &NumRecords) const {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004824 Records = BuiltinInfo;
4825 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004826 }
Douglas Gregore727d212012-01-30 06:38:25 +00004827 virtual bool hasFeature(StringRef Feature) const {
4828 return Feature == "mips";
4829 }
Meador Ingec5613b22012-06-16 03:34:49 +00004830 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4831 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004832 }
4833 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004834 unsigned &NumNames) const {
4835 static const char * const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00004836 // CPU register names
4837 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004838 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4839 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4840 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004841 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4842 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004843 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4844 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4845 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4846 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004847 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004848 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
4849 "$fcc5","$fcc6","$fcc7"
4850 };
4851 Names = GCCRegNames;
4852 NumNames = llvm::array_lengthof(GCCRegNames);
4853 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004854 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004855 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004856 virtual bool validateAsmConstraint(const char *&Name,
4857 TargetInfo::ConstraintInfo &Info) const {
4858 switch (*Name) {
4859 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00004860 return false;
4861
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004862 case 'r': // CPU registers.
4863 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4864 case 'y': // Equivalent to "r", backwards compatibility only.
4865 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00004866 case 'c': // $25 for indirect jumps
4867 case 'l': // lo register
4868 case 'x': // hilo register pair
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004869 Info.setAllowsRegister();
4870 return true;
Jack Carter97102302013-03-05 19:10:54 +00004871 case 'R': // An address that can be used in a non-macro load or store
Jack Carterd2ab6d32013-03-04 21:36:11 +00004872 Info.setAllowsMemory();
4873 return true;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004874 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004875 }
4876
4877 virtual const char *getClobbers() const {
4878 // FIXME: Implement!
4879 return "";
4880 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004881
Rafael Espindola5389b842013-08-21 21:59:03 +00004882 virtual bool HandleTargetFeatures(std::vector<std::string> &Features,
4883 DiagnosticsEngine &Diags) {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004884 IsMips16 = false;
Simon Atanasyan321ae792013-04-14 14:07:51 +00004885 IsMicromips = false;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004886 IsNan2008 = false;
Simon Atanasyand96e3152013-04-14 14:07:30 +00004887 IsSingleFloat = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004888 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004889 DspRev = NoDSP;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004890
4891 for (std::vector<std::string>::iterator it = Features.begin(),
4892 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004893 if (*it == "+single-float")
Simon Atanasyand96e3152013-04-14 14:07:30 +00004894 IsSingleFloat = true;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004895 else if (*it == "+soft-float")
4896 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004897 else if (*it == "+mips16")
4898 IsMips16 = true;
Simon Atanasyan321ae792013-04-14 14:07:51 +00004899 else if (*it == "+micromips")
4900 IsMicromips = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004901 else if (*it == "+dsp")
4902 DspRev = std::max(DspRev, DSP1);
4903 else if (*it == "+dspr2")
4904 DspRev = std::max(DspRev, DSP2);
Jack Carterc613b672013-08-12 17:20:29 +00004905 else if (*it == "+msa")
4906 HasMSA = true;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004907 else if (*it == "+nan2008")
4908 IsNan2008 = true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004909 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004910
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004911 // Remove front-end specific options.
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004912 std::vector<std::string>::iterator it =
4913 std::find(Features.begin(), Features.end(), "+soft-float");
4914 if (it != Features.end())
4915 Features.erase(it);
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00004916 it = std::find(Features.begin(), Features.end(), "+nan2008");
4917 if (it != Features.end())
4918 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00004919
4920 return true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004921 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004922
4923 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4924 if (RegNo == 0) return 4;
4925 if (RegNo == 1) return 5;
4926 return -1;
4927 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004928};
4929
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004930const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
4931#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4932#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4933 ALL_LANGUAGES },
4934#include "clang/Basic/BuiltinsMips.def"
4935};
4936
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004937class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004938public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004939 Mips32TargetInfoBase(const llvm::Triple &Triple)
4940 : MipsTargetInfoBase(Triple, "o32", "mips32") {
Akira Hatanaka148735e2011-11-05 01:48:34 +00004941 SizeType = UnsignedInt;
4942 PtrDiffType = SignedInt;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004943 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka148735e2011-11-05 01:48:34 +00004944 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004945 virtual bool setABI(const std::string &Name) {
4946 if ((Name == "o32") || (Name == "eabi")) {
4947 ABI = Name;
4948 return true;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004949 } else if (Name == "32") {
4950 ABI = "o32";
4951 return true;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004952 } else
4953 return false;
4954 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004955 virtual void getTargetDefines(const LangOptions &Opts,
4956 MacroBuilder &Builder) const {
4957 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004958
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004959 if (ABI == "o32") {
4960 Builder.defineMacro("__mips_o32");
4961 Builder.defineMacro("_ABIO32", "1");
4962 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
4963 }
4964 else if (ABI == "eabi")
4965 Builder.defineMacro("__mips_eabi");
4966 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004967 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004968 }
4969 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4970 unsigned &NumAliases) const {
4971 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4972 { { "at" }, "$1" },
4973 { { "v0" }, "$2" },
4974 { { "v1" }, "$3" },
4975 { { "a0" }, "$4" },
4976 { { "a1" }, "$5" },
4977 { { "a2" }, "$6" },
4978 { { "a3" }, "$7" },
4979 { { "t0" }, "$8" },
4980 { { "t1" }, "$9" },
4981 { { "t2" }, "$10" },
4982 { { "t3" }, "$11" },
4983 { { "t4" }, "$12" },
4984 { { "t5" }, "$13" },
4985 { { "t6" }, "$14" },
4986 { { "t7" }, "$15" },
4987 { { "s0" }, "$16" },
4988 { { "s1" }, "$17" },
4989 { { "s2" }, "$18" },
4990 { { "s3" }, "$19" },
4991 { { "s4" }, "$20" },
4992 { { "s5" }, "$21" },
4993 { { "s6" }, "$22" },
4994 { { "s7" }, "$23" },
4995 { { "t8" }, "$24" },
4996 { { "t9" }, "$25" },
4997 { { "k0" }, "$26" },
4998 { { "k1" }, "$27" },
4999 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00005000 { { "sp","$sp" }, "$29" },
5001 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005002 { { "ra" }, "$31" }
5003 };
5004 Aliases = GCCRegAliases;
5005 NumAliases = llvm::array_lengthof(GCCRegAliases);
5006 }
5007};
5008
5009class Mips32EBTargetInfo : public Mips32TargetInfoBase {
5010public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005011 Mips32EBTargetInfo(const llvm::Triple &Triple)
5012 : Mips32TargetInfoBase(Triple) {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005013 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 +00005014 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005015 }
5016 virtual void getTargetDefines(const LangOptions &Opts,
5017 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005018 DefineStd(Builder, "MIPSEB", Opts);
5019 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005020 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005021 }
5022};
5023
5024class Mips32ELTargetInfo : public Mips32TargetInfoBase {
5025public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005026 Mips32ELTargetInfo(const llvm::Triple &Triple)
5027 : Mips32TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005028 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005029 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 +00005030 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005031 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005032 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005033 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005034 DefineStd(Builder, "MIPSEL", Opts);
5035 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005036 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005037 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005038};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005039
5040class Mips64TargetInfoBase : public MipsTargetInfoBase {
5041 virtual void SetDescriptionString(const std::string &Name) = 0;
5042public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005043 Mips64TargetInfoBase(const llvm::Triple &Triple)
5044 : MipsTargetInfoBase(Triple, "n64", "mips64") {
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00005045 LongWidth = LongAlign = 64;
5046 PointerWidth = PointerAlign = 64;
5047 LongDoubleWidth = LongDoubleAlign = 128;
5048 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00005049 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5050 LongDoubleWidth = LongDoubleAlign = 64;
5051 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5052 }
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005053 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00005054 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00005055 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005056 virtual bool setABI(const std::string &Name) {
5057 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00005058 if (Name == "n32") {
5059 LongWidth = LongAlign = 32;
5060 PointerWidth = PointerAlign = 32;
Simon Atanasyane9616a42013-02-27 14:55:49 +00005061 ABI = Name;
5062 return true;
5063 } else if (Name == "n64") {
5064 ABI = Name;
5065 return true;
5066 } else if (Name == "64") {
5067 ABI = "n64";
5068 return true;
5069 } else
5070 return false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005071 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005072 virtual void getTargetDefines(const LangOptions &Opts,
5073 MacroBuilder &Builder) const {
5074 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005075
Simon Atanasyan600a5132012-08-29 20:50:11 +00005076 Builder.defineMacro("__mips64");
5077 Builder.defineMacro("__mips64__");
5078
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005079 if (ABI == "n32") {
5080 Builder.defineMacro("__mips_n32");
5081 Builder.defineMacro("_ABIN32", "2");
5082 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5083 }
5084 else if (ABI == "n64") {
5085 Builder.defineMacro("__mips_n64");
5086 Builder.defineMacro("_ABI64", "3");
5087 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5088 }
5089 else
David Blaikieb219cfc2011-09-23 05:06:16 +00005090 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005091 }
5092 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5093 unsigned &NumAliases) const {
5094 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5095 { { "at" }, "$1" },
5096 { { "v0" }, "$2" },
5097 { { "v1" }, "$3" },
5098 { { "a0" }, "$4" },
5099 { { "a1" }, "$5" },
5100 { { "a2" }, "$6" },
5101 { { "a3" }, "$7" },
5102 { { "a4" }, "$8" },
5103 { { "a5" }, "$9" },
5104 { { "a6" }, "$10" },
5105 { { "a7" }, "$11" },
5106 { { "t0" }, "$12" },
5107 { { "t1" }, "$13" },
5108 { { "t2" }, "$14" },
5109 { { "t3" }, "$15" },
5110 { { "s0" }, "$16" },
5111 { { "s1" }, "$17" },
5112 { { "s2" }, "$18" },
5113 { { "s3" }, "$19" },
5114 { { "s4" }, "$20" },
5115 { { "s5" }, "$21" },
5116 { { "s6" }, "$22" },
5117 { { "s7" }, "$23" },
5118 { { "t8" }, "$24" },
5119 { { "t9" }, "$25" },
5120 { { "k0" }, "$26" },
5121 { { "k1" }, "$27" },
5122 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00005123 { { "sp","$sp" }, "$29" },
5124 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005125 { { "ra" }, "$31" }
5126 };
5127 Aliases = GCCRegAliases;
5128 NumAliases = llvm::array_lengthof(GCCRegAliases);
5129 }
5130};
5131
5132class Mips64EBTargetInfo : public Mips64TargetInfoBase {
5133 virtual void SetDescriptionString(const std::string &Name) {
5134 // Change DescriptionString only if ABI is n32.
5135 if (Name == "n32")
5136 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 +00005137 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005138 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005139 }
5140public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005141 Mips64EBTargetInfo(const llvm::Triple &Triple)
5142 : Mips64TargetInfoBase(Triple) {
5143 // Default ABI is n64.
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005144 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 +00005145 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005146 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005147 }
5148 virtual void getTargetDefines(const LangOptions &Opts,
5149 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005150 DefineStd(Builder, "MIPSEB", Opts);
5151 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005152 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005153 }
5154};
5155
5156class Mips64ELTargetInfo : public Mips64TargetInfoBase {
5157 virtual void SetDescriptionString(const std::string &Name) {
5158 // Change DescriptionString only if ABI is n32.
5159 if (Name == "n32")
5160 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 +00005161 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005162 "-v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005163 }
5164public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005165 Mips64ELTargetInfo(const llvm::Triple &Triple)
5166 : Mips64TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005167 // Default ABI is n64.
5168 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005169 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 +00005170 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005171 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005172 }
5173 virtual void getTargetDefines(const LangOptions &Opts,
5174 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005175 DefineStd(Builder, "MIPSEL", Opts);
5176 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005177 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005178 }
5179};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005180} // end anonymous namespace.
5181
Ivan Krasinef05abd2011-08-24 20:22:22 +00005182namespace {
5183class PNaClTargetInfo : public TargetInfo {
5184public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005185 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005186 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005187 this->UserLabelPrefix = "";
5188 this->LongAlign = 32;
5189 this->LongWidth = 32;
5190 this->PointerAlign = 32;
5191 this->PointerWidth = 32;
5192 this->IntMaxType = TargetInfo::SignedLongLong;
5193 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5194 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005195 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005196 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005197 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005198 this->SizeType = TargetInfo::UnsignedInt;
5199 this->PtrDiffType = TargetInfo::SignedInt;
5200 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +00005201 this->RegParmMax = 0; // Disallow regparm
Ivan Krasinef05abd2011-08-24 20:22:22 +00005202 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
5203 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
5204 }
5205
Chandler Carruthc3a2e652011-09-28 05:56:05 +00005206 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005207 }
5208 virtual void getArchDefines(const LangOptions &Opts,
5209 MacroBuilder &Builder) const {
5210 Builder.defineMacro("__le32__");
5211 Builder.defineMacro("__pnacl__");
5212 }
5213 virtual void getTargetDefines(const LangOptions &Opts,
5214 MacroBuilder &Builder) const {
Jan Wen Voungdde3bdb2012-03-29 00:05:59 +00005215 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasinef05abd2011-08-24 20:22:22 +00005216 getArchDefines(Opts, Builder);
5217 }
Douglas Gregore727d212012-01-30 06:38:25 +00005218 virtual bool hasFeature(StringRef Feature) const {
5219 return Feature == "pnacl";
5220 }
Ivan Krasinef05abd2011-08-24 20:22:22 +00005221 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5222 unsigned &NumRecords) const {
5223 }
Meador Ingec5613b22012-06-16 03:34:49 +00005224 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5225 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005226 }
5227 virtual void getGCCRegNames(const char * const *&Names,
5228 unsigned &NumNames) const;
5229 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5230 unsigned &NumAliases) const;
5231 virtual bool validateAsmConstraint(const char *&Name,
5232 TargetInfo::ConstraintInfo &Info) const {
5233 return false;
5234 }
5235
5236 virtual const char *getClobbers() const {
5237 return "";
5238 }
5239};
5240
5241void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5242 unsigned &NumNames) const {
5243 Names = NULL;
5244 NumNames = 0;
5245}
5246
5247void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5248 unsigned &NumAliases) const {
5249 Aliases = NULL;
5250 NumAliases = 0;
5251}
5252} // end anonymous namespace.
5253
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005254namespace {
5255 static const unsigned SPIRAddrSpaceMap[] = {
5256 1, // opencl_global
5257 3, // opencl_local
5258 2, // opencl_constant
5259 0, // cuda_device
5260 0, // cuda_constant
5261 0 // cuda_shared
5262 };
5263 class SPIRTargetInfo : public TargetInfo {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005264 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005265 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005266 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5267 "SPIR target must use unknown OS");
5268 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5269 "SPIR target must use unknown environment type");
5270 BigEndian = false;
5271 TLSSupported = false;
5272 LongWidth = LongAlign = 64;
5273 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00005274 UseAddrSpaceMapMangling = true;
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005275 // Define available target features
5276 // These must be defined in sorted order!
5277 NoAsmVariants = true;
5278 }
5279 virtual void getTargetDefines(const LangOptions &Opts,
5280 MacroBuilder &Builder) const {
5281 DefineStd(Builder, "SPIR", Opts);
5282 }
5283 virtual bool hasFeature(StringRef Feature) const {
5284 return Feature == "spir";
5285 }
5286
5287 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5288 unsigned &NumRecords) const {}
5289 virtual const char *getClobbers() const {
5290 return "";
5291 }
5292 virtual void getGCCRegNames(const char * const *&Names,
5293 unsigned &NumNames) const {}
5294 virtual bool validateAsmConstraint(const char *&Name,
5295 TargetInfo::ConstraintInfo &info) const {
5296 return true;
5297 }
5298 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5299 unsigned &NumAliases) const {}
5300 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5301 return TargetInfo::VoidPtrBuiltinVaList;
5302 }
5303 };
5304
5305
5306 class SPIR32TargetInfo : public SPIRTargetInfo {
5307 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005308 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005309 PointerWidth = PointerAlign = 32;
5310 SizeType = TargetInfo::UnsignedInt;
5311 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5312 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00005313 = "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 +00005314 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
5315 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
5316 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00005317 }
5318 virtual void getTargetDefines(const LangOptions &Opts,
5319 MacroBuilder &Builder) const {
5320 DefineStd(Builder, "SPIR32", Opts);
5321 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005322 };
5323
5324 class SPIR64TargetInfo : public SPIRTargetInfo {
5325 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005326 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005327 PointerWidth = PointerAlign = 64;
5328 SizeType = TargetInfo::UnsignedLong;
5329 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
5330 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00005331 = "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 +00005332 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
5333 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
5334 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00005335 }
5336 virtual void getTargetDefines(const LangOptions &Opts,
5337 MacroBuilder &Builder) const {
5338 DefineStd(Builder, "SPIR64", Opts);
5339 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005340 };
5341}
5342
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005343namespace {
5344class XCoreTargetInfo : public TargetInfo {
5345 static const Builtin::Info BuiltinInfo[];
5346public:
5347 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5348 BigEndian = false;
5349 NoAsmVariants = true;
5350 LongLongAlign = 32;
5351 SuitableAlign = 32;
5352 DoubleAlign = LongDoubleAlign = 32;
5353 UseZeroLengthBitfieldAlignment = true;
5354 DescriptionString = "e-p:32:32:32-a0:0:32-n32"
5355 "-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32"
5356 "-f16:16:32-f32:32:32-f64:32:32";
5357 }
5358 virtual void getTargetDefines(const LangOptions &Opts,
5359 MacroBuilder &Builder) const {
5360 Builder.defineMacro("__XS1B__");
5361 }
5362 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5363 unsigned &NumRecords) const {
5364 Records = BuiltinInfo;
5365 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5366 }
5367 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5368 return TargetInfo::VoidPtrBuiltinVaList;
5369 }
5370 virtual const char *getClobbers() const {
5371 return "";
5372 }
5373 virtual void getGCCRegNames(const char * const *&Names,
5374 unsigned &NumNames) const {
5375 static const char * const GCCRegNames[] = {
5376 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5377 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5378 };
5379 Names = GCCRegNames;
5380 NumNames = llvm::array_lengthof(GCCRegNames);
5381 }
5382 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5383 unsigned &NumAliases) const {
5384 Aliases = NULL;
5385 NumAliases = 0;
5386 }
5387 virtual bool validateAsmConstraint(const char *&Name,
5388 TargetInfo::ConstraintInfo &Info) const {
5389 return false;
5390 }
5391};
5392
5393const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5394#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5395#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5396 ALL_LANGUAGES },
5397#include "clang/Basic/BuiltinsXCore.def"
5398};
5399} // end anonymous namespace.
5400
Ivan Krasinef05abd2011-08-24 20:22:22 +00005401
Reid Spencer5f016e22007-07-11 17:01:13 +00005402//===----------------------------------------------------------------------===//
5403// Driver code
5404//===----------------------------------------------------------------------===//
5405
Benjamin Kramer9df08232013-06-29 16:37:14 +00005406static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005407 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00005408
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005409 switch (Triple.getArch()) {
5410 default:
5411 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00005412
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005413 case llvm::Triple::xcore:
5414 return new XCoreTargetInfo(Triple);
5415
Tony Linthicum96319392011-12-12 21:14:55 +00005416 case llvm::Triple::hexagon:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005417 return new HexagonTargetInfo(Triple);
Tony Linthicum96319392011-12-12 21:14:55 +00005418
Tim Northoverc264e162013-01-31 12:13:10 +00005419 case llvm::Triple::aarch64:
5420 switch (os) {
5421 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005422 return new LinuxTargetInfo<AArch64TargetInfo>(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00005423 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005424 return new AArch64TargetInfo(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00005425 }
5426
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005427 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00005428 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005429 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005430 return new DarwinARMTargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005431
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005432 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00005433 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005434 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005435 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005436 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005437 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005438 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005439 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005440 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00005441 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005442 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00005443 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005444 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005445 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005446 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005447 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005448 return new ARMTargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005449 }
Eli Friedman61538a72008-05-20 14:21:01 +00005450
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005451 case llvm::Triple::msp430:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005452 return new MSP430TargetInfo(Triple);
Eli Friedman61538a72008-05-20 14:21:01 +00005453
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005454 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005455 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005456 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005457 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005458 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005459 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005460 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005461 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005462 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005463 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005464 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005465 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005466 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005467
5468 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005469 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005470 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005471 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005472 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005473 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005474 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005475 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005476 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005477 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicbbac9aa2013-09-21 01:27:01 +00005478 case llvm::Triple::NaCl:
5479 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005480 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005481 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005482 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005483
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005484 case llvm::Triple::mips64:
5485 switch (os) {
5486 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005487 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005488 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005489 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005490 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005491 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005492 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005493 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005494 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005495 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005496 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005497 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005498 }
5499
5500 case llvm::Triple::mips64el:
5501 switch (os) {
5502 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005503 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005504 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005505 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005506 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005507 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005508 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005509 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005510 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005511 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005512 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005513 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005514 }
5515
Ivan Krasinef05abd2011-08-24 20:22:22 +00005516 case llvm::Triple::le32:
5517 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00005518 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005519 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasinef05abd2011-08-24 20:22:22 +00005520 default:
5521 return NULL;
5522 }
5523
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005524 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005525 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005526 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005527 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005528 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005529 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005530 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005531 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005532 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005533 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005534 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005535 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005536 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005537 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005538 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005539 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005540 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005541
5542 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005543 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005544 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005545 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005546 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005547 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005548 case llvm::Triple::Lv2:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005549 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005550 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005551 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005552 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005553 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005554 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005555 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005556 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005557
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00005558 case llvm::Triple::ppc64le:
5559 switch (os) {
5560 case llvm::Triple::Linux:
5561 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5562 default:
5563 return new PPC64TargetInfo(Triple);
5564 }
5565
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005566 case llvm::Triple::nvptx:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005567 return new NVPTX32TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005568 case llvm::Triple::nvptx64:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005569 return new NVPTX64TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005570
Eli Friedman6505a292012-10-12 23:32:00 +00005571 case llvm::Triple::r600:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005572 return new R600TargetInfo(Triple);
Eli Friedman6505a292012-10-12 23:32:00 +00005573
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005574 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005575 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005576 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005577 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005578 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005579 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005580 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005581 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005582 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005583 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005584 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005585 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005586 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005587 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005588 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005589 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005590 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005591
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005592 case llvm::Triple::sparcv9:
5593 switch (os) {
5594 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005595 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005596 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005597 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005598 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005599 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005600 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005601 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005602 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005603 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005604 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005605 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005606 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005607 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005608 }
5609
Ulrich Weigandb8409212013-05-06 16:26:41 +00005610 case llvm::Triple::systemz:
5611 switch (os) {
5612 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005613 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00005614 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005615 return new SystemZTargetInfo(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00005616 }
5617
Eli Friedmanb63decf2009-08-19 20:47:07 +00005618 case llvm::Triple::tce:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005619 return new TCETargetInfo(Triple);
Eli Friedmanb63decf2009-08-19 20:47:07 +00005620
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005621 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005622 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005623 return new DarwinI386TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005624
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005625 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005626 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005627 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005628 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005629 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005630 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005631 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005632 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005633 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005634 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005635 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00005636 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005637 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005638 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005639 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00005640 case llvm::Triple::KFreeBSD:
5641 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner38e317d2010-07-07 16:01:42 +00005642 case llvm::Triple::Minix:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005643 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005644 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005645 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005646 case llvm::Triple::Cygwin:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005647 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005648 case llvm::Triple::MinGW32:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005649 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005650 case llvm::Triple::Win32:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005651 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattner86ed3a32010-04-11 19:29:39 +00005652 case llvm::Triple::Haiku:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005653 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00005654 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005655 return new RTEMSX86_32TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005656 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005657 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005658 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005659 return new X86_32TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005660 }
5661
5662 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005663 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
Benjamin Kramer9df08232013-06-29 16:37:14 +00005664 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005665
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005666 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005667 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005668 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005669 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005670 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner7a7ca282010-01-09 05:41:14 +00005671 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005672 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005673 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005674 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005675 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005676 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00005677 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005678 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005679 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005680 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00005681 case llvm::Triple::KFreeBSD:
5682 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005683 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005684 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00005685 case llvm::Triple::MinGW32:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005686 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005687 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramer9df08232013-06-29 16:37:14 +00005688 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005689 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005690 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005691 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005692 return new X86_64TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005693 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005694
5695 case llvm::Triple::spir: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005696 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00005697 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005698 return NULL;
Benjamin Kramer9df08232013-06-29 16:37:14 +00005699 return new SPIR32TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005700 }
5701 case llvm::Triple::spir64: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005702 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00005703 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005704 return NULL;
Benjamin Kramer9df08232013-06-29 16:37:14 +00005705 return new SPIR64TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005706 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005707 }
Reid Spencer5f016e22007-07-11 17:01:13 +00005708}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005709
5710/// CreateTargetInfo - Return the target info object for the specified target
5711/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00005712TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregor49a87542012-11-16 04:24:59 +00005713 TargetOptions *Opts) {
5714 llvm::Triple Triple(Opts->Triple);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005715
5716 // Construct the target
Benjamin Kramer9df08232013-06-29 16:37:14 +00005717 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005718 if (!Target) {
5719 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5720 return 0;
5721 }
Douglas Gregor9a022bb2012-10-15 16:45:32 +00005722 Target->setTargetOpts(Opts);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005723
Daniel Dunbareac7c532009-12-18 18:42:37 +00005724 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005725 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5726 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbareac7c532009-12-18 18:42:37 +00005727 return 0;
5728 }
5729
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005730 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005731 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5732 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005733 return 0;
5734 }
5735
Charles Davis98b7c5c2010-06-11 01:06:47 +00005736 // Set the target C++ ABI.
Douglas Gregor49a87542012-11-16 04:24:59 +00005737 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5738 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis98b7c5c2010-06-11 01:06:47 +00005739 return 0;
5740 }
5741
Rafael Espindola5389b842013-08-21 21:59:03 +00005742 // Set the fp math unit.
5743 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5744 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5745 return 0;
5746 }
5747
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005748 // Compute the default target features, we need the target to handle this
5749 // because features may have dependencies on one another.
5750 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00005751 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005752
Rafael Espindolac84ed542013-08-20 18:57:55 +00005753 // Apply the user specified deltas.
5754 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5755 I < N; ++I) {
5756 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005757 // Apply the feature via the target.
Rafael Espindolac84ed542013-08-20 18:57:55 +00005758 bool Enabled = Name[0] == '+';
5759 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005760 }
5761
5762 // Add the features to the compile options.
5763 //
5764 // FIXME: If we are completely confident that we have the right set, we only
5765 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00005766 Opts->Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005767 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5768 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00005769 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Rafael Espindola5389b842013-08-21 21:59:03 +00005770 if (!Target->HandleTargetFeatures(Opts->Features, Diags))
5771 return 0;
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005772
5773 return Target.take();
5774}