blob: 09d8be682f98abc381c372d030f8b45abe38e624 [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:
Douglas Gregora3844922009-07-01 15:12:53 +000076 OSTargetInfo(const std::string& 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) {
Benjamin Kramera9992772010-01-09 17:55:51 +000091 Builder.defineMacro("__APPLE_CC__", "5621");
92 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.
Bob Wilson48b68a02012-01-31 23:52:58 +0000142 if (Triple.getOS() == llvm::Triple::IOS) {
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:
182 DarwinTargetInfo(const std::string& triple) :
183 OSTargetInfo<Target>(triple) {
Eric Christopheraa7333c2011-07-02 00:20:22 +0000184 llvm::Triple T = llvm::Triple(triple);
185 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000186 this->MCountName = "\01mcount";
Torok Edwin5f6c1942009-06-30 17:10:35 +0000187 }
188
Chris Lattner5f9e2722011-07-23 10:55:15 +0000189 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000190 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000191 StringRef Segment, Section;
Chris Lattner797c3c42009-08-10 19:03:04 +0000192 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000193 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000194 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000195 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000196 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000197
Anders Carlsson18af3682010-06-08 22:47:50 +0000198 virtual const char *getStaticInitSectionSpecifier() const {
199 // FIXME: We should return 0 when building kexts.
200 return "__TEXT,__StaticInit,regular,pure_instructions";
201 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000202
John McCall41887602012-01-29 01:20:30 +0000203 /// Darwin does not support protected visibility. Darwin's "default"
204 /// is very similar to ELF's "protected"; Darwin requires a "weak"
205 /// attribute on declarations that can be dynamically replaced.
206 virtual bool hasProtectedVisibility() const {
207 return false;
208 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000209};
210
Chris Lattner797c3c42009-08-10 19:03:04 +0000211
Torok Edwin5f6c1942009-06-30 17:10:35 +0000212// DragonFlyBSD Target
213template<typename Target>
214class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
215protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000216 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000217 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000218 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000219 Builder.defineMacro("__DragonFly__");
220 Builder.defineMacro("__DragonFly_cc_version", "100001");
221 Builder.defineMacro("__ELF__");
222 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
223 Builder.defineMacro("__tune_i386__");
224 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000225 }
226public:
Mike Stump1eb44332009-09-09 15:08:12 +0000227 DragonFlyBSDTargetInfo(const std::string &triple)
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000228 : OSTargetInfo<Target>(triple) {
229 this->UserLabelPrefix = "";
230
231 llvm::Triple Triple(triple);
232 switch (Triple.getArch()) {
233 default:
234 case llvm::Triple::x86:
235 case llvm::Triple::x86_64:
236 this->MCountName = ".mcount";
237 break;
238 }
239 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000240};
241
242// FreeBSD Target
243template<typename Target>
244class FreeBSDTargetInfo : public OSTargetInfo<Target> {
245protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000246 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000247 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000248 // FreeBSD defines; list based off of gcc output
249
Benjamin Kramer474202f2011-10-18 10:10:08 +0000250 unsigned Release = Triple.getOSMajorVersion();
251 if (Release == 0U)
252 Release = 8;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000253
Benjamin Kramer474202f2011-10-18 10:10:08 +0000254 Builder.defineMacro("__FreeBSD__", Twine(Release));
255 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramera9992772010-01-09 17:55:51 +0000256 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257 DefineStd(Builder, "unix", Opts);
258 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000259 }
260public:
Mike Stump1eb44332009-09-09 15:08:12 +0000261 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000262 : OSTargetInfo<Target>(triple) {
263 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000264
265 llvm::Triple Triple(triple);
266 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:
276 this->MCountName = "_mcount";
277 break;
278 case llvm::Triple::arm:
279 this->MCountName = "__mcount";
280 break;
281 }
282
Duncan Sands1e90faf2009-07-08 13:55:08 +0000283 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000284};
285
Chris Lattner38e317d2010-07-07 16:01:42 +0000286// Minix Target
287template<typename Target>
288class MinixTargetInfo : public OSTargetInfo<Target> {
289protected:
290 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
291 MacroBuilder &Builder) const {
292 // Minix defines
293
294 Builder.defineMacro("__minix", "3");
295 Builder.defineMacro("_EM_WSIZE", "4");
296 Builder.defineMacro("_EM_PSIZE", "4");
297 Builder.defineMacro("_EM_SSIZE", "2");
298 Builder.defineMacro("_EM_LSIZE", "4");
299 Builder.defineMacro("_EM_FSIZE", "4");
300 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000301 Builder.defineMacro("__ELF__");
Chris Lattner38e317d2010-07-07 16:01:42 +0000302 DefineStd(Builder, "unix", Opts);
303 }
304public:
305 MinixTargetInfo(const std::string &triple)
306 : OSTargetInfo<Target>(triple) {
307 this->UserLabelPrefix = "";
308 }
309};
310
Torok Edwin5f6c1942009-06-30 17:10:35 +0000311// Linux target
312template<typename Target>
313class LinuxTargetInfo : public OSTargetInfo<Target> {
314protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000315 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000316 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000317 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000318 DefineStd(Builder, "unix", Opts);
319 DefineStd(Builder, "linux", Opts);
320 Builder.defineMacro("__gnu_linux__");
321 Builder.defineMacro("__ELF__");
Logan Chien94a71422012-09-02 09:30:11 +0000322 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov32064032012-04-26 12:08:09 +0000323 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000324 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000325 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000326 if (Opts.CPlusPlus)
327 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000328 }
329public:
Mike Stump1eb44332009-09-09 15:08:12 +0000330 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000331 : OSTargetInfo<Target>(triple) {
332 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000333 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000334 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000335
336 virtual const char *getStaticInitSectionSpecifier() const {
337 return ".text.startup";
338 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000339};
340
Chris Lattnerb62bb282009-07-13 20:29:08 +0000341// NetBSD Target
342template<typename Target>
343class NetBSDTargetInfo : public OSTargetInfo<Target> {
344protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000345 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000346 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000347 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000348 Builder.defineMacro("__NetBSD__");
349 Builder.defineMacro("__unix__");
350 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000351 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000352 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000353 }
354public:
Mike Stump1eb44332009-09-09 15:08:12 +0000355 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000356 : OSTargetInfo<Target>(triple) {
357 this->UserLabelPrefix = "";
358 }
359};
360
Torok Edwin5f6c1942009-06-30 17:10:35 +0000361// OpenBSD Target
362template<typename Target>
363class OpenBSDTargetInfo : public OSTargetInfo<Target> {
364protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000365 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000366 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000367 // OpenBSD defines; list based off of gcc output
368
Benjamin Kramera9992772010-01-09 17:55:51 +0000369 Builder.defineMacro("__OpenBSD__");
370 DefineStd(Builder, "unix", Opts);
371 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000372 if (Opts.POSIXThreads)
Chris Lattner4ddcf3b2012-04-25 06:12:24 +0000373 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000374 }
375public:
Mike Stump1eb44332009-09-09 15:08:12 +0000376 OpenBSDTargetInfo(const std::string &triple)
Eli Friedman62d829a2011-12-15 02:15:56 +0000377 : OSTargetInfo<Target>(triple) {
378 this->UserLabelPrefix = "";
Hans Wennborge48667f2012-08-01 18:53:19 +0000379 this->TLSSupported = false;
Eli Friedman62d829a2011-12-15 02:15:56 +0000380
381 llvm::Triple Triple(triple);
382 switch (Triple.getArch()) {
383 default:
384 case llvm::Triple::x86:
385 case llvm::Triple::x86_64:
386 case llvm::Triple::arm:
Eric Christopher825d3862012-11-14 22:08:59 +0000387 case llvm::Triple::sparc:
Eli Friedman62d829a2011-12-15 02:15:56 +0000388 this->MCountName = "__mcount";
389 break;
390 case llvm::Triple::mips64:
391 case llvm::Triple::mips64el:
392 case llvm::Triple::ppc:
Eric Christopher825d3862012-11-14 22:08:59 +0000393 case llvm::Triple::sparcv9:
Eli Friedman62d829a2011-12-15 02:15:56 +0000394 this->MCountName = "_mcount";
395 break;
396 }
397 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000398};
399
Eli Friedman42f74f22012-08-08 23:57:20 +0000400// Bitrig Target
401template<typename Target>
402class BitrigTargetInfo : public OSTargetInfo<Target> {
403protected:
404 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
405 MacroBuilder &Builder) const {
406 // Bitrig defines; list based off of gcc output
407
408 Builder.defineMacro("__Bitrig__");
409 DefineStd(Builder, "unix", Opts);
410 Builder.defineMacro("__ELF__");
411 if (Opts.POSIXThreads)
412 Builder.defineMacro("_REENTRANT");
413 }
414public:
415 BitrigTargetInfo(const std::string &triple)
416 : OSTargetInfo<Target>(triple) {
417 this->UserLabelPrefix = "";
418 this->TLSSupported = false;
419 this->MCountName = "__mcount";
420 }
421};
422
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000423// PSP Target
424template<typename Target>
425class PSPTargetInfo : public OSTargetInfo<Target> {
426protected:
427 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000428 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000429 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000430 Builder.defineMacro("PSP");
431 Builder.defineMacro("_PSP");
432 Builder.defineMacro("__psp__");
433 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000434 }
435public:
436 PSPTargetInfo(const std::string& triple)
437 : OSTargetInfo<Target>(triple) {
438 this->UserLabelPrefix = "";
439 }
440};
441
John Thompson3f6918a2009-11-19 17:18:50 +0000442// PS3 PPU Target
443template<typename Target>
444class PS3PPUTargetInfo : public OSTargetInfo<Target> {
445protected:
446 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000447 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000448 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000449 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000450 Builder.defineMacro("__PPU__");
451 Builder.defineMacro("__CELLOS_LV2__");
452 Builder.defineMacro("__ELF__");
453 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000454 Builder.defineMacro("_ARCH_PPC64");
455 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000456 }
457public:
458 PS3PPUTargetInfo(const std::string& triple)
459 : OSTargetInfo<Target>(triple) {
460 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000461 this->LongWidth = this->LongAlign = 32;
462 this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000463 this->IntMaxType = TargetInfo::SignedLongLong;
464 this->UIntMaxType = TargetInfo::UnsignedLongLong;
465 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000466 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000467 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 +0000468 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000469 }
470};
471
472// FIXME: Need a real SPU target.
473// PS3 SPU Target
474template<typename Target>
475class PS3SPUTargetInfo : public OSTargetInfo<Target> {
476protected:
477 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000478 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000479 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000480 Builder.defineMacro("__SPU__");
481 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000482 }
483public:
484 PS3SPUTargetInfo(const std::string& triple)
485 : OSTargetInfo<Target>(triple) {
486 this->UserLabelPrefix = "";
487 }
488};
489
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000490// AuroraUX target
491template<typename Target>
492class AuroraUXTargetInfo : public OSTargetInfo<Target> {
493protected:
494 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000495 MacroBuilder &Builder) const {
496 DefineStd(Builder, "sun", Opts);
497 DefineStd(Builder, "unix", Opts);
498 Builder.defineMacro("__ELF__");
499 Builder.defineMacro("__svr4__");
500 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000501 }
502public:
503 AuroraUXTargetInfo(const std::string& triple)
504 : OSTargetInfo<Target>(triple) {
505 this->UserLabelPrefix = "";
506 this->WCharType = this->SignedLong;
507 // FIXME: WIntType should be SignedLong
508 }
509};
510
Torok Edwin5f6c1942009-06-30 17:10:35 +0000511// Solaris target
512template<typename Target>
513class SolarisTargetInfo : public OSTargetInfo<Target> {
514protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000515 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000516 MacroBuilder &Builder) const {
517 DefineStd(Builder, "sun", Opts);
518 DefineStd(Builder, "unix", Opts);
519 Builder.defineMacro("__ELF__");
520 Builder.defineMacro("__svr4__");
521 Builder.defineMacro("__SVR4");
David Chisnall165329c2012-02-28 17:10:04 +0000522 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
523 // newer, but to 500 for everything else. feature_test.h has a check to
524 // ensure that you are not using C99 with an old version of X/Open or C89
525 // with a new version.
526 if (Opts.C99 || Opts.C11)
527 Builder.defineMacro("_XOPEN_SOURCE", "600");
528 else
529 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnallb4f0bd62012-03-02 10:49:52 +0000530 if (Opts.CPlusPlus)
David Chisnall165329c2012-02-28 17:10:04 +0000531 Builder.defineMacro("__C99FEATURES__");
David Chisnall48fad492012-02-17 18:35:11 +0000532 Builder.defineMacro("_LARGEFILE_SOURCE");
533 Builder.defineMacro("_LARGEFILE64_SOURCE");
534 Builder.defineMacro("__EXTENSIONS__");
David Chisnall165329c2012-02-28 17:10:04 +0000535 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000536 }
537public:
Mike Stump1eb44332009-09-09 15:08:12 +0000538 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000539 : OSTargetInfo<Target>(triple) {
540 this->UserLabelPrefix = "";
David Chisnallfb027842012-03-28 18:04:14 +0000541 this->WCharType = this->SignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000542 // FIXME: WIntType should be SignedLong
543 }
544};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000545
546// Windows target
547template<typename Target>
548class WindowsTargetInfo : public OSTargetInfo<Target> {
549protected:
550 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
551 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000552 Builder.defineMacro("_WIN32");
553 }
554 void getVisualStudioDefines(const LangOptions &Opts,
555 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000556 if (Opts.CPlusPlus) {
557 if (Opts.RTTI)
558 Builder.defineMacro("_CPPRTTI");
559
560 if (Opts.Exceptions)
561 Builder.defineMacro("_CPPUNWIND");
562 }
563
564 if (!Opts.CharIsSigned)
565 Builder.defineMacro("_CHAR_UNSIGNED");
566
567 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
568 // but it works for now.
569 if (Opts.POSIXThreads)
570 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000571
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000572 if (Opts.MSCVersion != 0)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000573 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000574
Francois Pichet62ec1f22011-09-17 17:15:52 +0000575 if (Opts.MicrosoftExt) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000576 Builder.defineMacro("_MSC_EXTENSIONS");
577
Richard Smith80ad52f2013-01-02 11:42:31 +0000578 if (Opts.CPlusPlus11) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000579 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
580 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
581 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
582 }
583 }
584
585 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000586 }
587
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000588public:
589 WindowsTargetInfo(const std::string &triple)
590 : OSTargetInfo<Target>(triple) {}
591};
592
Derek Schuff7da46f92012-10-11 16:55:58 +0000593template <typename Target>
594class NaClTargetInfo : public OSTargetInfo<Target> {
595 protected:
596 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
597 MacroBuilder &Builder) const {
598 if (Opts.POSIXThreads)
599 Builder.defineMacro("_REENTRANT");
600 if (Opts.CPlusPlus)
601 Builder.defineMacro("_GNU_SOURCE");
602
603 DefineStd(Builder, "unix", Opts);
604 Builder.defineMacro("__ELF__");
605 Builder.defineMacro("__native_client__");
606 }
607 public:
608 NaClTargetInfo(const std::string &triple)
609 : OSTargetInfo<Target>(triple) {
610 this->UserLabelPrefix = "";
611 this->LongAlign = 32;
612 this->LongWidth = 32;
613 this->PointerAlign = 32;
614 this->PointerWidth = 32;
615 this->IntMaxType = TargetInfo::SignedLongLong;
616 this->UIntMaxType = TargetInfo::UnsignedLongLong;
617 this->Int64Type = TargetInfo::SignedLongLong;
618 this->DoubleAlign = 64;
619 this->LongDoubleWidth = 64;
620 this->LongDoubleAlign = 64;
621 this->SizeType = TargetInfo::UnsignedInt;
622 this->PtrDiffType = TargetInfo::SignedInt;
623 this->IntPtrType = TargetInfo::SignedInt;
624 this->RegParmMax = 2;
625 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
626 this->DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
627 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
628 }
Derek Schuff263366f2012-10-16 22:30:41 +0000629 virtual typename Target::CallingConvCheckResult checkCallingConvention(
630 CallingConv CC) const {
631 return CC == CC_PnaclCall ? Target::CCCR_OK :
632 Target::checkCallingConvention(CC);
633 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000634};
Mike Stump1eb44332009-09-09 15:08:12 +0000635} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000636
Chris Lattnerd29b6302008-10-05 21:50:58 +0000637//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000638// Specific target implementations.
639//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000640
Eli Friedmane4277982008-08-20 23:11:40 +0000641namespace {
642// PPC abstract base class
643class PPCTargetInfo : public TargetInfo {
644 static const Builtin::Info BuiltinInfo[];
645 static const char * const GCCRegNames[];
646 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel02a84272012-06-11 22:35:19 +0000647 std::string CPU;
Eli Friedmane4277982008-08-20 23:11:40 +0000648public:
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000649 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
650 LongDoubleWidth = LongDoubleAlign = 128;
651 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
652 }
Eli Friedman15b91762009-06-05 07:05:05 +0000653
Hal Finkel39d5fa12012-07-03 16:51:04 +0000654 /// \brief Flags for architecture specific defines.
655 typedef enum {
656 ArchDefineNone = 0,
657 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
658 ArchDefinePpcgr = 1 << 1,
659 ArchDefinePpcsq = 1 << 2,
660 ArchDefine440 = 1 << 3,
661 ArchDefine603 = 1 << 4,
662 ArchDefine604 = 1 << 5,
663 ArchDefinePwr4 = 1 << 6,
Bill Schmidt2821e182013-02-01 20:23:10 +0000664 ArchDefinePwr5 = 1 << 7,
665 ArchDefinePwr5x = 1 << 8,
666 ArchDefinePwr6 = 1 << 9,
667 ArchDefinePwr6x = 1 << 10,
668 ArchDefinePwr7 = 1 << 11,
669 ArchDefineA2 = 1 << 12,
670 ArchDefineA2q = 1 << 13
Hal Finkel39d5fa12012-07-03 16:51:04 +0000671 } ArchDefineTypes;
672
Bill Schmidt2821e182013-02-01 20:23:10 +0000673 // Note: GCC recognizes the following additional cpus:
674 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
675 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
676 // titan, rs64.
Hal Finkel02a84272012-06-11 22:35:19 +0000677 virtual bool setCPU(const std::string &Name) {
678 bool CPUKnown = llvm::StringSwitch<bool>(Name)
679 .Case("generic", true)
680 .Case("440", true)
681 .Case("450", true)
682 .Case("601", true)
683 .Case("602", true)
684 .Case("603", true)
685 .Case("603e", true)
686 .Case("603ev", true)
687 .Case("604", true)
688 .Case("604e", true)
689 .Case("620", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000690 .Case("630", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000691 .Case("g3", true)
692 .Case("7400", true)
693 .Case("g4", true)
694 .Case("7450", true)
695 .Case("g4+", true)
696 .Case("750", true)
697 .Case("970", true)
698 .Case("g5", true)
699 .Case("a2", true)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000700 .Case("a2q", true)
Hal Finkel7de32962012-09-18 22:25:03 +0000701 .Case("e500mc", true)
702 .Case("e5500", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000703 .Case("power3", true)
704 .Case("pwr3", true)
705 .Case("power4", true)
706 .Case("pwr4", true)
707 .Case("power5", true)
708 .Case("pwr5", true)
709 .Case("power5x", true)
710 .Case("pwr5x", true)
711 .Case("power6", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000712 .Case("pwr6", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000713 .Case("power6x", true)
714 .Case("pwr6x", true)
715 .Case("power7", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000716 .Case("pwr7", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000717 .Case("powerpc", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000718 .Case("ppc", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000719 .Case("powerpc64", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000720 .Case("ppc64", true)
721 .Default(false);
722
723 if (CPUKnown)
724 CPU = Name;
725
726 return CPUKnown;
727 }
728
Eli Friedmane4277982008-08-20 23:11:40 +0000729 virtual void getTargetBuiltins(const Builtin::Info *&Records,
730 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000731 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000732 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000733 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000734
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000735 virtual bool isCLZForZeroUndef() const { return false; }
736
Chris Lattner33328642009-03-20 15:52:06 +0000737 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000738 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000739
Bill Schmidt199402b2013-02-01 02:14:03 +0000740 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
741
742 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
743 StringRef Name,
744 bool Enabled) const;
745
Douglas Gregore727d212012-01-30 06:38:25 +0000746 virtual bool hasFeature(StringRef Feature) const;
747
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000748 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000749 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000750 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000751 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000752 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000753 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000754 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000755 default: return false;
756 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000757 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000758 case 'b': // Base register
759 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000760 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000761 break;
762 // FIXME: The following are added to allow parsing.
763 // I just took a guess at what the actions should be.
764 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000765 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000766 case 'v': // Altivec vector register
767 Info.setAllowsRegister();
768 break;
769 case 'w':
770 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000771 case 'd':// VSX vector register to hold vector double data
772 case 'f':// VSX vector register to hold vector float data
773 case 's':// VSX vector register to hold scalar float data
774 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000775 break;
776 default:
777 return false;
778 }
779 Info.setAllowsRegister();
780 Name++; // Skip over 'w'.
781 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000782 case 'h': // `MQ', `CTR', or `LINK' register
783 case 'q': // `MQ' register
784 case 'c': // `CTR' register
785 case 'l': // `LINK' register
786 case 'x': // `CR' register (condition register) number 0
787 case 'y': // `CR' register (condition register)
788 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000789 Info.setAllowsRegister();
790 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000791 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000792 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000793 // (use `L' instead for SImode constants)
794 case 'K': // Unsigned 16-bit constant
795 case 'L': // Signed 16-bit constant shifted left 16 bits
796 case 'M': // Constant larger than 31
797 case 'N': // Exact power of 2
798 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000799 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000800 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000801 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000802 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000803 break;
804 case 'm': // Memory operand. Note that on PowerPC targets, m can
805 // include addresses that update the base register. It
806 // is therefore only safe to use `m' in an asm statement
807 // if that asm statement accesses the operand exactly once.
808 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000809 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000810 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000811 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000812 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000813 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
814 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000815 // register to be updated.
816 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000817 if (Name[1] != 's')
818 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000819 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000820 // include any automodification of the base register. Unlike
821 // `m', this constraint can be used in asm statements that
822 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000823 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000824 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000825 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000826 break;
827 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000828 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000829 case 'Z': // Memory operand that is an indexed or indirect from a
830 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000831 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000832 Info.setAllowsMemory();
833 Info.setAllowsRegister();
834 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000835 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000836 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000837 // register (`p' is preferable for asm statements)
838 case 'S': // Constant suitable as a 64-bit mask operand
839 case 'T': // Constant suitable as a 32-bit mask operand
840 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000841 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000842 // instructions
843 case 'W': // Vector constant that does not require memory
844 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000845 break;
846 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000847 }
John Thompson8e6065a2010-06-24 22:44:13 +0000848 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000849 }
Eli Friedmane4277982008-08-20 23:11:40 +0000850 virtual const char *getClobbers() const {
851 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000852 }
Adhemerval Zanellab0fc94c2013-01-22 20:02:45 +0000853 int getEHDataRegisterNumber(unsigned RegNo) const {
854 if (RegNo == 0) return 3;
855 if (RegNo == 1) return 4;
856 return -1;
857 }
Eli Friedmane4277982008-08-20 23:11:40 +0000858};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000859
Eli Friedmane4277982008-08-20 23:11:40 +0000860const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000861#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000862#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000863 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000864#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000865};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000866
867
Chris Lattnerc0f59212009-03-02 22:27:17 +0000868/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
869/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000870void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000871 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000872 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000873 Builder.defineMacro("__ppc__");
874 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000875 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000876 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000877 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000878 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnere03ae302010-02-16 18:14:57 +0000879 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000880 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000881 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000882 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000883 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000884
Chris Lattnerc0f59212009-03-02 22:27:17 +0000885 // Target properties.
Hans Wennborg5e601dc2012-08-02 13:45:48 +0000886 if (getTriple().getOS() != llvm::Triple::NetBSD &&
887 getTriple().getOS() != llvm::Triple::OpenBSD)
Joerg Sonnenberger7cd1de52011-07-05 14:56:12 +0000888 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramera9992772010-01-09 17:55:51 +0000889 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000890
Chris Lattnerc0f59212009-03-02 22:27:17 +0000891 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000892 Builder.defineMacro("__NATURAL_ALIGNMENT__");
893 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000894
Chris Lattnerc0f59212009-03-02 22:27:17 +0000895 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000896 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000897
John Thompson3f6918a2009-11-19 17:18:50 +0000898 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000899 Builder.defineMacro("__VEC__", "10206");
900 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000901 }
Hal Finkel02a84272012-06-11 22:35:19 +0000902
903 // CPU identification.
Hal Finkel39d5fa12012-07-03 16:51:04 +0000904 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
905 .Case("440", ArchDefineName)
906 .Case("450", ArchDefineName | ArchDefine440)
907 .Case("601", ArchDefineName)
908 .Case("602", ArchDefineName | ArchDefinePpcgr)
909 .Case("603", ArchDefineName | ArchDefinePpcgr)
910 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
911 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
912 .Case("604", ArchDefineName | ArchDefinePpcgr)
913 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
914 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt2821e182013-02-01 20:23:10 +0000915 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000916 .Case("7400", ArchDefineName | ArchDefinePpcgr)
917 .Case("7450", ArchDefineName | ArchDefinePpcgr)
918 .Case("750", ArchDefineName | ArchDefinePpcgr)
919 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
920 | ArchDefinePpcsq)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000921 .Case("a2", ArchDefineA2)
922 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt2821e182013-02-01 20:23:10 +0000923 .Case("pwr3", ArchDefinePpcgr)
924 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
925 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
926 | ArchDefinePpcsq)
927 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
928 | ArchDefinePpcgr | ArchDefinePpcsq)
929 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
930 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
931 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
932 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
933 | ArchDefinePpcsq)
934 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
935 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
936 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
937 .Case("power3", ArchDefinePpcgr)
938 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
939 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
940 | ArchDefinePpcsq)
941 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
942 | ArchDefinePpcgr | ArchDefinePpcsq)
943 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
944 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
945 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
946 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
947 | ArchDefinePpcsq)
948 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
949 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
950 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000951 .Default(ArchDefineNone);
952
953 if (defs & ArchDefineName)
954 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
955 if (defs & ArchDefinePpcgr)
956 Builder.defineMacro("_ARCH_PPCGR");
957 if (defs & ArchDefinePpcsq)
958 Builder.defineMacro("_ARCH_PPCSQ");
959 if (defs & ArchDefine440)
Hal Finkel02a84272012-06-11 22:35:19 +0000960 Builder.defineMacro("_ARCH_440");
Hal Finkel39d5fa12012-07-03 16:51:04 +0000961 if (defs & ArchDefine603)
962 Builder.defineMacro("_ARCH_603");
963 if (defs & ArchDefine604)
964 Builder.defineMacro("_ARCH_604");
Bill Schmidt2821e182013-02-01 20:23:10 +0000965 if (defs & ArchDefinePwr4)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000966 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt2821e182013-02-01 20:23:10 +0000967 if (defs & ArchDefinePwr5)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000968 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt2821e182013-02-01 20:23:10 +0000969 if (defs & ArchDefinePwr5x)
970 Builder.defineMacro("_ARCH_PWR5X");
971 if (defs & ArchDefinePwr6)
Hal Finkel02a84272012-06-11 22:35:19 +0000972 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt2821e182013-02-01 20:23:10 +0000973 if (defs & ArchDefinePwr6x)
974 Builder.defineMacro("_ARCH_PWR6X");
975 if (defs & ArchDefinePwr7)
976 Builder.defineMacro("_ARCH_PWR7");
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000977 if (defs & ArchDefineA2)
978 Builder.defineMacro("_ARCH_A2");
979 if (defs & ArchDefineA2q) {
980 Builder.defineMacro("_ARCH_A2Q");
981 Builder.defineMacro("_ARCH_QP");
982 }
983
984 if (getTriple().getVendor() == llvm::Triple::BGQ) {
985 Builder.defineMacro("__bg__");
986 Builder.defineMacro("__THW_BLUEGENE__");
987 Builder.defineMacro("__bgq__");
988 Builder.defineMacro("__TOS_BGQ__");
989 }
Bill Schmidt2821e182013-02-01 20:23:10 +0000990
991 // FIXME: The following are not yet generated here by Clang, but are
992 // generated by GCC:
993 //
994 // _SOFT_FLOAT_
995 // __RECIP_PRECISION__
996 // __APPLE_ALTIVEC__
997 // __VSX__
998 // __RECIP__
999 // __RECIPF__
1000 // __RSQRTE__
1001 // __RSQRTEF__
1002 // _SOFT_DOUBLE_
1003 // __NO_LWSYNC__
1004 // __HAVE_BSWAP__
1005 // __LONGDOUBLE128
1006 // __CMODEL_MEDIUM__
1007 // __CMODEL_LARGE__
1008 // _CALL_SYSV
1009 // _CALL_DARWIN
1010 // __NO_FPRS__
Bill Schmidt199402b2013-02-01 02:14:03 +00001011}
1012
1013void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1014 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1015 .Case("7400", true)
1016 .Case("g4", true)
1017 .Case("7450", true)
1018 .Case("g4+", true)
1019 .Case("970", true)
1020 .Case("g5", true)
1021 .Case("pwr6", true)
1022 .Case("pwr7", true)
1023 .Case("ppc64", true)
1024 .Default(false);
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001025
1026 Features["qpx"] = (CPU == "a2q");
Bill Schmidt199402b2013-02-01 02:14:03 +00001027}
1028
1029bool PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1030 StringRef Name,
1031 bool Enabled) const {
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001032 if (Name == "altivec" || Name == "qpx") {
Bill Schmidt199402b2013-02-01 02:14:03 +00001033 Features[Name] = Enabled;
1034 return true;
Hal Finkel02a84272012-06-11 22:35:19 +00001035 }
Bill Schmidt199402b2013-02-01 02:14:03 +00001036
1037 return false;
Chris Lattnerc0f59212009-03-02 22:27:17 +00001038}
1039
Douglas Gregore727d212012-01-30 06:38:25 +00001040bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1041 return Feature == "powerpc";
1042}
Chris Lattner393ff042008-04-21 18:56:49 +00001043
Douglas Gregore727d212012-01-30 06:38:25 +00001044
Eli Friedmane4277982008-08-20 23:11:40 +00001045const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +00001046 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1047 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1048 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1049 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1050 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1051 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1052 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1053 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +00001054 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +00001055 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +00001056 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +00001057 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1058 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1059 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1060 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +00001061 "vrsave", "vscr",
1062 "spe_acc", "spefscr",
1063 "sfp"
1064};
Reid Spencer5f016e22007-07-11 17:01:13 +00001065
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001066void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +00001067 unsigned &NumNames) const {
1068 Names = GCCRegNames;
1069 NumNames = llvm::array_lengthof(GCCRegNames);
1070}
Reid Spencer5f016e22007-07-11 17:01:13 +00001071
Eli Friedmane4277982008-08-20 23:11:40 +00001072const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1073 // While some of these aliases do map to different registers
1074 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001075 { { "0" }, "r0" },
1076 { { "1"}, "r1" },
1077 { { "2" }, "r2" },
1078 { { "3" }, "r3" },
1079 { { "4" }, "r4" },
1080 { { "5" }, "r5" },
1081 { { "6" }, "r6" },
1082 { { "7" }, "r7" },
1083 { { "8" }, "r8" },
1084 { { "9" }, "r9" },
1085 { { "10" }, "r10" },
1086 { { "11" }, "r11" },
1087 { { "12" }, "r12" },
1088 { { "13" }, "r13" },
1089 { { "14" }, "r14" },
1090 { { "15" }, "r15" },
1091 { { "16" }, "r16" },
1092 { { "17" }, "r17" },
1093 { { "18" }, "r18" },
1094 { { "19" }, "r19" },
1095 { { "20" }, "r20" },
1096 { { "21" }, "r21" },
1097 { { "22" }, "r22" },
1098 { { "23" }, "r23" },
1099 { { "24" }, "r24" },
1100 { { "25" }, "r25" },
1101 { { "26" }, "r26" },
1102 { { "27" }, "r27" },
1103 { { "28" }, "r28" },
1104 { { "29" }, "r29" },
1105 { { "30" }, "r30" },
1106 { { "31" }, "r31" },
1107 { { "fr0" }, "f0" },
1108 { { "fr1" }, "f1" },
1109 { { "fr2" }, "f2" },
1110 { { "fr3" }, "f3" },
1111 { { "fr4" }, "f4" },
1112 { { "fr5" }, "f5" },
1113 { { "fr6" }, "f6" },
1114 { { "fr7" }, "f7" },
1115 { { "fr8" }, "f8" },
1116 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +00001117 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001118 { { "fr11" }, "f11" },
1119 { { "fr12" }, "f12" },
1120 { { "fr13" }, "f13" },
1121 { { "fr14" }, "f14" },
1122 { { "fr15" }, "f15" },
1123 { { "fr16" }, "f16" },
1124 { { "fr17" }, "f17" },
1125 { { "fr18" }, "f18" },
1126 { { "fr19" }, "f19" },
1127 { { "fr20" }, "f20" },
1128 { { "fr21" }, "f21" },
1129 { { "fr22" }, "f22" },
1130 { { "fr23" }, "f23" },
1131 { { "fr24" }, "f24" },
1132 { { "fr25" }, "f25" },
1133 { { "fr26" }, "f26" },
1134 { { "fr27" }, "f27" },
1135 { { "fr28" }, "f28" },
1136 { { "fr29" }, "f29" },
1137 { { "fr30" }, "f30" },
1138 { { "fr31" }, "f31" },
1139 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +00001140};
1141
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001142void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +00001143 unsigned &NumAliases) const {
1144 Aliases = GCCRegAliases;
1145 NumAliases = llvm::array_lengthof(GCCRegAliases);
1146}
1147} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00001148
1149namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001150class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001151public:
Chris Lattnere03ae302010-02-16 18:14:57 +00001152 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001153 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 +00001154 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +00001155
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001156 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +00001157 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001158 case llvm::Triple::FreeBSD:
1159 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001160 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +00001161 PtrDiffType = SignedInt;
1162 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001163 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +00001164 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001165 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001166 }
Roman Divackye3d175d2012-03-13 16:53:54 +00001167
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001168 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1169 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001170 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001171 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001172
1173 // PPC32 supports atomics up to 4 bytes.
1174 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001175 }
1176
Meador Ingec5613b22012-06-16 03:34:49 +00001177 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001178 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Ingec5613b22012-06-16 03:34:49 +00001179 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001180 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001181};
1182} // end anonymous namespace.
1183
1184namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001185class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001186public:
Eli Friedmane4277982008-08-20 23:11:40 +00001187 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001188 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001189 IntMaxType = SignedLong;
1190 UIntMaxType = UnsignedLong;
1191 Int64Type = SignedLong;
Roman Divackye3d175d2012-03-13 16:53:54 +00001192
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001193 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1194 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001195 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001196 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1197 "i64:64:64-f32:32:32-f64:64:64-f128:64:64-"
1198 "v128:128:128-n32:64";
1199 } else
1200 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1201 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
1202 "v128:128:128-n32:64";
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001203
1204 // PPC64 supports atomics up to 8 bytes.
1205 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerf291b102008-05-09 06:17:04 +00001206 }
Meador Ingec5613b22012-06-16 03:34:49 +00001207 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1208 return TargetInfo::CharPtrBuiltinVaList;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001209 }
Eli Friedmane4277982008-08-20 23:11:40 +00001210};
1211} // end anonymous namespace.
1212
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001213
1214namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001215class DarwinPPC32TargetInfo :
1216 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001217public:
Roman Divackyc81f2a22011-01-06 08:27:10 +00001218 DarwinPPC32TargetInfo(const std::string& triple)
1219 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001220 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001221 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001222 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001223 SuitableAlign = 128;
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001224 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1225 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +00001226 }
Meador Ingec5613b22012-06-16 03:34:49 +00001227 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1228 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001229 }
1230};
1231
1232class DarwinPPC64TargetInfo :
1233 public DarwinTargetInfo<PPC64TargetInfo> {
1234public:
1235 DarwinPPC64TargetInfo(const std::string& triple)
1236 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
1237 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001238 SuitableAlign = 128;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001239 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1240 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001241 }
1242};
1243} // end anonymous namespace.
1244
Reid Spencer5f016e22007-07-11 17:01:13 +00001245namespace {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001246 static const unsigned NVPTXAddrSpaceMap[] = {
1247 1, // opencl_global
1248 3, // opencl_local
1249 4, // opencl_constant
1250 1, // cuda_device
1251 4, // cuda_constant
1252 3, // cuda_shared
1253 };
1254 class NVPTXTargetInfo : public TargetInfo {
1255 static const char * const GCCRegNames[];
Justin Holewinski2c585b92012-05-24 17:43:12 +00001256 static const Builtin::Info BuiltinInfo[];
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00001257 std::vector<StringRef> AvailableFeatures;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001258 public:
1259 NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
1260 BigEndian = false;
1261 TLSSupported = false;
1262 LongWidth = LongAlign = 64;
1263 AddrSpaceMap = &NVPTXAddrSpaceMap;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001264 // Define available target features
1265 // These must be defined in sorted order!
Justin Holewinski9903e942012-07-11 15:34:55 +00001266 NoAsmVariants = true;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001267 }
1268 virtual void getTargetDefines(const LangOptions &Opts,
1269 MacroBuilder &Builder) const {
1270 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001271 Builder.defineMacro("__NVPTX__");
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001272 }
1273 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1274 unsigned &NumRecords) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001275 Records = BuiltinInfo;
1276 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001277 }
1278 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001279 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001280 }
1281
1282 virtual void getGCCRegNames(const char * const *&Names,
1283 unsigned &NumNames) const;
1284 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1285 unsigned &NumAliases) const {
1286 // No aliases.
1287 Aliases = 0;
1288 NumAliases = 0;
1289 }
1290 virtual bool validateAsmConstraint(const char *&Name,
1291 TargetInfo::ConstraintInfo &info) const {
1292 // FIXME: implement
1293 return true;
1294 }
1295 virtual const char *getClobbers() const {
1296 // FIXME: Is this really right?
1297 return "";
1298 }
Meador Ingec5613b22012-06-16 03:34:49 +00001299 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001300 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00001301 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001302 }
1303 virtual bool setCPU(const std::string &Name) {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001304 return Name == "sm_10" || Name == "sm_13" || Name == "sm_20";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001305 }
Justin Holewinski2c585b92012-05-24 17:43:12 +00001306 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1307 StringRef Name,
1308 bool Enabled) const;
1309 };
1310
1311 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1312#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1313#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1314 ALL_LANGUAGES },
1315#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001316 };
1317
1318 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1319 "r0"
1320 };
1321
1322 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1323 unsigned &NumNames) const {
1324 Names = GCCRegNames;
1325 NumNames = llvm::array_lengthof(GCCRegNames);
1326 }
1327
Justin Holewinski2c585b92012-05-24 17:43:12 +00001328 bool NVPTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1329 StringRef Name,
1330 bool Enabled) const {
1331 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1332 Name)) {
1333 Features[Name] = Enabled;
1334 return true;
1335 } else {
1336 return false;
1337 }
1338 }
1339
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001340 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1341 public:
Justin Holewinski2c585b92012-05-24 17:43:12 +00001342 NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001343 PointerWidth = PointerAlign = 32;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001344 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001345 DescriptionString
1346 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1347 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1348 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001349 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001350 };
1351
1352 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1353 public:
Justin Holewinski2c585b92012-05-24 17:43:12 +00001354 NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001355 PointerWidth = PointerAlign = 64;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001356 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001357 DescriptionString
1358 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1359 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1360 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001361 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001362 };
1363}
1364
1365namespace {
Eli Friedman6505a292012-10-12 23:32:00 +00001366
1367static const unsigned R600AddrSpaceMap[] = {
1368 1, // opencl_global
1369 3, // opencl_local
1370 2, // opencl_constant
1371 1, // cuda_device
1372 2, // cuda_constant
1373 3 // cuda_shared
1374};
1375
Tom Stellardfd075912013-03-04 17:40:53 +00001376static const char *DescriptionStringR600 =
1377 "e"
1378 "-p:32:32:32"
1379 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32"
1380 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1381 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1382 "-n32:64";
1383
1384static const char *DescriptionStringR600DoubleOps =
1385 "e"
1386 "-p:32:32:32"
1387 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1388 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1389 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1390 "-n32:64";
1391
1392static const char *DescriptionStringSI =
1393 "e"
1394 "-p:64:64:64"
1395 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1396 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1397 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1398 "-n32:64";
1399
Eli Friedman6505a292012-10-12 23:32:00 +00001400class R600TargetInfo : public TargetInfo {
Tom Stellardfd075912013-03-04 17:40:53 +00001401 /// \brief The GPU profiles supported by the R600 target.
1402 enum GPUKind {
1403 GK_NONE,
1404 GK_R600,
1405 GK_R600_DOUBLE_OPS,
1406 GK_R700,
1407 GK_R700_DOUBLE_OPS,
1408 GK_EVERGREEN,
1409 GK_EVERGREEN_DOUBLE_OPS,
1410 GK_NORTHERN_ISLANDS,
1411 GK_CAYMAN,
1412 GK_SOUTHERN_ISLANDS
1413 } GPU;
1414
Eli Friedman6505a292012-10-12 23:32:00 +00001415public:
Tom Stellardfd075912013-03-04 17:40:53 +00001416 R600TargetInfo(const std::string& triple)
1417 : TargetInfo(triple),
1418 GPU(GK_R600) {
1419 DescriptionString = DescriptionStringR600;
Eli Friedman6505a292012-10-12 23:32:00 +00001420 AddrSpaceMap = &R600AddrSpaceMap;
1421 }
1422
1423 virtual const char * getClobbers() const {
1424 return "";
1425 }
1426
1427 virtual void getGCCRegNames(const char * const *&Names,
1428 unsigned &numNames) const {
1429 Names = NULL;
1430 numNames = 0;
1431 }
1432
1433 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1434 unsigned &NumAliases) const {
1435 Aliases = NULL;
1436 NumAliases = 0;
1437 }
1438
1439 virtual bool validateAsmConstraint(const char *&Name,
1440 TargetInfo::ConstraintInfo &info) const {
1441 return true;
1442 }
1443
1444 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1445 unsigned &NumRecords) const {
1446 Records = NULL;
1447 NumRecords = 0;
1448 }
1449
1450
1451 virtual void getTargetDefines(const LangOptions &Opts,
1452 MacroBuilder &Builder) const {
1453 Builder.defineMacro("__R600__");
1454 }
1455
1456 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1457 return TargetInfo::CharPtrBuiltinVaList;
1458 }
1459
Tom Stellardfd075912013-03-04 17:40:53 +00001460 virtual bool setCPU(const std::string &Name) {
1461 GPU = llvm::StringSwitch<GPUKind>(Name)
1462 .Case("r600" , GK_R600)
1463 .Case("rv610", GK_R600)
1464 .Case("rv620", GK_R600)
1465 .Case("rv630", GK_R600)
1466 .Case("rv635", GK_R600)
1467 .Case("rs780", GK_R600)
1468 .Case("rs880", GK_R600)
1469 .Case("rv670", GK_R600_DOUBLE_OPS)
1470 .Case("rv710", GK_R700)
1471 .Case("rv730", GK_R700)
1472 .Case("rv740", GK_R700_DOUBLE_OPS)
1473 .Case("rv770", GK_R700_DOUBLE_OPS)
1474 .Case("palm", GK_EVERGREEN)
1475 .Case("cedar", GK_EVERGREEN)
1476 .Case("sumo", GK_EVERGREEN)
1477 .Case("sumo2", GK_EVERGREEN)
1478 .Case("redwood", GK_EVERGREEN)
1479 .Case("juniper", GK_EVERGREEN)
1480 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1481 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1482 .Case("barts", GK_NORTHERN_ISLANDS)
1483 .Case("turks", GK_NORTHERN_ISLANDS)
1484 .Case("caicos", GK_NORTHERN_ISLANDS)
1485 .Case("cayman", GK_CAYMAN)
1486 .Case("aruba", GK_CAYMAN)
1487 .Case("SI", GK_SOUTHERN_ISLANDS)
1488 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1489 .Case("verde", GK_SOUTHERN_ISLANDS)
1490 .Case("oland", GK_SOUTHERN_ISLANDS)
1491 .Default(GK_NONE);
1492
1493 if (GPU == GK_NONE) {
1494 return false;
1495 }
1496
1497 // Set the correct data layout
1498 switch (GPU) {
1499 case GK_NONE:
1500 case GK_R600:
1501 case GK_R700:
1502 case GK_EVERGREEN:
1503 case GK_NORTHERN_ISLANDS:
1504 DescriptionString = DescriptionStringR600;
1505 break;
1506 case GK_R600_DOUBLE_OPS:
1507 case GK_R700_DOUBLE_OPS:
1508 case GK_EVERGREEN_DOUBLE_OPS:
1509 case GK_CAYMAN:
1510 DescriptionString = DescriptionStringR600DoubleOps;
1511 break;
1512 case GK_SOUTHERN_ISLANDS:
1513 DescriptionString = DescriptionStringSI;
1514 break;
1515 }
1516
1517 return true;
1518 }
Eli Friedman6505a292012-10-12 23:32:00 +00001519};
1520
1521} // end anonymous namespace
1522
1523namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +00001524// MBlaze abstract base class
1525class MBlazeTargetInfo : public TargetInfo {
1526 static const char * const GCCRegNames[];
1527 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1528
1529public:
1530 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +00001531 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +00001532 }
1533
1534 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1535 unsigned &NumRecords) const {
1536 // FIXME: Implement.
1537 Records = 0;
1538 NumRecords = 0;
1539 }
1540
1541 virtual void getTargetDefines(const LangOptions &Opts,
1542 MacroBuilder &Builder) const;
1543
Douglas Gregore727d212012-01-30 06:38:25 +00001544 virtual bool hasFeature(StringRef Feature) const {
1545 return Feature == "mblaze";
1546 }
1547
Meador Ingec5613b22012-06-16 03:34:49 +00001548 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1549 return TargetInfo::CharPtrBuiltinVaList;
Chris Lattner9cbeb632010-03-06 21:21:27 +00001550 }
1551 virtual const char *getTargetPrefix() const {
1552 return "mblaze";
1553 }
1554 virtual void getGCCRegNames(const char * const *&Names,
1555 unsigned &NumNames) const;
1556 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1557 unsigned &NumAliases) const;
1558 virtual bool validateAsmConstraint(const char *&Name,
1559 TargetInfo::ConstraintInfo &Info) const {
1560 switch (*Name) {
1561 default: return false;
1562 case 'O': // Zero
1563 return true;
1564 case 'b': // Base register
1565 case 'f': // Floating point register
1566 Info.setAllowsRegister();
1567 return true;
1568 }
1569 }
1570 virtual const char *getClobbers() const {
1571 return "";
1572 }
1573};
1574
1575/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1576/// #defines that are not tied to a specific subtarget.
1577void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1578 MacroBuilder &Builder) const {
1579 // Target identification.
1580 Builder.defineMacro("__microblaze__");
1581 Builder.defineMacro("_ARCH_MICROBLAZE");
1582 Builder.defineMacro("__MICROBLAZE__");
1583
1584 // Target properties.
1585 Builder.defineMacro("_BIG_ENDIAN");
1586 Builder.defineMacro("__BIG_ENDIAN__");
1587
1588 // Subtarget options.
1589 Builder.defineMacro("__REGISTER_PREFIX__", "");
1590}
1591
1592
1593const char * const MBlazeTargetInfo::GCCRegNames[] = {
1594 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1595 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1596 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1597 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1598 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1599 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1600 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1601 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1602 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1603 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1604};
1605
1606void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1607 unsigned &NumNames) const {
1608 Names = GCCRegNames;
1609 NumNames = llvm::array_lengthof(GCCRegNames);
1610}
1611
1612const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1613 { {"f0"}, "r0" },
1614 { {"f1"}, "r1" },
1615 { {"f2"}, "r2" },
1616 { {"f3"}, "r3" },
1617 { {"f4"}, "r4" },
1618 { {"f5"}, "r5" },
1619 { {"f6"}, "r6" },
1620 { {"f7"}, "r7" },
1621 { {"f8"}, "r8" },
1622 { {"f9"}, "r9" },
1623 { {"f10"}, "r10" },
1624 { {"f11"}, "r11" },
1625 { {"f12"}, "r12" },
1626 { {"f13"}, "r13" },
1627 { {"f14"}, "r14" },
1628 { {"f15"}, "r15" },
1629 { {"f16"}, "r16" },
1630 { {"f17"}, "r17" },
1631 { {"f18"}, "r18" },
1632 { {"f19"}, "r19" },
1633 { {"f20"}, "r20" },
1634 { {"f21"}, "r21" },
1635 { {"f22"}, "r22" },
1636 { {"f23"}, "r23" },
1637 { {"f24"}, "r24" },
1638 { {"f25"}, "r25" },
1639 { {"f26"}, "r26" },
1640 { {"f27"}, "r27" },
1641 { {"f28"}, "r28" },
1642 { {"f29"}, "r29" },
1643 { {"f30"}, "r30" },
1644 { {"f31"}, "r31" },
1645};
1646
1647void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1648 unsigned &NumAliases) const {
1649 Aliases = GCCRegAliases;
1650 NumAliases = llvm::array_lengthof(GCCRegAliases);
1651}
1652} // end anonymous namespace.
1653
1654namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001655// Namespace for x86 abstract base class
1656const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001657#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001658#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001659 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001660#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001661};
Eli Friedman61538a72008-05-20 14:21:01 +00001662
Nuno Lopes2550d702009-12-23 17:49:57 +00001663static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001664 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1665 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001666 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001667 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1668 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1669 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001670 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001671 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1672 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001673};
1674
Eric Christophercfd323d2011-06-21 00:05:20 +00001675const TargetInfo::AddlRegName AddlRegNames[] = {
1676 { { "al", "ah", "eax", "rax" }, 0 },
1677 { { "bl", "bh", "ebx", "rbx" }, 3 },
1678 { { "cl", "ch", "ecx", "rcx" }, 2 },
1679 { { "dl", "dh", "edx", "rdx" }, 1 },
1680 { { "esi", "rsi" }, 4 },
1681 { { "edi", "rdi" }, 5 },
1682 { { "esp", "rsp" }, 7 },
1683 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001684};
1685
1686// X86 target abstract base class; x86-32 and x86-64 are very close, so
1687// most of the implementation can be shared.
1688class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001689 enum X86SSEEnum {
Craig Topper05fe4b52012-01-09 09:19:09 +00001690 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner84f0ea82009-03-02 22:40:39 +00001691 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001692 enum MMX3DNowEnum {
1693 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1694 } MMX3DNowLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001695
Eric Christophereea12d12010-04-02 23:50:19 +00001696 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001697 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001698 bool HasLZCNT;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001699 bool HasRDRND;
Craig Topper31ceea02011-12-25 05:06:45 +00001700 bool HasBMI;
1701 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001702 bool HasPOPCNT;
Michael Liao463eb892012-11-10 05:17:46 +00001703 bool HasRTM;
Michael Liao72339a02013-03-26 17:52:08 +00001704 bool HasPRFCHW;
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00001705 bool HasSSE4a;
Craig Topper6a511e12011-12-30 07:33:42 +00001706 bool HasFMA4;
Craig Topper2ae95072012-06-03 21:46:30 +00001707 bool HasFMA;
Craig Topperb6af69e2012-06-09 22:24:14 +00001708 bool HasXOP;
Manman Ren146e5a42012-10-11 00:59:55 +00001709 bool HasF16C;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001710
Chandler Carruth499d9722011-09-28 08:55:34 +00001711 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1712 ///
1713 /// Each enumeration represents a particular CPU supported by Clang. These
1714 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1715 enum CPUKind {
1716 CK_Generic,
1717
1718 /// \name i386
1719 /// i386-generation processors.
1720 //@{
1721 CK_i386,
1722 //@}
1723
1724 /// \name i486
1725 /// i486-generation processors.
1726 //@{
1727 CK_i486,
1728 CK_WinChipC6,
1729 CK_WinChip2,
1730 CK_C3,
1731 //@}
1732
1733 /// \name i586
1734 /// i586-generation processors, P5 microarchitecture based.
1735 //@{
1736 CK_i586,
1737 CK_Pentium,
1738 CK_PentiumMMX,
1739 //@}
1740
1741 /// \name i686
1742 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1743 //@{
1744 CK_i686,
1745 CK_PentiumPro,
1746 CK_Pentium2,
1747 CK_Pentium3,
1748 CK_Pentium3M,
1749 CK_PentiumM,
1750 CK_C3_2,
1751
1752 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1753 /// Clang however has some logic to suport this.
1754 // FIXME: Warn, deprecate, and potentially remove this.
1755 CK_Yonah,
1756 //@}
1757
1758 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001759 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001760 //@{
1761 CK_Pentium4,
1762 CK_Pentium4M,
1763 CK_Prescott,
1764 CK_Nocona,
1765 //@}
1766
1767 /// \name Core
1768 /// Core microarchitecture based processors.
1769 //@{
1770 CK_Core2,
1771
1772 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1773 /// codename which GCC no longer accepts as an option to -march, but Clang
1774 /// has some logic for recognizing it.
1775 // FIXME: Warn, deprecate, and potentially remove this.
1776 CK_Penryn,
1777 //@}
1778
1779 /// \name Atom
1780 /// Atom processors
1781 //@{
1782 CK_Atom,
1783 //@}
1784
1785 /// \name Nehalem
1786 /// Nehalem microarchitecture based processors.
1787 //@{
1788 CK_Corei7,
1789 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001790 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001791 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001792 //@}
1793
1794 /// \name K6
1795 /// K6 architecture processors.
1796 //@{
1797 CK_K6,
1798 CK_K6_2,
1799 CK_K6_3,
1800 //@}
1801
1802 /// \name K7
1803 /// K7 architecture processors.
1804 //@{
1805 CK_Athlon,
1806 CK_AthlonThunderbird,
1807 CK_Athlon4,
1808 CK_AthlonXP,
1809 CK_AthlonMP,
1810 //@}
1811
1812 /// \name K8
1813 /// K8 architecture processors.
1814 //@{
1815 CK_Athlon64,
1816 CK_Athlon64SSE3,
1817 CK_AthlonFX,
1818 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001819 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001820 CK_Opteron,
1821 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001822 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001823 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001824
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001825 /// \name Bobcat
1826 /// Bobcat architecture processors.
1827 //@{
1828 CK_BTVER1,
1829 //@}
1830
1831 /// \name Bulldozer
1832 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001833 //@{
1834 CK_BDVER1,
1835 CK_BDVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001836 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001837
Chandler Carruth499d9722011-09-28 08:55:34 +00001838 /// This specification is deprecated and will be removed in the future.
1839 /// Users should prefer \see CK_K8.
1840 // FIXME: Warn on this when the CPU is set to it.
1841 CK_x86_64,
1842 //@}
1843
1844 /// \name Geode
1845 /// Geode processors.
1846 //@{
1847 CK_Geode
1848 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001849 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001850
Eli Friedman618234a2008-08-20 02:34:37 +00001851public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001852 X86TargetInfo(const std::string& triple)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001853 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Benjamin Kramer84f30802012-07-07 09:39:18 +00001854 HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false),
Michael Liao463eb892012-11-10 05:17:46 +00001855 HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasRTM(false),
Michael Liao72339a02013-03-26 17:52:08 +00001856 HasPRFCHW(false), HasSSE4a(false), HasFMA4(false),
1857 HasFMA(false), HasXOP(false), HasF16C(false), CPU(CK_Generic) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001858 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001859 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001860 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001861 virtual unsigned getFloatEvalMethod() const {
1862 // X87 evaluates with 80 bits "long double" precision.
1863 return SSELevel == NoSSE ? 2 : 0;
1864 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001865 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1866 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001867 Records = BuiltinInfo;
1868 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001869 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001870 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001871 unsigned &NumNames) const {
1872 Names = GCCRegNames;
1873 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001874 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001875 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001876 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001877 Aliases = 0;
1878 NumAliases = 0;
1879 }
1880 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopher825d3862012-11-14 22:08:59 +00001881 unsigned &NumNames) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001882 Names = AddlRegNames;
1883 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001884 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001885 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001886 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001887 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001888 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001889 return "~{dirflag},~{fpsr},~{flags}";
1890 }
Chris Lattner33328642009-03-20 15:52:06 +00001891 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001892 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001893 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00001894 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001895 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001896 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregore727d212012-01-30 06:38:25 +00001897 virtual bool hasFeature(StringRef Feature) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001898 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001899 virtual const char* getABI() const {
Derek Schuffbabaf312012-10-11 15:52:22 +00001900 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001901 return "avx";
Derek Schuffbabaf312012-10-11 15:52:22 +00001902 else if (getTriple().getArch() == llvm::Triple::x86 &&
1903 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001904 return "no-mmx";
1905 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001906 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001907 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001908 CPU = llvm::StringSwitch<CPUKind>(Name)
1909 .Case("i386", CK_i386)
1910 .Case("i486", CK_i486)
1911 .Case("winchip-c6", CK_WinChipC6)
1912 .Case("winchip2", CK_WinChip2)
1913 .Case("c3", CK_C3)
1914 .Case("i586", CK_i586)
1915 .Case("pentium", CK_Pentium)
1916 .Case("pentium-mmx", CK_PentiumMMX)
1917 .Case("i686", CK_i686)
1918 .Case("pentiumpro", CK_PentiumPro)
1919 .Case("pentium2", CK_Pentium2)
1920 .Case("pentium3", CK_Pentium3)
1921 .Case("pentium3m", CK_Pentium3M)
1922 .Case("pentium-m", CK_PentiumM)
1923 .Case("c3-2", CK_C3_2)
1924 .Case("yonah", CK_Yonah)
1925 .Case("pentium4", CK_Pentium4)
1926 .Case("pentium4m", CK_Pentium4M)
1927 .Case("prescott", CK_Prescott)
1928 .Case("nocona", CK_Nocona)
1929 .Case("core2", CK_Core2)
1930 .Case("penryn", CK_Penryn)
1931 .Case("atom", CK_Atom)
1932 .Case("corei7", CK_Corei7)
1933 .Case("corei7-avx", CK_Corei7AVX)
1934 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001935 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001936 .Case("k6", CK_K6)
1937 .Case("k6-2", CK_K6_2)
1938 .Case("k6-3", CK_K6_3)
1939 .Case("athlon", CK_Athlon)
1940 .Case("athlon-tbird", CK_AthlonThunderbird)
1941 .Case("athlon-4", CK_Athlon4)
1942 .Case("athlon-xp", CK_AthlonXP)
1943 .Case("athlon-mp", CK_AthlonMP)
1944 .Case("athlon64", CK_Athlon64)
1945 .Case("athlon64-sse3", CK_Athlon64SSE3)
1946 .Case("athlon-fx", CK_AthlonFX)
1947 .Case("k8", CK_K8)
1948 .Case("k8-sse3", CK_K8SSE3)
1949 .Case("opteron", CK_Opteron)
1950 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001951 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001952 .Case("btver1", CK_BTVER1)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001953 .Case("bdver1", CK_BDVER1)
1954 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001955 .Case("x86-64", CK_x86_64)
1956 .Case("geode", CK_Geode)
1957 .Default(CK_Generic);
1958
Chandler Carruth26a39142011-09-28 09:45:08 +00001959 // Perform any per-CPU checks necessary to determine if this CPU is
1960 // acceptable.
1961 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1962 // invalid without explaining *why*.
1963 switch (CPU) {
1964 case CK_Generic:
1965 // No processor selected!
1966 return false;
1967
1968 case CK_i386:
1969 case CK_i486:
1970 case CK_WinChipC6:
1971 case CK_WinChip2:
1972 case CK_C3:
1973 case CK_i586:
1974 case CK_Pentium:
1975 case CK_PentiumMMX:
1976 case CK_i686:
1977 case CK_PentiumPro:
1978 case CK_Pentium2:
1979 case CK_Pentium3:
1980 case CK_Pentium3M:
1981 case CK_PentiumM:
1982 case CK_Yonah:
1983 case CK_C3_2:
1984 case CK_Pentium4:
1985 case CK_Pentium4M:
1986 case CK_Prescott:
1987 case CK_K6:
1988 case CK_K6_2:
1989 case CK_K6_3:
1990 case CK_Athlon:
1991 case CK_AthlonThunderbird:
1992 case CK_Athlon4:
1993 case CK_AthlonXP:
1994 case CK_AthlonMP:
1995 case CK_Geode:
1996 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffbabaf312012-10-11 15:52:22 +00001997 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth26a39142011-09-28 09:45:08 +00001998 return false;
1999
2000 // Fallthrough
2001 case CK_Nocona:
2002 case CK_Core2:
2003 case CK_Penryn:
2004 case CK_Atom:
2005 case CK_Corei7:
2006 case CK_Corei7AVX:
2007 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002008 case CK_CoreAVX2:
Chandler Carruth26a39142011-09-28 09:45:08 +00002009 case CK_Athlon64:
2010 case CK_Athlon64SSE3:
2011 case CK_AthlonFX:
2012 case CK_K8:
2013 case CK_K8SSE3:
2014 case CK_Opteron:
2015 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00002016 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002017 case CK_BTVER1:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002018 case CK_BDVER1:
2019 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00002020 case CK_x86_64:
2021 return true;
2022 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00002023 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002024 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00002025
2026 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
2027 // We accept all non-ARM calling conventions
2028 return (CC == CC_X86ThisCall ||
2029 CC == CC_X86FastCall ||
Peter Collingbourne7728cdd2013-02-23 00:06:18 +00002030 CC == CC_X86StdCall ||
2031 CC == CC_C ||
Guy Benyei38980082012-12-25 08:53:55 +00002032 CC == CC_X86Pascal ||
2033 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002034 }
2035
Aaron Ballmanfff32482012-12-09 17:45:41 +00002036 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
2037 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002038 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002039};
Chris Lattner3daed522009-03-02 22:20:04 +00002040
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002041void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002042 // FIXME: This should not be here.
2043 Features["3dnow"] = false;
2044 Features["3dnowa"] = false;
2045 Features["mmx"] = false;
2046 Features["sse"] = false;
2047 Features["sse2"] = false;
2048 Features["sse3"] = false;
2049 Features["ssse3"] = false;
2050 Features["sse41"] = false;
2051 Features["sse42"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00002052 Features["sse4a"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00002053 Features["aes"] = false;
Craig Topper3c0bc152012-05-31 05:18:48 +00002054 Features["pclmul"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00002055 Features["avx"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00002056 Features["avx2"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002057 Features["lzcnt"] = false;
Benjamin Kramer84f30802012-07-07 09:39:18 +00002058 Features["rdrand"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002059 Features["bmi"] = false;
2060 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00002061 Features["popcnt"] = false;
Michael Liao463eb892012-11-10 05:17:46 +00002062 Features["rtm"] = false;
Michael Liao72339a02013-03-26 17:52:08 +00002063 Features["prfchw"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00002064 Features["fma4"] = false;
Craig Topper2ae95072012-06-03 21:46:30 +00002065 Features["fma"] = false;
Craig Topperb6af69e2012-06-09 22:24:14 +00002066 Features["xop"] = false;
Manman Ren146e5a42012-10-11 00:59:55 +00002067 Features["f16c"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002068
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002069 // FIXME: This *really* should not be here.
2070
2071 // X86_64 always has SSE2.
Derek Schuffbabaf312012-10-11 15:52:22 +00002072 if (getTriple().getArch() == llvm::Triple::x86_64)
Eli Friedman612db2a2012-11-17 01:16:19 +00002073 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002074
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002075 switch (CPU) {
2076 case CK_Generic:
2077 case CK_i386:
2078 case CK_i486:
2079 case CK_i586:
2080 case CK_Pentium:
2081 case CK_i686:
2082 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002083 break;
2084 case CK_PentiumMMX:
2085 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002086 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002087 break;
2088 case CK_Pentium3:
2089 case CK_Pentium3M:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002090 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002091 break;
2092 case CK_PentiumM:
2093 case CK_Pentium4:
2094 case CK_Pentium4M:
2095 case CK_x86_64:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002096 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002097 break;
2098 case CK_Yonah:
2099 case CK_Prescott:
2100 case CK_Nocona:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002101 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002102 break;
2103 case CK_Core2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002104 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002105 break;
2106 case CK_Penryn:
Benjamin Kramerb3453a82012-01-04 14:36:57 +00002107 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002108 break;
2109 case CK_Atom:
Chandler Carruth49defe62011-09-28 10:36:46 +00002110 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002111 break;
2112 case CK_Corei7:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002113 setFeatureEnabled(Features, "sse4", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002114 break;
2115 case CK_Corei7AVX:
Benjamin Kramer84f30802012-07-07 09:39:18 +00002116 setFeatureEnabled(Features, "avx", true);
2117 setFeatureEnabled(Features, "aes", true);
2118 setFeatureEnabled(Features, "pclmul", true);
2119 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002120 case CK_CoreAVXi:
Craig Topperfd936302012-04-26 07:31:30 +00002121 setFeatureEnabled(Features, "avx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00002122 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002123 setFeatureEnabled(Features, "pclmul", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002124 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002125 setFeatureEnabled(Features, "f16c", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002126 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00002127 case CK_CoreAVX2:
Craig Topperfd936302012-04-26 07:31:30 +00002128 setFeatureEnabled(Features, "avx2", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002129 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002130 setFeatureEnabled(Features, "pclmul", true);
Craig Topper31ceea02011-12-25 05:06:45 +00002131 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002132 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002133 setFeatureEnabled(Features, "f16c", true);
Craig Topper31ceea02011-12-25 05:06:45 +00002134 setFeatureEnabled(Features, "bmi", true);
2135 setFeatureEnabled(Features, "bmi2", true);
Michael Liao463eb892012-11-10 05:17:46 +00002136 setFeatureEnabled(Features, "rtm", true);
Craig Topper2ae95072012-06-03 21:46:30 +00002137 setFeatureEnabled(Features, "fma", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002138 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002139 case CK_K6:
2140 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002141 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002142 break;
2143 case CK_K6_2:
2144 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002145 case CK_WinChip2:
2146 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002147 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002148 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00002149 case CK_Athlon:
2150 case CK_AthlonThunderbird:
2151 case CK_Geode:
2152 setFeatureEnabled(Features, "3dnowa", true);
2153 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002154 case CK_Athlon4:
2155 case CK_AthlonXP:
2156 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002157 setFeatureEnabled(Features, "sse", true);
2158 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002159 break;
2160 case CK_K8:
2161 case CK_Opteron:
2162 case CK_Athlon64:
2163 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00002164 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002165 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002166 break;
2167 case CK_K8SSE3:
2168 case CK_OpteronSSE3:
2169 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00002170 setFeatureEnabled(Features, "sse3", true);
2171 setFeatureEnabled(Features, "3dnowa", true);
2172 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002173 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00002174 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00002175 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00002176 setFeatureEnabled(Features, "3dnowa", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002177 setFeatureEnabled(Features, "lzcnt", true);
2178 setFeatureEnabled(Features, "popcnt", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002179 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002180 case CK_BTVER1:
2181 setFeatureEnabled(Features, "ssse3", true);
2182 setFeatureEnabled(Features, "sse4a", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002183 setFeatureEnabled(Features, "lzcnt", true);
2184 setFeatureEnabled(Features, "popcnt", true);
Craig Topper90ea0362012-05-30 05:54:54 +00002185 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002186 case CK_BDVER1:
Craig Topperb6af69e2012-06-09 22:24:14 +00002187 setFeatureEnabled(Features, "xop", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002188 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002189 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002190 setFeatureEnabled(Features, "pclmul", true);
Eli Friedmanf5824992012-11-26 21:57:28 +00002191 break;
Eli Friedmanfaf35382012-11-17 01:43:10 +00002192 case CK_BDVER2:
2193 setFeatureEnabled(Features, "xop", true);
2194 setFeatureEnabled(Features, "lzcnt", true);
2195 setFeatureEnabled(Features, "aes", true);
2196 setFeatureEnabled(Features, "pclmul", true);
2197 setFeatureEnabled(Features, "bmi", true);
2198 setFeatureEnabled(Features, "fma", true);
2199 setFeatureEnabled(Features, "f16c", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002200 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002201 case CK_C3_2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002202 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002203 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002204 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002205}
2206
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002207bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00002208 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002209 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00002210 // FIXME: This *really* should not be here. We need some way of translating
2211 // options into llvm subtarget features.
2212 if (!Features.count(Name) &&
Benjamin Kramer84f30802012-07-07 09:39:18 +00002213 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1" &&
2214 Name != "rdrnd"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002215 return false;
2216
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002217 // FIXME: this should probably use a switch with fall through.
2218
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002219 if (Enabled) {
2220 if (Name == "mmx")
2221 Features["mmx"] = true;
2222 else if (Name == "sse")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002223 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002224 else if (Name == "sse2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002225 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002226 else if (Name == "sse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002227 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2228 true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002229 else if (Name == "ssse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002230 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002231 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00002232 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002233 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00002234 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2235 Features["popcnt"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00002236 else if (Name == "sse4.1")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002237 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00002238 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002239 else if (Name == "3dnow")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002240 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002241 else if (Name == "3dnowa")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002242 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00002243 else if (Name == "aes")
Craig Toppera7463c32012-06-03 21:56:22 +00002244 Features["sse"] = Features["sse2"] = Features["aes"] = true;
Craig Topper3c0bc152012-05-31 05:18:48 +00002245 else if (Name == "pclmul")
Craig Toppera7463c32012-06-03 21:56:22 +00002246 Features["sse"] = Features["sse2"] = Features["pclmul"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00002247 else if (Name == "avx")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002248 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2249 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00002250 Features["popcnt"] = Features["avx"] = true;
Craig Topper2b03bb02011-12-17 19:55:21 +00002251 else if (Name == "avx2")
2252 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2253 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00002254 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topper2ae95072012-06-03 21:46:30 +00002255 else if (Name == "fma")
2256 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2257 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2258 Features["popcnt"] = Features["avx"] = Features["fma"] = true;
Craig Topper6a511e12011-12-30 07:33:42 +00002259 else if (Name == "fma4")
Eli Friedman612db2a2012-11-17 01:16:19 +00002260 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00002261 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper90ea0362012-05-30 05:54:54 +00002262 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
2263 Features["fma4"] = true;
Craig Topperb6af69e2012-06-09 22:24:14 +00002264 else if (Name == "xop")
Eli Friedman612db2a2012-11-17 01:16:19 +00002265 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002266 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2267 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
2268 Features["fma4"] = Features["xop"] = true;
Roman Divacky80b32b82011-10-30 13:47:56 +00002269 else if (Name == "sse4a")
Craig Topper6a511e12011-12-30 07:33:42 +00002270 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper90ea0362012-05-30 05:54:54 +00002271 Features["sse4a"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00002272 else if (Name == "lzcnt")
2273 Features["lzcnt"] = true;
Benjamin Kramer84f30802012-07-07 09:39:18 +00002274 else if (Name == "rdrnd")
2275 Features["rdrand"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00002276 else if (Name == "bmi")
2277 Features["bmi"] = true;
2278 else if (Name == "bmi2")
2279 Features["bmi2"] = true;
Craig Toppere14e08b2011-12-29 16:10:46 +00002280 else if (Name == "popcnt")
2281 Features["popcnt"] = true;
Manman Ren146e5a42012-10-11 00:59:55 +00002282 else if (Name == "f16c")
2283 Features["f16c"] = true;
Michael Liao463eb892012-11-10 05:17:46 +00002284 else if (Name == "rtm")
2285 Features["rtm"] = true;
Michael Liao72339a02013-03-26 17:52:08 +00002286 else if (Name == "prfchw")
2287 Features["prfchw"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002288 } else {
2289 if (Name == "mmx")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002290 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002291 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00002292 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00002293 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper31380fb2012-06-03 22:23:42 +00002294 Features["sse4a"] = Features["avx"] = Features["avx2"] =
2295 Features["fma"] = Features["fma4"] = Features["aes"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002296 Features["pclmul"] = Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002297 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00002298 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Toppera7463c32012-06-03 21:56:22 +00002299 Features["sse41"] = Features["sse42"] = Features["sse4a"] =
Craig Topper31380fb2012-06-03 22:23:42 +00002300 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002301 Features["fma4"] = Features["aes"] = Features["pclmul"] =
2302 Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002303 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00002304 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topper31380fb2012-06-03 22:23:42 +00002305 Features["sse42"] = Features["sse4a"] = Features["avx"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002306 Features["avx2"] = Features["fma"] = Features["fma4"] =
2307 Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002308 else if (Name == "ssse3")
Craig Topper31380fb2012-06-03 22:23:42 +00002309 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2310 Features["avx"] = Features["avx2"] = Features["fma"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00002311 else if (Name == "sse4" || Name == "sse4.1")
Craig Topper31380fb2012-06-03 22:23:42 +00002312 Features["sse41"] = Features["sse42"] = Features["avx"] =
2313 Features["avx2"] = Features["fma"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00002314 else if (Name == "sse4.2")
Craig Topper31380fb2012-06-03 22:23:42 +00002315 Features["sse42"] = Features["avx"] = Features["avx2"] =
2316 Features["fma"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002317 else if (Name == "3dnow")
2318 Features["3dnow"] = Features["3dnowa"] = false;
2319 else if (Name == "3dnowa")
2320 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00002321 else if (Name == "aes")
2322 Features["aes"] = false;
Craig Topper3c0bc152012-05-31 05:18:48 +00002323 else if (Name == "pclmul")
2324 Features["pclmul"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00002325 else if (Name == "avx")
Craig Topper2ae95072012-06-03 21:46:30 +00002326 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002327 Features["fma4"] = Features["xop"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00002328 else if (Name == "avx2")
2329 Features["avx2"] = false;
Craig Topper2ae95072012-06-03 21:46:30 +00002330 else if (Name == "fma")
2331 Features["fma"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00002332 else if (Name == "sse4a")
Craig Topperb6af69e2012-06-09 22:24:14 +00002333 Features["sse4a"] = Features["fma4"] = Features["xop"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002334 else if (Name == "lzcnt")
2335 Features["lzcnt"] = false;
Benjamin Kramer84f30802012-07-07 09:39:18 +00002336 else if (Name == "rdrnd")
2337 Features["rdrand"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002338 else if (Name == "bmi")
2339 Features["bmi"] = false;
2340 else if (Name == "bmi2")
2341 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00002342 else if (Name == "popcnt")
2343 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00002344 else if (Name == "fma4")
Craig Topperb6af69e2012-06-09 22:24:14 +00002345 Features["fma4"] = Features["xop"] = false;
2346 else if (Name == "xop")
2347 Features["xop"] = false;
Manman Ren146e5a42012-10-11 00:59:55 +00002348 else if (Name == "f16c")
2349 Features["f16c"] = false;
Michael Liao463eb892012-11-10 05:17:46 +00002350 else if (Name == "rtm")
2351 Features["rtm"] = false;
Michael Liao72339a02013-03-26 17:52:08 +00002352 else if (Name == "prfchw")
2353 Features["prfchw"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002354 }
2355
2356 return true;
2357}
2358
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002359/// HandleTargetOptions - Perform initialization based on the user
2360/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002361void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002362 // Remember the maximum enabled sselevel.
2363 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2364 // Ignore disabled features.
2365 if (Features[i][0] == '-')
2366 continue;
2367
Benjamin Kramer713575a2012-03-05 15:10:44 +00002368 StringRef Feature = StringRef(Features[i]).substr(1);
2369
2370 if (Feature == "aes") {
Eric Christophereea12d12010-04-02 23:50:19 +00002371 HasAES = true;
2372 continue;
2373 }
2374
Craig Topper3c0bc152012-05-31 05:18:48 +00002375 if (Feature == "pclmul") {
2376 HasPCLMUL = true;
2377 continue;
2378 }
2379
Benjamin Kramer713575a2012-03-05 15:10:44 +00002380 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00002381 HasLZCNT = true;
2382 continue;
2383 }
2384
Benjamin Kramer84f30802012-07-07 09:39:18 +00002385 if (Feature == "rdrand") {
2386 HasRDRND = true;
2387 continue;
2388 }
2389
Benjamin Kramer713575a2012-03-05 15:10:44 +00002390 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00002391 HasBMI = true;
2392 continue;
2393 }
2394
Benjamin Kramer713575a2012-03-05 15:10:44 +00002395 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00002396 HasBMI2 = true;
2397 continue;
2398 }
2399
Benjamin Kramer713575a2012-03-05 15:10:44 +00002400 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00002401 HasPOPCNT = true;
2402 continue;
2403 }
2404
Michael Liao463eb892012-11-10 05:17:46 +00002405 if (Feature == "rtm") {
2406 HasRTM = true;
2407 continue;
2408 }
2409
Michael Liao72339a02013-03-26 17:52:08 +00002410 if (Feature == "prfchw") {
2411 HasPRFCHW = true;
2412 continue;
2413 }
2414
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002415 if (Feature == "sse4a") {
2416 HasSSE4a = true;
2417 continue;
2418 }
2419
Benjamin Kramer713575a2012-03-05 15:10:44 +00002420 if (Feature == "fma4") {
Craig Topper6a511e12011-12-30 07:33:42 +00002421 HasFMA4 = true;
2422 continue;
2423 }
2424
Craig Topper2ae95072012-06-03 21:46:30 +00002425 if (Feature == "fma") {
2426 HasFMA = true;
2427 continue;
2428 }
2429
Craig Topperb6af69e2012-06-09 22:24:14 +00002430 if (Feature == "xop") {
2431 HasXOP = true;
2432 continue;
2433 }
2434
Manman Ren146e5a42012-10-11 00:59:55 +00002435 if (Feature == "f16c") {
2436 HasF16C = true;
2437 continue;
2438 }
2439
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002440 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00002441 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper05fe4b52012-01-09 09:19:09 +00002442 .Case("avx2", AVX2)
2443 .Case("avx", AVX)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002444 .Case("sse42", SSE42)
2445 .Case("sse41", SSE41)
2446 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00002447 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002448 .Case("sse2", SSE2)
2449 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002450 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002451 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002452
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002453 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00002454 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002455 .Case("3dnowa", AMD3DNowAthlon)
2456 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002457 .Case("mmx", MMX)
2458 .Default(NoMMX3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002459
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002460 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002461 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002462
2463 // Don't tell the backend if we're turning off mmx; it will end up disabling
2464 // SSE, which we don't want.
2465 std::vector<std::string>::iterator it;
2466 it = std::find(Features.begin(), Features.end(), "-mmx");
2467 if (it != Features.end())
2468 Features.erase(it);
Chris Lattner3daed522009-03-02 22:20:04 +00002469}
Chris Lattnerc0f59212009-03-02 22:27:17 +00002470
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002471/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2472/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00002473void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002474 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002475 // Target identification.
Derek Schuffbabaf312012-10-11 15:52:22 +00002476 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002477 Builder.defineMacro("__amd64__");
2478 Builder.defineMacro("__amd64");
2479 Builder.defineMacro("__x86_64");
2480 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00002481 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00002482 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00002483 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002484
Chris Lattnerc0f59212009-03-02 22:27:17 +00002485 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002486 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2487 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002488 switch (CPU) {
2489 case CK_Generic:
2490 break;
2491 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002492 // The rest are coming from the i386 define above.
2493 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002494 break;
2495 case CK_i486:
2496 case CK_WinChipC6:
2497 case CK_WinChip2:
2498 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002499 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002500 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002501 case CK_PentiumMMX:
2502 Builder.defineMacro("__pentium_mmx__");
2503 Builder.defineMacro("__tune_pentium_mmx__");
2504 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002505 case CK_i586:
2506 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002507 defineCPUMacros(Builder, "i586");
2508 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002509 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002510 case CK_Pentium3:
2511 case CK_Pentium3M:
2512 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002513 Builder.defineMacro("__tune_pentium3__");
2514 // Fallthrough
2515 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002516 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002517 Builder.defineMacro("__tune_pentium2__");
2518 // Fallthrough
2519 case CK_PentiumPro:
2520 Builder.defineMacro("__tune_i686__");
2521 Builder.defineMacro("__tune_pentiumpro__");
2522 // Fallthrough
2523 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002524 Builder.defineMacro("__i686");
2525 Builder.defineMacro("__i686__");
2526 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2527 Builder.defineMacro("__pentiumpro");
2528 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002529 break;
2530 case CK_Pentium4:
2531 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002532 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002533 break;
2534 case CK_Yonah:
2535 case CK_Prescott:
2536 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002537 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002538 break;
2539 case CK_Core2:
2540 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002541 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002542 break;
2543 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002544 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002545 break;
2546 case CK_Corei7:
2547 case CK_Corei7AVX:
2548 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002549 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002550 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002551 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002552 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002553 Builder.defineMacro("__k6_2__");
2554 Builder.defineMacro("__tune_k6_2__");
2555 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002556 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002557 if (CPU != CK_K6_2) { // In case of fallthrough
2558 // FIXME: GCC may be enabling these in cases where some other k6
2559 // architecture is specified but -m3dnow is explicitly provided. The
2560 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002561 Builder.defineMacro("__k6_3__");
2562 Builder.defineMacro("__tune_k6_3__");
2563 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00002564 // Fallthrough
2565 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002566 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002567 break;
2568 case CK_Athlon:
2569 case CK_AthlonThunderbird:
2570 case CK_Athlon4:
2571 case CK_AthlonXP:
2572 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002573 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002574 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002575 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002576 Builder.defineMacro("__tune_athlon_sse__");
2577 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002578 break;
2579 case CK_K8:
2580 case CK_K8SSE3:
2581 case CK_x86_64:
2582 case CK_Opteron:
2583 case CK_OpteronSSE3:
2584 case CK_Athlon64:
2585 case CK_Athlon64SSE3:
2586 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002587 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002588 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002589 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002590 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00002591 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002592 case CK_BTVER1:
2593 defineCPUMacros(Builder, "btver1");
2594 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002595 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002596 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002597 break;
2598 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002599 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002600 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002601 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002602 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002603 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002604 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00002605
Chandler Carruth88c75b02011-09-28 09:54:07 +00002606 // Target properties.
2607 Builder.defineMacro("__LITTLE_ENDIAN__");
2608 Builder.defineMacro("__REGISTER_PREFIX__", "");
2609
Chris Lattner54175442009-04-19 17:32:33 +00002610 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2611 // functions in glibc header files that use FP Stack inline asm which the
2612 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00002613 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002614
Chandler Carruth88c75b02011-09-28 09:54:07 +00002615 if (HasAES)
2616 Builder.defineMacro("__AES__");
2617
Craig Topper3c0bc152012-05-31 05:18:48 +00002618 if (HasPCLMUL)
2619 Builder.defineMacro("__PCLMUL__");
2620
Craig Topper31ceea02011-12-25 05:06:45 +00002621 if (HasLZCNT)
2622 Builder.defineMacro("__LZCNT__");
2623
Benjamin Kramer84f30802012-07-07 09:39:18 +00002624 if (HasRDRND)
2625 Builder.defineMacro("__RDRND__");
2626
Craig Topper31ceea02011-12-25 05:06:45 +00002627 if (HasBMI)
2628 Builder.defineMacro("__BMI__");
2629
2630 if (HasBMI2)
2631 Builder.defineMacro("__BMI2__");
2632
Craig Toppere14e08b2011-12-29 16:10:46 +00002633 if (HasPOPCNT)
2634 Builder.defineMacro("__POPCNT__");
2635
Michael Liao463eb892012-11-10 05:17:46 +00002636 if (HasRTM)
2637 Builder.defineMacro("__RTM__");
2638
Michael Liao72339a02013-03-26 17:52:08 +00002639 if (HasPRFCHW)
2640 Builder.defineMacro("__PRFCHW__");
2641
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002642 if (HasSSE4a)
2643 Builder.defineMacro("__SSE4A__");
2644
Craig Topper6a511e12011-12-30 07:33:42 +00002645 if (HasFMA4)
2646 Builder.defineMacro("__FMA4__");
2647
Craig Topper2ae95072012-06-03 21:46:30 +00002648 if (HasFMA)
2649 Builder.defineMacro("__FMA__");
2650
Craig Topperb6af69e2012-06-09 22:24:14 +00002651 if (HasXOP)
2652 Builder.defineMacro("__XOP__");
2653
Manman Ren146e5a42012-10-11 00:59:55 +00002654 if (HasF16C)
2655 Builder.defineMacro("__F16C__");
2656
Chris Lattner84f0ea82009-03-02 22:40:39 +00002657 // Each case falls through to the previous one here.
2658 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002659 case AVX2:
2660 Builder.defineMacro("__AVX2__");
2661 case AVX:
2662 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002663 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00002664 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002665 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002666 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002667 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002668 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002669 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002670 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002671 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002672 Builder.defineMacro("__SSE2__");
2673 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002674 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002675 Builder.defineMacro("__SSE__");
2676 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002677 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002678 break;
2679 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002680
Derek Schuffbabaf312012-10-11 15:52:22 +00002681 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002682 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002683 case AVX2:
2684 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002685 case SSE42:
2686 case SSE41:
2687 case SSSE3:
2688 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002689 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002690 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002691 break;
2692 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002693 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002694 break;
2695 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002696 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002697 }
2698 }
2699
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002700 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002701 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002702 case AMD3DNowAthlon:
2703 Builder.defineMacro("__3dNOW_A__");
2704 case AMD3DNow:
2705 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002706 case MMX:
2707 Builder.defineMacro("__MMX__");
2708 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002709 break;
2710 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00002711}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002712
Douglas Gregore727d212012-01-30 06:38:25 +00002713bool X86TargetInfo::hasFeature(StringRef Feature) const {
2714 return llvm::StringSwitch<bool>(Feature)
2715 .Case("aes", HasAES)
2716 .Case("avx", SSELevel >= AVX)
2717 .Case("avx2", SSELevel >= AVX2)
2718 .Case("bmi", HasBMI)
2719 .Case("bmi2", HasBMI2)
Craig Topper2ae95072012-06-03 21:46:30 +00002720 .Case("fma", HasFMA)
Douglas Gregore727d212012-01-30 06:38:25 +00002721 .Case("fma4", HasFMA4)
2722 .Case("lzcnt", HasLZCNT)
Benjamin Kramer84f30802012-07-07 09:39:18 +00002723 .Case("rdrnd", HasRDRND)
Douglas Gregore727d212012-01-30 06:38:25 +00002724 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2725 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2726 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00002727 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00002728 .Case("popcnt", HasPOPCNT)
Michael Liao463eb892012-11-10 05:17:46 +00002729 .Case("rtm", HasRTM)
Michael Liao72339a02013-03-26 17:52:08 +00002730 .Case("prfchw", HasPRFCHW)
Douglas Gregore727d212012-01-30 06:38:25 +00002731 .Case("sse", SSELevel >= SSE1)
2732 .Case("sse2", SSELevel >= SSE2)
2733 .Case("sse3", SSELevel >= SSE3)
2734 .Case("ssse3", SSELevel >= SSSE3)
2735 .Case("sse41", SSELevel >= SSE41)
2736 .Case("sse42", SSELevel >= SSE42)
Craig Topper3c0bc152012-05-31 05:18:48 +00002737 .Case("sse4a", HasSSE4a)
Douglas Gregore727d212012-01-30 06:38:25 +00002738 .Case("x86", true)
Derek Schuffbabaf312012-10-11 15:52:22 +00002739 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2740 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Craig Topperb6af69e2012-06-09 22:24:14 +00002741 .Case("xop", HasXOP)
Manman Ren146e5a42012-10-11 00:59:55 +00002742 .Case("f16c", HasF16C)
Douglas Gregore727d212012-01-30 06:38:25 +00002743 .Default(false);
2744}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002745
Eli Friedman618234a2008-08-20 02:34:37 +00002746bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002747X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002748 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002749 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002750 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002751 case 'Y': // first letter of a pair:
2752 switch (*(Name+1)) {
2753 default: return false;
2754 case '0': // First SSE register.
2755 case 't': // Any SSE register, when SSE2 is enabled.
2756 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2757 case 'm': // any MMX register, when inter-unit moves enabled.
2758 break; // falls through to setAllowsRegister.
2759 }
Eli Friedman618234a2008-08-20 02:34:37 +00002760 case 'a': // eax.
2761 case 'b': // ebx.
2762 case 'c': // ecx.
2763 case 'd': // edx.
2764 case 'S': // esi.
2765 case 'D': // edi.
2766 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002767 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002768 case 't': // top of floating point stack.
2769 case 'u': // second from top of floating point stack.
2770 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002771 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002772 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002773 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002774 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2775 case 'l': // "Index" registers: any general register that can be used as an
2776 // index in a base+index memory access.
2777 Info.setAllowsRegister();
2778 return true;
2779 case 'C': // SSE floating point constant.
2780 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002781 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002782 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002783 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002784 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002785 return true;
2786 }
2787}
2788
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002789
Eli Friedman618234a2008-08-20 02:34:37 +00002790std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002791X86TargetInfo::convertConstraint(const char *&Constraint) const {
2792 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002793 case 'a': return std::string("{ax}");
2794 case 'b': return std::string("{bx}");
2795 case 'c': return std::string("{cx}");
2796 case 'd': return std::string("{dx}");
2797 case 'S': return std::string("{si}");
2798 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002799 case 'p': // address
2800 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002801 case 't': // top of floating point stack.
2802 return std::string("{st}");
2803 case 'u': // second from top of floating point stack.
2804 return std::string("{st(1)}"); // second from top of floating point stack.
2805 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002806 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002807 }
2808}
Eli Friedman618234a2008-08-20 02:34:37 +00002809} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002810
2811namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002812// X86-32 generic target
2813class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002814public:
Eli Friedman618234a2008-08-20 02:34:37 +00002815 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2816 DoubleAlign = LongLongAlign = 32;
2817 LongDoubleWidth = 96;
2818 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002819 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002820 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2821 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002822 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002823 SizeType = UnsignedInt;
2824 PtrDiffType = SignedInt;
2825 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002826 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002827
2828 // Use fpret for all types.
2829 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2830 (1 << TargetInfo::Double) |
2831 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002832
2833 // x86-32 has atomics up to 8 bytes
2834 // FIXME: Check that we actually have cmpxchg8b before setting
2835 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2836 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002837 }
Meador Ingec5613b22012-06-16 03:34:49 +00002838 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2839 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman618234a2008-08-20 02:34:37 +00002840 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002841
Chris Lattner21fb98e2009-09-23 06:06:36 +00002842 int getEHDataRegisterNumber(unsigned RegNo) const {
2843 if (RegNo == 0) return 0;
2844 if (RegNo == 1) return 2;
2845 return -1;
2846 }
Bill Wendling68fd6082012-11-12 06:42:51 +00002847 virtual bool validateInputSize(StringRef Constraint,
2848 unsigned Size) const {
2849 switch (Constraint[0]) {
2850 default: break;
2851 case 'a':
2852 case 'b':
2853 case 'c':
2854 case 'd':
Bill Wendlingf634bdf2012-11-12 18:52:32 +00002855 return Size <= 32;
Bill Wendling68fd6082012-11-12 06:42:51 +00002856 }
2857
2858 return true;
2859 }
Eli Friedman618234a2008-08-20 02:34:37 +00002860};
2861} // end anonymous namespace
2862
2863namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002864class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2865public:
2866 NetBSDI386TargetInfo(const std::string &triple) :
2867 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2868 }
2869
2870 virtual unsigned getFloatEvalMethod() const {
2871 // NetBSD defaults to "double" rounding
2872 return 1;
2873 }
2874};
2875} // end anonymous namespace
2876
2877namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002878class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2879public:
2880 OpenBSDI386TargetInfo(const std::string& triple) :
2881 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2882 SizeType = UnsignedLong;
2883 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002884 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002885 }
2886};
2887} // end anonymous namespace
2888
2889namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00002890class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
2891public:
2892 BitrigI386TargetInfo(const std::string& triple) :
2893 BitrigTargetInfo<X86_32TargetInfo>(triple) {
2894 SizeType = UnsignedLong;
2895 IntPtrType = SignedLong;
2896 PtrDiffType = SignedLong;
2897 }
2898};
2899} // end anonymous namespace
2900
2901namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002902class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002903public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002904 DarwinI386TargetInfo(const std::string& triple) :
2905 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002906 LongDoubleWidth = 128;
2907 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002908 SuitableAlign = 128;
Chad Rosierf9e9af72012-07-13 23:57:43 +00002909 MaxVectorAlign = 256;
Eli Friedman1afabd92009-03-29 20:31:09 +00002910 SizeType = UnsignedLong;
2911 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002912 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2913 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002914 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002915 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002916 }
2917
Eli Friedman618234a2008-08-20 02:34:37 +00002918};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002919} // end anonymous namespace
2920
2921namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002922// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002923class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002924public:
2925 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002926 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002927 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002928 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002929 DoubleAlign = LongLongAlign = 64;
2930 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 +00002931 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002932 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002933 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002934 virtual void getTargetDefines(const LangOptions &Opts,
2935 MacroBuilder &Builder) const {
2936 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2937 }
2938};
2939} // end anonymous namespace
2940
2941namespace {
2942
2943// x86-32 Windows Visual Studio target
2944class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2945public:
2946 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2947 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002948 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002949 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2950 }
2951 virtual void getTargetDefines(const LangOptions &Opts,
2952 MacroBuilder &Builder) const {
2953 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2954 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2955 // The value of the following reflects processor type.
2956 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2957 // We lost the original triple, so we use the default.
2958 Builder.defineMacro("_M_IX86", "600");
2959 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002960};
2961} // end anonymous namespace
2962
2963namespace {
2964// x86-32 MinGW target
2965class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2966public:
2967 MinGWX86_32TargetInfo(const std::string& triple)
2968 : WindowsX86_32TargetInfo(triple) {
2969 }
2970 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002971 MacroBuilder &Builder) const {
2972 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002973 DefineStd(Builder, "WIN32", Opts);
2974 DefineStd(Builder, "WINNT", Opts);
2975 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002976 Builder.defineMacro("__MSVCRT__");
2977 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002978
2979 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2980 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002981 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002982 // Provide "as-is" __declspec.
2983 Builder.defineMacro("__declspec", "__declspec");
2984 else
2985 // Provide alias of __attribute__ like mingw32-gcc.
2986 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002987 }
2988};
2989} // end anonymous namespace
2990
2991namespace {
2992// x86-32 Cygwin target
2993class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2994public:
2995 CygwinX86_32TargetInfo(const std::string& triple)
2996 : X86_32TargetInfo(triple) {
2997 TLSSupported = false;
2998 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002999 DoubleAlign = LongLongAlign = 64;
3000 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3001 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003002 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003003 }
3004 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003005 MacroBuilder &Builder) const {
3006 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumie72f4d92012-12-14 10:17:26 +00003007 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00003008 Builder.defineMacro("__CYGWIN__");
3009 Builder.defineMacro("__CYGWIN32__");
3010 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00003011 if (Opts.CPlusPlus)
3012 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00003013 }
Eli Friedman29a30502008-08-21 01:40:19 +00003014};
3015} // end anonymous namespace
3016
3017namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00003018// x86-32 Haiku target
3019class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3020public:
3021 HaikuX86_32TargetInfo(const std::string& triple)
3022 : X86_32TargetInfo(triple) {
3023 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00003024 IntPtrType = SignedLong;
3025 PtrDiffType = SignedLong;
Eli Friedman6902e412012-11-27 02:58:24 +00003026 ProcessIDType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00003027 this->UserLabelPrefix = "";
Benjamin Krameref7bcea2012-11-08 12:59:15 +00003028 this->TLSSupported = false;
Eli Friedmana7e68452010-08-22 01:00:03 +00003029 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00003030 virtual void getTargetDefines(const LangOptions &Opts,
3031 MacroBuilder &Builder) const {
3032 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3033 Builder.defineMacro("__INTEL__");
3034 Builder.defineMacro("__HAIKU__");
3035 }
3036};
3037} // end anonymous namespace
3038
Douglas Gregordca52262011-07-01 22:41:14 +00003039// RTEMS Target
3040template<typename Target>
3041class RTEMSTargetInfo : public OSTargetInfo<Target> {
3042protected:
3043 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3044 MacroBuilder &Builder) const {
3045 // RTEMS defines; list based off of gcc output
3046
Douglas Gregordca52262011-07-01 22:41:14 +00003047 Builder.defineMacro("__rtems__");
3048 Builder.defineMacro("__ELF__");
3049 }
3050public:
3051 RTEMSTargetInfo(const std::string &triple)
3052 : OSTargetInfo<Target>(triple) {
3053 this->UserLabelPrefix = "";
3054
3055 llvm::Triple Triple(triple);
3056 switch (Triple.getArch()) {
3057 default:
3058 case llvm::Triple::x86:
3059 // this->MCountName = ".mcount";
3060 break;
3061 case llvm::Triple::mips:
3062 case llvm::Triple::mipsel:
3063 case llvm::Triple::ppc:
3064 case llvm::Triple::ppc64:
3065 // this->MCountName = "_mcount";
3066 break;
3067 case llvm::Triple::arm:
3068 // this->MCountName = "__mcount";
3069 break;
3070 }
3071
3072 }
3073};
3074
3075namespace {
3076// x86-32 RTEMS target
3077class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3078public:
3079 RTEMSX86_32TargetInfo(const std::string& triple)
3080 : X86_32TargetInfo(triple) {
3081 SizeType = UnsignedLong;
3082 IntPtrType = SignedLong;
3083 PtrDiffType = SignedLong;
3084 this->UserLabelPrefix = "";
3085 }
3086 virtual void getTargetDefines(const LangOptions &Opts,
3087 MacroBuilder &Builder) const {
3088 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3089 Builder.defineMacro("__INTEL__");
3090 Builder.defineMacro("__rtems__");
3091 }
3092};
3093} // end anonymous namespace
3094
Chris Lattner86ed3a32010-04-11 19:29:39 +00003095namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00003096// x86-64 generic target
3097class X86_64TargetInfo : public X86TargetInfo {
3098public:
Chris Lattner33328642009-03-20 15:52:06 +00003099 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00003100 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00003101 LongDoubleWidth = 128;
3102 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00003103 LargeArrayMinWidth = 128;
3104 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003105 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00003106 IntMaxType = SignedLong;
3107 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003108 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00003109 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00003110
Eli Friedmaned855cb2008-08-21 00:13:15 +00003111 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3112 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003113 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00003114
3115 // Use fpret only for long double.
3116 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00003117
Anders Carlssoneea64802011-10-31 16:27:11 +00003118 // Use fp2ret for _Complex long double.
3119 ComplexLongDoubleUsesFP2Ret = true;
3120
Eli Friedman2be46072011-10-14 20:59:01 +00003121 // x86-64 has atomics up to 16 bytes.
3122 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3123 // on CPUs with cmpxchg16b
3124 MaxAtomicPromoteWidth = 128;
3125 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00003126 }
Meador Ingec5613b22012-06-16 03:34:49 +00003127 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3128 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson3346ae62007-11-24 23:38:12 +00003129 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00003130
Chris Lattner21fb98e2009-09-23 06:06:36 +00003131 int getEHDataRegisterNumber(unsigned RegNo) const {
3132 if (RegNo == 0) return 0;
3133 if (RegNo == 1) return 1;
3134 return -1;
3135 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003136
3137 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Peter Collingbourne7728cdd2013-02-23 00:06:18 +00003138 return (CC == CC_Default ||
3139 CC == CC_C ||
3140 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003141 }
3142
Aaron Ballmanfff32482012-12-09 17:45:41 +00003143 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3144 return CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003145 }
3146
Eli Friedman618234a2008-08-20 02:34:37 +00003147};
3148} // end anonymous namespace
3149
3150namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003151// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003152class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003153public:
3154 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003155 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003156 TLSSupported = false;
3157 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00003158 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00003159 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00003160 IntMaxType = SignedLongLong;
3161 UIntMaxType = UnsignedLongLong;
3162 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00003163 SizeType = UnsignedLongLong;
3164 PtrDiffType = SignedLongLong;
3165 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00003166 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003167 }
3168 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003169 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003170 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003171 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00003172 }
Meador Ingec5613b22012-06-16 03:34:49 +00003173 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3174 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumi79521992011-01-17 22:56:23 +00003175 }
Michael J. Spencera764e832010-10-21 08:22:51 +00003176};
3177} // end anonymous namespace
3178
3179namespace {
3180// x86-64 Windows Visual Studio target
3181class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3182public:
3183 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
3184 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003185 LongDoubleWidth = LongDoubleAlign = 64;
3186 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00003187 }
3188 virtual void getTargetDefines(const LangOptions &Opts,
3189 MacroBuilder &Builder) const {
3190 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3191 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00003192 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003193 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003194 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003195};
3196} // end anonymous namespace
3197
3198namespace {
3199// x86-64 MinGW target
3200class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3201public:
3202 MinGWX86_64TargetInfo(const std::string& triple)
3203 : WindowsX86_64TargetInfo(triple) {
3204 }
3205 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003206 MacroBuilder &Builder) const {
3207 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00003208 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00003209 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00003210 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00003211 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003212
3213 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3214 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00003215 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003216 // Provide "as-is" __declspec.
3217 Builder.defineMacro("__declspec", "__declspec");
3218 else
3219 // Provide alias of __attribute__ like mingw32-gcc.
3220 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003221 }
3222};
3223} // end anonymous namespace
3224
3225namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003226class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3227public:
Mike Stump1eb44332009-09-09 15:08:12 +00003228 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003229 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
3230 Int64Type = SignedLongLong;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003231 MaxVectorAlign = 256;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003232 }
3233};
3234} // end anonymous namespace
3235
3236namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00003237class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3238public:
Mike Stump1eb44332009-09-09 15:08:12 +00003239 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00003240 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
3241 IntMaxType = SignedLongLong;
3242 UIntMaxType = UnsignedLongLong;
3243 Int64Type = SignedLongLong;
3244 }
3245};
3246} // end anonymous namespace
3247
3248namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003249class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3250public:
3251 BitrigX86_64TargetInfo(const std::string& triple)
3252 : BitrigTargetInfo<X86_64TargetInfo>(triple) {
3253 IntMaxType = SignedLongLong;
3254 UIntMaxType = UnsignedLongLong;
3255 Int64Type = SignedLongLong;
3256 }
3257};
Tim Northoverc264e162013-01-31 12:13:10 +00003258}
3259
3260namespace {
3261class AArch64TargetInfo : public TargetInfo {
3262 static const char * const GCCRegNames[];
3263 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3264public:
3265 AArch64TargetInfo(const std::string& triple) : TargetInfo(triple) {
3266 BigEndian = false;
3267 LongWidth = LongAlign = 64;
3268 LongDoubleWidth = LongDoubleAlign = 128;
3269 PointerWidth = PointerAlign = 64;
3270 SuitableAlign = 128;
3271 DescriptionString = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3272 "i64:64:64-i128:128:128-f32:32:32-f64:64:64-"
3273 "f128:128:128-n32:64-S128";
3274
3275 WCharType = UnsignedInt;
3276 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3277
Tim Northover6a93c862013-02-18 12:11:32 +00003278 // AArch64 backend supports 64-bit operations at the moment. In principle
3279 // 128-bit is possible if register-pairs are used.
3280 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3281
Tim Northoverc264e162013-01-31 12:13:10 +00003282 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3283 }
3284 virtual void getTargetDefines(const LangOptions &Opts,
3285 MacroBuilder &Builder) const {
3286 // GCC defines theses currently
3287 Builder.defineMacro("__aarch64__");
3288 Builder.defineMacro("__AARCH64EL__");
3289
3290 // ACLE predefines. Many can only have one possible value on v8 AArch64.
3291
3292 // FIXME: these were written based on an unreleased version of a 32-bit ACLE
3293 // which was intended to be compatible with a 64-bit implementation. They
3294 // will need updating when a real 64-bit ACLE exists. Particularly pressing
3295 // instances are: __AARCH_ISA_A32, __AARCH_ISA_T32, __ARCH_PCS.
3296 Builder.defineMacro("__AARCH_ACLE", "101");
3297 Builder.defineMacro("__AARCH", "8");
3298 Builder.defineMacro("__AARCH_PROFILE", "'A'");
3299
3300 Builder.defineMacro("__AARCH_FEATURE_UNALIGNED");
3301 Builder.defineMacro("__AARCH_FEATURE_CLZ");
3302 Builder.defineMacro("__AARCH_FEATURE_FMA");
3303
3304 // FIXME: ACLE 1.1 reserves bit 4. Will almost certainly come to mean
3305 // 128-bit LDXP present, at which point this becomes 0x1f.
3306 Builder.defineMacro("__AARCH_FEATURE_LDREX", "0xf");
3307
3308 // 0xe implies support for half, single and double precision operations.
3309 Builder.defineMacro("__AARCH_FP", "0xe");
3310
3311 // PCS specifies this for SysV variants, which is all we support. Other ABIs
3312 // may choose __AARCH_FP16_FORMAT_ALTERNATIVE.
3313 Builder.defineMacro("__AARCH_FP16_FORMAT_IEEE");
3314
3315 if (Opts.FastMath || Opts.FiniteMathOnly)
3316 Builder.defineMacro("__AARCH_FP_FAST");
3317
3318 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
3319 Builder.defineMacro("__AARCH_FP_FENV_ROUNDING");
3320
3321 Builder.defineMacro("__AARCH_SIZEOF_WCHAR_T",
3322 Opts.ShortWChar ? "2" : "4");
3323
3324 Builder.defineMacro("__AARCH_SIZEOF_MINIMAL_ENUM",
3325 Opts.ShortEnums ? "1" : "4");
3326
3327 if (BigEndian)
3328 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3329 }
3330 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3331 unsigned &NumRecords) const {
3332 Records = 0;
3333 NumRecords = 0;
3334 }
3335 virtual bool hasFeature(StringRef Feature) const {
3336 return Feature == "aarch64";
3337 }
3338 virtual void getGCCRegNames(const char * const *&Names,
3339 unsigned &NumNames) const;
3340 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3341 unsigned &NumAliases) const;
3342
3343 virtual bool isCLZForZeroUndef() const { return false; }
3344
3345 virtual bool validateAsmConstraint(const char *&Name,
3346 TargetInfo::ConstraintInfo &Info) const {
3347 switch (*Name) {
3348 default: return false;
3349 case 'w': // An FP/SIMD vector register
3350 Info.setAllowsRegister();
3351 return true;
3352 case 'I': // Constant that can be used with an ADD instruction
3353 case 'J': // Constant that can be used with a SUB instruction
3354 case 'K': // Constant that can be used with a 32-bit logical instruction
3355 case 'L': // Constant that can be used with a 64-bit logical instruction
3356 case 'M': // Constant that can be used as a 32-bit MOV immediate
3357 case 'N': // Constant that can be used as a 64-bit MOV immediate
3358 case 'Y': // Floating point constant zero
3359 case 'Z': // Integer constant zero
3360 return true;
3361 case 'Q': // A memory reference with base register and no offset
3362 Info.setAllowsMemory();
3363 return true;
3364 case 'S': // A symbolic address
3365 Info.setAllowsRegister();
3366 return true;
3367 case 'U':
3368 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3369 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3370 // Usa: An absolute symbolic address
3371 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3372 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3373 }
3374 }
3375
3376 virtual const char *getClobbers() const {
3377 // There are no AArch64 clobbers shared by all asm statements.
3378 return "";
3379 }
3380
3381 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3382 return TargetInfo::AArch64ABIBuiltinVaList;
3383 }
3384};
3385
3386const char * const AArch64TargetInfo::GCCRegNames[] = {
3387 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3388 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3389 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3390 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3391
3392 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3393 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3394 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3395 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3396
3397 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3398 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3399 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3400 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3401
3402 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3403 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3404 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3405 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3406
3407 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3408 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3409 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3410 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3411
3412 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3413 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3414 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3415 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3416
3417 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3418 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3419 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3420 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3421};
3422
3423void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3424 unsigned &NumNames) const {
3425 Names = GCCRegNames;
3426 NumNames = llvm::array_lengthof(GCCRegNames);
3427}
3428
3429const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3430 { { "x16" }, "ip0"},
3431 { { "x17" }, "ip1"},
3432 { { "x29" }, "fp" },
3433 { { "x30" }, "lr" }
3434};
3435
3436void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3437 unsigned &NumAliases) const {
3438 Aliases = GCCRegAliases;
3439 NumAliases = llvm::array_lengthof(GCCRegAliases);
3440
3441}
Eli Friedman42f74f22012-08-08 23:57:20 +00003442} // end anonymous namespace
3443
3444namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00003445class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003446 // Possible FPU choices.
3447 enum FPUMode {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003448 VFP2FPU = (1 << 0),
3449 VFP3FPU = (1 << 1),
3450 VFP4FPU = (1 << 2),
3451 NeonFPU = (1 << 3)
Daniel Dunbara91320b2009-12-21 23:28:17 +00003452 };
3453
3454 static bool FPUModeIsVFP(FPUMode Mode) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003455 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU);
Daniel Dunbara91320b2009-12-21 23:28:17 +00003456 }
3457
3458 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3459 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003460
Daniel Dunbareac7c532009-12-18 18:42:37 +00003461 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003462
Bob Wilsoncfaab002012-09-29 23:52:52 +00003463 unsigned FPU : 4;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003464
Logan Chieneae5a8202012-10-10 06:56:20 +00003465 unsigned IsAAPCS : 1;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003466 unsigned IsThumb : 1;
3467
3468 // Initialized via features.
3469 unsigned SoftFloat : 1;
3470 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003471
Chris Lattner2752c012010-03-03 19:03:45 +00003472 static const Builtin::Info BuiltinInfo[];
3473
Chris Lattner393ff042008-04-21 18:56:49 +00003474public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003475 ARMTargetInfo(const std::string &TripleStr)
Logan Chieneae5a8202012-10-10 06:56:20 +00003476 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s"), IsAAPCS(true)
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003477 {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003478 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003479 SizeType = UnsignedInt;
3480 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00003481 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3482 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003483
Chris Lattner9bffb072010-04-23 16:29:58 +00003484 // {} in inline assembly are neon specifiers, not assembly variant
3485 // specifiers.
3486 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00003487
Daniel Dunbareac7c532009-12-18 18:42:37 +00003488 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00003489 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003490 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003491 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3492 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003493 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
3494 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003495 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003496 } else {
3497 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3498 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003499 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003500 }
John McCallee79a4c2010-08-21 22:46:04 +00003501
3502 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00003503 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00003504
3505 // ARM has atomics up to 8 bytes
3506 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
3507 MaxAtomicPromoteWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00003508
3509 // Do force alignment of members that follow zero length bitfields. If
3510 // the alignment of the zero-length bitfield is greater than the member
3511 // that follows it, `bar', `bar' will be aligned as the type of the
3512 // zero length bitfield.
3513 UseZeroLengthBitfieldAlignment = true;
Eli Friedman61538a72008-05-20 14:21:01 +00003514 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003515 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00003516 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003517 ABI = Name;
3518
Daniel Dunbara2a41612009-09-14 00:02:24 +00003519 // The defaults (above) are for AAPCS, check if we need to change them.
3520 //
3521 // FIXME: We need support for -meabi... we could just mangle it into the
3522 // name.
3523 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003524 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindola27fa2362012-12-13 04:17:14 +00003525 // size_t is unsigned int on FreeBSD.
3526 if (getTriple().getOS() != llvm::Triple::FreeBSD)
3527 SizeType = UnsignedLong;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003528
James Molloya6d81f92011-11-23 13:35:08 +00003529 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3530 WCharType = SignedInt;
3531
Daniel Dunbar684de632010-04-22 16:14:54 +00003532 // Do not respect the alignment of bit-field types when laying out
3533 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3534 UseBitFieldTypeAlignment = false;
3535
Chad Rosier61a62212011-08-04 01:21:14 +00003536 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00003537 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3538 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00003539 ZeroLengthBitfieldBoundary = 32;
3540
Logan Chieneae5a8202012-10-10 06:56:20 +00003541 IsAAPCS = false;
3542
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003543 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003544 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3545 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003546 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 +00003547 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003548 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003549 } else {
3550 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 +00003551 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003552 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003553 }
3554
Chad Rosier9f1210c2011-07-26 07:03:04 +00003555 // FIXME: Override "preferred align" for double and long long.
David Tweedb16abb12012-10-25 13:33:01 +00003556 } else if (Name == "aapcs" || Name == "aapcs-vfp") {
Logan Chieneae5a8202012-10-10 06:56:20 +00003557 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003558 // FIXME: Enumerated types are variable width in straight AAPCS.
3559 } else if (Name == "aapcs-linux") {
Logan Chieneae5a8202012-10-10 06:56:20 +00003560 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003561 } else
3562 return false;
3563
3564 return true;
3565 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003566
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003567 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003568 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3569 Features["vfp2"] = true;
Bob Wilsoncfaab002012-09-29 23:52:52 +00003570 else if (CPU == "cortex-a8" || CPU == "cortex-a15" ||
3571 CPU == "cortex-a9" || CPU == "cortex-a9-mp")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003572 Features["neon"] = true;
Bob Wilsonfc553452013-03-04 22:37:46 +00003573 else if (CPU == "swift" || CPU == "cortex-a7") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003574 Features["vfp4"] = true;
3575 Features["neon"] = true;
3576 }
Daniel Dunbara91320b2009-12-21 23:28:17 +00003577 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00003578
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003579 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00003580 StringRef Name,
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003581 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00003582 if (Name == "soft-float" || Name == "soft-float-abi" ||
Bob Wilsoncfaab002012-09-29 23:52:52 +00003583 Name == "vfp2" || Name == "vfp3" || Name == "vfp4" || Name == "neon" ||
3584 Name == "d16" || Name == "neonfp") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003585 Features[Name] = Enabled;
3586 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003587 return false;
3588
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003589 return true;
3590 }
3591
3592 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003593 FPU = 0;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003594 SoftFloat = SoftFloatABI = false;
3595 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3596 if (Features[i] == "+soft-float")
3597 SoftFloat = true;
3598 else if (Features[i] == "+soft-float-abi")
3599 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003600 else if (Features[i] == "+vfp2")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003601 FPU |= VFP2FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003602 else if (Features[i] == "+vfp3")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003603 FPU |= VFP3FPU;
3604 else if (Features[i] == "+vfp4")
3605 FPU |= VFP4FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003606 else if (Features[i] == "+neon")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003607 FPU |= NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003608 }
3609
3610 // Remove front-end specific options which the backend handles differently.
3611 std::vector<std::string>::iterator it;
3612 it = std::find(Features.begin(), Features.end(), "+soft-float");
3613 if (it != Features.end())
3614 Features.erase(it);
3615 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3616 if (it != Features.end())
3617 Features.erase(it);
3618 }
3619
Douglas Gregore727d212012-01-30 06:38:25 +00003620 virtual bool hasFeature(StringRef Feature) const {
3621 return llvm::StringSwitch<bool>(Feature)
3622 .Case("arm", true)
3623 .Case("softfloat", SoftFloat)
3624 .Case("thumb", IsThumb)
3625 .Case("neon", FPU == NeonFPU && !SoftFloat &&
3626 StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
3627 .Default(false);
3628 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003629 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00003630 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00003631 return llvm::StringSwitch<const char*>(Name)
3632 .Cases("arm8", "arm810", "4")
3633 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3634 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3635 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3636 .Case("ep9312", "4T")
3637 .Cases("arm10tdmi", "arm1020t", "5T")
3638 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3639 .Case("arm926ej-s", "5TEJ")
3640 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3641 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003642 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003643 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003644 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003645 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonfc553452013-03-04 22:37:46 +00003646 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
3647 .Cases("cortex-a9", "cortex-a15", "7A")
Quentin Colombetab137512012-12-21 17:57:47 +00003648 .Case("cortex-r5", "7R")
Bob Wilson336bfa32012-09-29 23:52:50 +00003649 .Case("cortex-a9-mp", "7F")
3650 .Case("swift", "7S")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003651 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00003652 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003653 .Default(0);
3654 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003655 static const char *getCPUProfile(StringRef Name) {
3656 return llvm::StringSwitch<const char*>(Name)
3657 .Cases("cortex-a8", "cortex-a9", "A")
3658 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Quentin Colombetab137512012-12-21 17:57:47 +00003659 .Case("cortex-r5", "R")
Anton Korobeynikov8b0703d2012-09-08 08:22:13 +00003660 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003661 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003662 virtual bool setCPU(const std::string &Name) {
3663 if (!getCPUDefineSuffix(Name))
3664 return false;
3665
3666 CPU = Name;
3667 return true;
3668 }
Chris Lattner33328642009-03-20 15:52:06 +00003669 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003670 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00003671 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00003672 Builder.defineMacro("__arm");
3673 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003674
Chris Lattnerc0f59212009-03-02 22:27:17 +00003675 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00003676 Builder.defineMacro("__ARMEL__");
3677 Builder.defineMacro("__LITTLE_ENDIAN__");
3678 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003679
Chris Lattner5f9e2722011-07-23 10:55:15 +00003680 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00003681 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003682 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3683 StringRef CPUProfile = getCPUProfile(CPU);
3684 if (!CPUProfile.empty())
3685 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3686
Mike Stump437bb4b2009-04-08 02:07:04 +00003687 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003688
Daniel Dunbareac7c532009-12-18 18:42:37 +00003689 // FIXME: It's more complicated than this and we don't really support
3690 // interworking.
3691 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00003692 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003693
David Tweedb16abb12012-10-25 13:33:01 +00003694 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Daniel Dunbar849289e2012-10-22 18:51:13 +00003695 // M-class CPUs on Darwin follow AAPCS, but not EABI.
Daniel Dunbar4d3ee9b2012-10-22 18:56:43 +00003696 if (!(getTriple().isOSDarwin() && CPUProfile == "M"))
Daniel Dunbar849289e2012-10-22 18:51:13 +00003697 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003698 Builder.defineMacro("__ARM_PCS", "1");
3699
David Tweedb16abb12012-10-25 13:33:01 +00003700 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003701 Builder.defineMacro("__ARM_PCS_VFP", "1");
3702 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003703
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003704 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00003705 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003706
3707 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00003708 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003709
Bob Wilson84f95cf2011-05-13 18:56:03 +00003710 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003711 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003712 Builder.defineMacro("__THUMBEL__");
3713 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00003714 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003715 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003716 }
3717
3718 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00003719 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00003720
Bob Wilsoncfaab002012-09-29 23:52:52 +00003721 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003722 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00003723 if (FPU & VFP2FPU)
3724 Builder.defineMacro("__ARM_VFPV2__");
3725 if (FPU & VFP3FPU)
3726 Builder.defineMacro("__ARM_VFPV3__");
3727 if (FPU & VFP4FPU)
3728 Builder.defineMacro("__ARM_VFPV4__");
3729 }
3730
Daniel Dunbara91320b2009-12-21 23:28:17 +00003731 // This only gets set when Neon instructions are actually available, unlike
3732 // the VFP define, hence the soft float and arch check. This is subtly
3733 // different from gcc, we follow the intent which was that it should be set
3734 // when Neon instructions are actually available.
Bob Wilsoncfaab002012-09-29 23:52:52 +00003735 if ((FPU & NeonFPU) && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003736 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00003737 }
3738 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3739 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00003740 Records = BuiltinInfo;
3741 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00003742 }
Bob Wilson8b30a932012-01-26 22:14:27 +00003743 virtual bool isCLZForZeroUndef() const { return false; }
Meador Ingec5613b22012-06-16 03:34:49 +00003744 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chieneae5a8202012-10-10 06:56:20 +00003745 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner393ff042008-04-21 18:56:49 +00003746 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003747 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003748 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003749 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003750 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003751 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00003752 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003753 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00003754 default: break;
Nate Begemanad487f42008-04-22 05:03:19 +00003755 case 'l': // r0-r7
3756 case 'h': // r8-r15
3757 case 'w': // VFP Floating point register single precision
3758 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00003759 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00003760 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00003761 case 'Q': // A memory address that is a single base register.
3762 Info.setAllowsMemory();
3763 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00003764 case 'U': // a memory reference...
3765 switch (Name[1]) {
3766 case 'q': // ...ARMV4 ldrsb
3767 case 'v': // ...VFP load/store (reg+constant offset)
3768 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00003769 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00003770 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00003771 case 'n': // valid address for Neon doubleword vector load/store
3772 case 'm': // valid address for Neon element and structure load/store
3773 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00003774 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00003775 Info.setAllowsMemory();
3776 Name++;
3777 return true;
3778 }
Nate Begemanad487f42008-04-22 05:03:19 +00003779 }
Chris Lattner393ff042008-04-21 18:56:49 +00003780 return false;
3781 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00003782 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00003783 std::string R;
3784 switch (*Constraint) {
3785 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00003786 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00003787 Constraint++;
3788 break;
Eric Christopher283f4472011-06-17 00:40:18 +00003789 case 'p': // 'p' should be translated to 'r' by default.
3790 R = std::string("r");
3791 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00003792 default:
3793 return std::string(1, *Constraint);
3794 }
3795 return R;
3796 }
Bill Wendling50d46ca2012-10-25 23:28:48 +00003797 virtual bool validateConstraintModifier(StringRef Constraint,
3798 const char Modifier,
3799 unsigned Size) const {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00003800 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00003801 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00003802
Bill Wendling50d46ca2012-10-25 23:28:48 +00003803 // Strip off constraint modifiers.
3804 while (Constraint[0] == '=' ||
3805 Constraint[0] == '+' ||
3806 Constraint[0] == '&')
3807 Constraint = Constraint.substr(1);
3808
3809 switch (Constraint[0]) {
3810 default: break;
3811 case 'r': {
3812 switch (Modifier) {
3813 default:
Bill Wendling6e6330c2012-11-30 23:46:56 +00003814 return isInOut || (isOutput && Size >= 32) ||
3815 (!isOutput && !isInOut && Size <= 32);
Bill Wendling50d46ca2012-10-25 23:28:48 +00003816 case 'q':
3817 // A register of size 32 cannot fit a vector type.
3818 return false;
3819 }
3820 }
3821 }
3822
3823 return true;
3824 }
Chris Lattner393ff042008-04-21 18:56:49 +00003825 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00003826 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00003827 return "";
3828 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003829
3830 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3831 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
3832 }
Logan Chiena8f7a972013-02-23 04:24:36 +00003833
3834 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
3835 if (RegNo == 0) return 0;
3836 if (RegNo == 1) return 1;
3837 return -1;
3838 }
Chris Lattner393ff042008-04-21 18:56:49 +00003839};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003840
3841const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003842 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003843 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003844 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
3845
3846 // Float registers
3847 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3848 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3849 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003850 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003851
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003852 // Double registers
3853 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3854 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00003855 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3856 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003857
3858 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00003859 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3860 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003861};
3862
3863void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003864 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003865 Names = GCCRegNames;
3866 NumNames = llvm::array_lengthof(GCCRegNames);
3867}
3868
3869const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003870 { { "a1" }, "r0" },
3871 { { "a2" }, "r1" },
3872 { { "a3" }, "r2" },
3873 { { "a4" }, "r3" },
3874 { { "v1" }, "r4" },
3875 { { "v2" }, "r5" },
3876 { { "v3" }, "r6" },
3877 { { "v4" }, "r7" },
3878 { { "v5" }, "r8" },
3879 { { "v6", "rfp" }, "r9" },
3880 { { "sl" }, "r10" },
3881 { { "fp" }, "r11" },
3882 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003883 { { "r13" }, "sp" },
3884 { { "r14" }, "lr" },
3885 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003886 // The S, D and Q registers overlap, but aren't really aliases; we
3887 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003888};
3889
3890void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3891 unsigned &NumAliases) const {
3892 Aliases = GCCRegAliases;
3893 NumAliases = llvm::array_lengthof(GCCRegAliases);
3894}
Chris Lattner2752c012010-03-03 19:03:45 +00003895
3896const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00003897#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00003898#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00003899 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00003900#include "clang/Basic/BuiltinsARM.def"
3901};
Chris Lattner393ff042008-04-21 18:56:49 +00003902} // end anonymous namespace.
3903
Eli Friedmana9f54962008-08-20 07:44:10 +00003904namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00003905class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003906 public DarwinTargetInfo<ARMTargetInfo> {
3907protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00003908 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00003909 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00003910 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00003911 }
Eli Friedmana9f54962008-08-20 07:44:10 +00003912
Torok Edwin5f6c1942009-06-30 17:10:35 +00003913public:
Mike Stump1eb44332009-09-09 15:08:12 +00003914 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00003915 : DarwinTargetInfo<ARMTargetInfo>(triple) {
3916 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00003917 // iOS always has 64-bit atomic instructions.
3918 // FIXME: This should be based off of the target features in ARMTargetInfo.
3919 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00003920
3921 // Darwin on iOS uses a variant of the ARM C++ ABI.
3922 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar350b9f32010-05-27 07:00:26 +00003923 }
Eli Friedmana9f54962008-08-20 07:44:10 +00003924};
3925} // end anonymous namespace.
3926
Tony Linthicum96319392011-12-12 21:14:55 +00003927
3928namespace {
3929// Hexagon abstract base class
3930class HexagonTargetInfo : public TargetInfo {
3931 static const Builtin::Info BuiltinInfo[];
3932 static const char * const GCCRegNames[];
3933 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3934 std::string CPU;
3935public:
3936 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003937 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00003938 DescriptionString = ("e-p:32:32:32-"
Anshuman Dasgupta1a090f12013-01-02 21:25:57 +00003939 "i64:64:64-i32:32:32-i16:16:16-i1:32:32-"
Sirish Pande5f9688b2012-05-10 20:19:54 +00003940 "f64:64:64-f32:32:32-a0:0-n32");
Tony Linthicum96319392011-12-12 21:14:55 +00003941
3942 // {} in inline assembly are packet specifiers, not assembly variant
3943 // specifiers.
3944 NoAsmVariants = true;
3945 }
3946
3947 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3948 unsigned &NumRecords) const {
3949 Records = BuiltinInfo;
3950 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3951 }
3952
3953 virtual bool validateAsmConstraint(const char *&Name,
3954 TargetInfo::ConstraintInfo &Info) const {
3955 return true;
3956 }
3957
3958 virtual void getTargetDefines(const LangOptions &Opts,
3959 MacroBuilder &Builder) const;
3960
Douglas Gregore727d212012-01-30 06:38:25 +00003961 virtual bool hasFeature(StringRef Feature) const {
3962 return Feature == "hexagon";
3963 }
3964
Meador Ingec5613b22012-06-16 03:34:49 +00003965 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3966 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00003967 }
3968 virtual void getGCCRegNames(const char * const *&Names,
3969 unsigned &NumNames) const;
3970 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3971 unsigned &NumAliases) const;
3972 virtual const char *getClobbers() const {
3973 return "";
3974 }
Sebastian Pop43115d42012-01-13 20:37:10 +00003975
3976 static const char *getHexagonCPUSuffix(StringRef Name) {
3977 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop43115d42012-01-13 20:37:10 +00003978 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00003979 .Case("hexagonv5", "5")
Sebastian Pop43115d42012-01-13 20:37:10 +00003980 .Default(0);
3981 }
3982
Tony Linthicum96319392011-12-12 21:14:55 +00003983 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00003984 if (!getHexagonCPUSuffix(Name))
3985 return false;
3986
Tony Linthicum96319392011-12-12 21:14:55 +00003987 CPU = Name;
3988 return true;
3989 }
3990};
3991
3992void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
3993 MacroBuilder &Builder) const {
3994 Builder.defineMacro("qdsp6");
3995 Builder.defineMacro("__qdsp6", "1");
3996 Builder.defineMacro("__qdsp6__", "1");
3997
3998 Builder.defineMacro("hexagon");
3999 Builder.defineMacro("__hexagon", "1");
4000 Builder.defineMacro("__hexagon__", "1");
4001
4002 if(CPU == "hexagonv1") {
4003 Builder.defineMacro("__HEXAGON_V1__");
4004 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4005 if(Opts.HexagonQdsp6Compat) {
4006 Builder.defineMacro("__QDSP6_V1__");
4007 Builder.defineMacro("__QDSP6_ARCH__", "1");
4008 }
4009 }
4010 else if(CPU == "hexagonv2") {
4011 Builder.defineMacro("__HEXAGON_V2__");
4012 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4013 if(Opts.HexagonQdsp6Compat) {
4014 Builder.defineMacro("__QDSP6_V2__");
4015 Builder.defineMacro("__QDSP6_ARCH__", "2");
4016 }
4017 }
4018 else if(CPU == "hexagonv3") {
4019 Builder.defineMacro("__HEXAGON_V3__");
4020 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4021 if(Opts.HexagonQdsp6Compat) {
4022 Builder.defineMacro("__QDSP6_V3__");
4023 Builder.defineMacro("__QDSP6_ARCH__", "3");
4024 }
4025 }
4026 else if(CPU == "hexagonv4") {
4027 Builder.defineMacro("__HEXAGON_V4__");
4028 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4029 if(Opts.HexagonQdsp6Compat) {
4030 Builder.defineMacro("__QDSP6_V4__");
4031 Builder.defineMacro("__QDSP6_ARCH__", "4");
4032 }
4033 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00004034 else if(CPU == "hexagonv5") {
4035 Builder.defineMacro("__HEXAGON_V5__");
4036 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4037 if(Opts.HexagonQdsp6Compat) {
4038 Builder.defineMacro("__QDSP6_V5__");
4039 Builder.defineMacro("__QDSP6_ARCH__", "5");
4040 }
4041 }
Tony Linthicum96319392011-12-12 21:14:55 +00004042}
4043
4044const char * const HexagonTargetInfo::GCCRegNames[] = {
4045 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4046 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4047 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4048 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4049 "p0", "p1", "p2", "p3",
4050 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4051};
4052
4053void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4054 unsigned &NumNames) const {
4055 Names = GCCRegNames;
4056 NumNames = llvm::array_lengthof(GCCRegNames);
4057}
4058
4059
4060const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4061 { { "sp" }, "r29" },
4062 { { "fp" }, "r30" },
4063 { { "lr" }, "r31" },
4064 };
4065
4066void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4067 unsigned &NumAliases) const {
4068 Aliases = GCCRegAliases;
4069 NumAliases = llvm::array_lengthof(GCCRegAliases);
4070}
4071
4072
4073const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4074#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4075#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4076 ALL_LANGUAGES },
4077#include "clang/Basic/BuiltinsHexagon.def"
4078};
4079}
4080
4081
Reid Spencer5f016e22007-07-11 17:01:13 +00004082namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00004083class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00004084 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4085 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004086 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00004087public:
Eli Friedman01b86682008-08-20 07:28:14 +00004088 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
4089 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00004090 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 +00004091 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00004092 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004093 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00004094 StringRef Name,
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004095 bool Enabled) const {
4096 if (Name == "soft-float")
4097 Features[Name] = Enabled;
4098 else
4099 return false;
4100
4101 return true;
4102 }
4103 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
4104 SoftFloat = false;
4105 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4106 if (Features[i] == "+soft-float")
4107 SoftFloat = true;
4108 }
Chris Lattner33328642009-03-20 15:52:06 +00004109 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004110 MacroBuilder &Builder) const {
4111 DefineStd(Builder, "sparc", Opts);
4112 Builder.defineMacro("__sparcv8");
4113 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004114
4115 if (SoftFloat)
4116 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00004117 }
Douglas Gregore727d212012-01-30 06:38:25 +00004118
4119 virtual bool hasFeature(StringRef Feature) const {
4120 return llvm::StringSwitch<bool>(Feature)
4121 .Case("softfloat", SoftFloat)
4122 .Case("sparc", true)
4123 .Default(false);
4124 }
4125
Gabor Greif26658672008-02-21 16:29:08 +00004126 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4127 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004128 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00004129 }
Meador Ingec5613b22012-06-16 03:34:49 +00004130 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4131 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif26658672008-02-21 16:29:08 +00004132 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004133 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00004134 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004135 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00004136 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00004137 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00004138 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004139 // FIXME: Implement!
4140 return false;
Gabor Greif26658672008-02-21 16:29:08 +00004141 }
4142 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00004143 // FIXME: Implement!
4144 return "";
Gabor Greif26658672008-02-21 16:29:08 +00004145 }
4146};
4147
Chris Lattnere957f532009-01-27 01:58:38 +00004148const char * const SparcV8TargetInfo::GCCRegNames[] = {
4149 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4150 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4151 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4152 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4153};
4154
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004155void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00004156 unsigned &NumNames) const {
4157 Names = GCCRegNames;
4158 NumNames = llvm::array_lengthof(GCCRegNames);
4159}
4160
4161const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004162 { { "g0" }, "r0" },
4163 { { "g1" }, "r1" },
4164 { { "g2" }, "r2" },
4165 { { "g3" }, "r3" },
4166 { { "g4" }, "r4" },
4167 { { "g5" }, "r5" },
4168 { { "g6" }, "r6" },
4169 { { "g7" }, "r7" },
4170 { { "o0" }, "r8" },
4171 { { "o1" }, "r9" },
4172 { { "o2" }, "r10" },
4173 { { "o3" }, "r11" },
4174 { { "o4" }, "r12" },
4175 { { "o5" }, "r13" },
4176 { { "o6", "sp" }, "r14" },
4177 { { "o7" }, "r15" },
4178 { { "l0" }, "r16" },
4179 { { "l1" }, "r17" },
4180 { { "l2" }, "r18" },
4181 { { "l3" }, "r19" },
4182 { { "l4" }, "r20" },
4183 { { "l5" }, "r21" },
4184 { { "l6" }, "r22" },
4185 { { "l7" }, "r23" },
4186 { { "i0" }, "r24" },
4187 { { "i1" }, "r25" },
4188 { { "i2" }, "r26" },
4189 { { "i3" }, "r27" },
4190 { { "i4" }, "r28" },
4191 { { "i5" }, "r29" },
4192 { { "i6", "fp" }, "r30" },
4193 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00004194};
4195
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004196void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00004197 unsigned &NumAliases) const {
4198 Aliases = GCCRegAliases;
4199 NumAliases = llvm::array_lengthof(GCCRegAliases);
4200}
Gabor Greif26658672008-02-21 16:29:08 +00004201} // end anonymous namespace.
4202
Eli Friedman01b86682008-08-20 07:28:14 +00004203namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004204class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4205public:
4206 AuroraUXSparcV8TargetInfo(const std::string& triple) :
4207 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
4208 SizeType = UnsignedInt;
4209 PtrDiffType = SignedInt;
4210 }
4211};
Torok Edwin5f6c1942009-06-30 17:10:35 +00004212class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00004213public:
4214 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00004215 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00004216 SizeType = UnsignedInt;
4217 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00004218 }
4219};
4220} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00004221
Chris Lattner2621fd12008-05-08 05:58:21 +00004222namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004223 class MSP430TargetInfo : public TargetInfo {
4224 static const char * const GCCRegNames[];
4225 public:
4226 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004227 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004228 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00004229 IntWidth = 16; IntAlign = 16;
4230 LongWidth = 32; LongLongWidth = 64;
4231 LongAlign = LongLongAlign = 16;
4232 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004233 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004234 SizeType = UnsignedInt;
4235 IntMaxType = SignedLong;
4236 UIntMaxType = UnsignedLong;
4237 IntPtrType = SignedShort;
4238 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00004239 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00004240 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004241 }
4242 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004243 MacroBuilder &Builder) const {
4244 Builder.defineMacro("MSP430");
4245 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004246 // FIXME: defines for different 'flavours' of MCU
4247 }
4248 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4249 unsigned &NumRecords) const {
4250 // FIXME: Implement.
4251 Records = 0;
4252 NumRecords = 0;
4253 }
Douglas Gregore727d212012-01-30 06:38:25 +00004254 virtual bool hasFeature(StringRef Feature) const {
4255 return Feature == "msp430";
4256 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004257 virtual void getGCCRegNames(const char * const *&Names,
4258 unsigned &NumNames) const;
4259 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4260 unsigned &NumAliases) const {
4261 // No aliases.
4262 Aliases = 0;
4263 NumAliases = 0;
4264 }
4265 virtual bool validateAsmConstraint(const char *&Name,
4266 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00004267 // No target constraints for now.
4268 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004269 }
4270 virtual const char *getClobbers() const {
4271 // FIXME: Is this really right?
4272 return "";
4273 }
Meador Ingec5613b22012-06-16 03:34:49 +00004274 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004275 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00004276 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004277 }
4278 };
4279
4280 const char * const MSP430TargetInfo::GCCRegNames[] = {
4281 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4282 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4283 };
4284
4285 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4286 unsigned &NumNames) const {
4287 Names = GCCRegNames;
4288 NumNames = llvm::array_lengthof(GCCRegNames);
4289 }
4290}
4291
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00004292namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00004293
Mike Stump1eb44332009-09-09 15:08:12 +00004294 // LLVM and Clang cannot be used directly to output native binaries for
4295 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00004296 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00004297 //
4298 // TCE uses the llvm bitcode as input and uses it for generating customized
4299 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00004300 // publicly available in http://tce.cs.tut.fi
4301
Eli Friedman209f5bb2011-10-07 19:51:42 +00004302 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4303 3, // opencl_global
4304 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00004305 5, // opencl_constant
4306 0, // cuda_device
4307 0, // cuda_constant
4308 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00004309 };
4310
Eli Friedmanb63decf2009-08-19 20:47:07 +00004311 class TCETargetInfo : public TargetInfo{
4312 public:
4313 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
4314 TLSSupported = false;
4315 IntWidth = 32;
4316 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004317 PointerWidth = 32;
4318 IntAlign = 32;
4319 LongAlign = LongLongAlign = 32;
4320 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004321 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004322 SizeType = UnsignedInt;
4323 IntMaxType = SignedLong;
4324 UIntMaxType = UnsignedLong;
4325 IntPtrType = SignedInt;
4326 PtrDiffType = SignedInt;
4327 FloatWidth = 32;
4328 FloatAlign = 32;
4329 DoubleWidth = 32;
4330 DoubleAlign = 32;
4331 LongDoubleWidth = 32;
4332 LongDoubleAlign = 32;
4333 FloatFormat = &llvm::APFloat::IEEEsingle;
4334 DoubleFormat = &llvm::APFloat::IEEEsingle;
4335 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00004336 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
4337 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00004338 "f32:32:32-f64:32:32-v64:32:32-"
4339 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00004340 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004341 }
4342
4343 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004344 MacroBuilder &Builder) const {
4345 DefineStd(Builder, "tce", Opts);
4346 Builder.defineMacro("__TCE__");
4347 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00004348 }
Douglas Gregore727d212012-01-30 06:38:25 +00004349 virtual bool hasFeature(StringRef Feature) const {
4350 return Feature == "tce";
4351 }
4352
Eli Friedmanb63decf2009-08-19 20:47:07 +00004353 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4354 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00004355 virtual const char *getClobbers() const {
4356 return "";
4357 }
Meador Ingec5613b22012-06-16 03:34:49 +00004358 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4359 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004360 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00004361 virtual void getGCCRegNames(const char * const *&Names,
4362 unsigned &NumNames) const {}
4363 virtual bool validateAsmConstraint(const char *&Name,
4364 TargetInfo::ConstraintInfo &info) const {
4365 return true;
4366 }
4367 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4368 unsigned &NumAliases) const {}
4369 };
4370}
4371
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004372namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004373class MipsTargetInfoBase : public TargetInfo {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004374 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004375 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004376 bool IsMips16;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004377 enum MipsFloatABI {
4378 HardFloat, SingleFloat, SoftFloat
4379 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004380 enum DspRevEnum {
4381 NoDSP, DSP1, DSP2
4382 } DspRev;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004383
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004384protected:
4385 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004386
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004387public:
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004388 MipsTargetInfoBase(const std::string& triple,
4389 const std::string& ABIStr,
4390 const std::string& CPUStr)
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004391 : TargetInfo(triple),
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004392 CPU(CPUStr),
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004393 IsMips16(false),
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004394 FloatABI(HardFloat),
Simon Atanasyana1b62272012-07-05 20:16:22 +00004395 DspRev(NoDSP),
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004396 ABI(ABIStr)
4397 {}
4398
Eric Christophered734732010-03-02 02:41:08 +00004399 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004400 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00004401 virtual bool setCPU(const std::string &Name) {
4402 CPU = Name;
4403 return true;
4404 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004405 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00004406 Features[ABI] = true;
4407 Features[CPU] = true;
4408 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004409
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004410 virtual void getTargetDefines(const LangOptions &Opts,
4411 MacroBuilder &Builder) const {
Simon Atanasyand4935a02012-08-29 19:14:58 +00004412 DefineStd(Builder, "mips", Opts);
4413 Builder.defineMacro("_mips");
4414 Builder.defineMacro("__REGISTER_PREFIX__", "");
4415
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004416 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004417 case HardFloat:
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004418 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004419 break;
4420 case SingleFloat:
4421 Builder.defineMacro("__mips_hard_float", Twine(1));
4422 Builder.defineMacro("__mips_single_float", Twine(1));
4423 break;
4424 case SoftFloat:
4425 Builder.defineMacro("__mips_soft_float", Twine(1));
4426 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004427 }
Simon Atanasyan90913892012-04-05 19:28:31 +00004428
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004429 if (IsMips16)
4430 Builder.defineMacro("__mips16", Twine(1));
4431
Simon Atanasyana1b62272012-07-05 20:16:22 +00004432 switch (DspRev) {
4433 default:
4434 break;
4435 case DSP1:
4436 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4437 Builder.defineMacro("__mips_dsp", Twine(1));
4438 break;
4439 case DSP2:
4440 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4441 Builder.defineMacro("__mips_dspr2", Twine(1));
4442 Builder.defineMacro("__mips_dsp", Twine(1));
4443 break;
4444 }
4445
Simon Atanasyan90913892012-04-05 19:28:31 +00004446 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4447 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4448 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00004449
4450 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4451 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004452 }
4453
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004454 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4455 unsigned &NumRecords) const {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004456 Records = BuiltinInfo;
4457 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004458 }
Douglas Gregore727d212012-01-30 06:38:25 +00004459 virtual bool hasFeature(StringRef Feature) const {
4460 return Feature == "mips";
4461 }
Meador Ingec5613b22012-06-16 03:34:49 +00004462 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4463 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004464 }
4465 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004466 unsigned &NumNames) const {
4467 static const char * const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00004468 // CPU register names
4469 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004470 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4471 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4472 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004473 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4474 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004475 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4476 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4477 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4478 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004479 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004480 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
4481 "$fcc5","$fcc6","$fcc7"
4482 };
4483 Names = GCCRegNames;
4484 NumNames = llvm::array_lengthof(GCCRegNames);
4485 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004486 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004487 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004488 virtual bool validateAsmConstraint(const char *&Name,
4489 TargetInfo::ConstraintInfo &Info) const {
4490 switch (*Name) {
4491 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00004492 return false;
4493
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004494 case 'r': // CPU registers.
4495 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4496 case 'y': // Equivalent to "r", backwards compatibility only.
4497 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00004498 case 'c': // $25 for indirect jumps
4499 case 'l': // lo register
4500 case 'x': // hilo register pair
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004501 Info.setAllowsRegister();
4502 return true;
Jack Carter97102302013-03-05 19:10:54 +00004503 case 'R': // An address that can be used in a non-macro load or store
Jack Carterd2ab6d32013-03-04 21:36:11 +00004504 Info.setAllowsMemory();
4505 return true;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004506 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004507 }
4508
4509 virtual const char *getClobbers() const {
4510 // FIXME: Implement!
4511 return "";
4512 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004513
4514 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
4515 StringRef Name,
4516 bool Enabled) const {
Simon Atanasyan8b2a5d22012-04-18 12:00:11 +00004517 if (Name == "soft-float" || Name == "single-float" ||
4518 Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
4519 Name == "mips32" || Name == "mips32r2" ||
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00004520 Name == "mips64" || Name == "mips64r2" ||
Simon Atanasyand797a852012-07-05 19:23:00 +00004521 Name == "mips16" || Name == "dsp" || Name == "dspr2") {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004522 Features[Name] = Enabled;
4523 return true;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004524 } else if (Name == "32") {
4525 Features["o32"] = Enabled;
4526 return true;
4527 } else if (Name == "64") {
4528 Features["n64"] = Enabled;
4529 return true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004530 }
4531 return false;
4532 }
4533
4534 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004535 IsMips16 = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004536 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004537 DspRev = NoDSP;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004538
4539 for (std::vector<std::string>::iterator it = Features.begin(),
4540 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004541 if (*it == "+single-float")
4542 FloatABI = SingleFloat;
4543 else if (*it == "+soft-float")
4544 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004545 else if (*it == "+mips16")
4546 IsMips16 = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004547 else if (*it == "+dsp")
4548 DspRev = std::max(DspRev, DSP1);
4549 else if (*it == "+dspr2")
4550 DspRev = std::max(DspRev, DSP2);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004551 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004552
4553 // Remove front-end specific option.
4554 std::vector<std::string>::iterator it =
4555 std::find(Features.begin(), Features.end(), "+soft-float");
4556 if (it != Features.end())
4557 Features.erase(it);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004558 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004559
4560 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4561 if (RegNo == 0) return 4;
4562 if (RegNo == 1) return 5;
4563 return -1;
4564 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004565};
4566
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004567const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
4568#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4569#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4570 ALL_LANGUAGES },
4571#include "clang/Basic/BuiltinsMips.def"
4572};
4573
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004574class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004575public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004576 Mips32TargetInfoBase(const std::string& triple) :
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004577 MipsTargetInfoBase(triple, "o32", "mips32") {
Akira Hatanaka148735e2011-11-05 01:48:34 +00004578 SizeType = UnsignedInt;
4579 PtrDiffType = SignedInt;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004580 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka148735e2011-11-05 01:48:34 +00004581 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004582 virtual bool setABI(const std::string &Name) {
4583 if ((Name == "o32") || (Name == "eabi")) {
4584 ABI = Name;
4585 return true;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004586 } else if (Name == "32") {
4587 ABI = "o32";
4588 return true;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004589 } else
4590 return false;
4591 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004592 virtual void getTargetDefines(const LangOptions &Opts,
4593 MacroBuilder &Builder) const {
4594 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004595
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004596 if (ABI == "o32") {
4597 Builder.defineMacro("__mips_o32");
4598 Builder.defineMacro("_ABIO32", "1");
4599 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
4600 }
4601 else if (ABI == "eabi")
4602 Builder.defineMacro("__mips_eabi");
4603 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004604 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004605 }
4606 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4607 unsigned &NumAliases) const {
4608 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4609 { { "at" }, "$1" },
4610 { { "v0" }, "$2" },
4611 { { "v1" }, "$3" },
4612 { { "a0" }, "$4" },
4613 { { "a1" }, "$5" },
4614 { { "a2" }, "$6" },
4615 { { "a3" }, "$7" },
4616 { { "t0" }, "$8" },
4617 { { "t1" }, "$9" },
4618 { { "t2" }, "$10" },
4619 { { "t3" }, "$11" },
4620 { { "t4" }, "$12" },
4621 { { "t5" }, "$13" },
4622 { { "t6" }, "$14" },
4623 { { "t7" }, "$15" },
4624 { { "s0" }, "$16" },
4625 { { "s1" }, "$17" },
4626 { { "s2" }, "$18" },
4627 { { "s3" }, "$19" },
4628 { { "s4" }, "$20" },
4629 { { "s5" }, "$21" },
4630 { { "s6" }, "$22" },
4631 { { "s7" }, "$23" },
4632 { { "t8" }, "$24" },
4633 { { "t9" }, "$25" },
4634 { { "k0" }, "$26" },
4635 { { "k1" }, "$27" },
4636 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00004637 { { "sp","$sp" }, "$29" },
4638 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004639 { { "ra" }, "$31" }
4640 };
4641 Aliases = GCCRegAliases;
4642 NumAliases = llvm::array_lengthof(GCCRegAliases);
4643 }
4644};
4645
4646class Mips32EBTargetInfo : public Mips32TargetInfoBase {
4647public:
4648 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
4649 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 +00004650 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004651 }
4652 virtual void getTargetDefines(const LangOptions &Opts,
4653 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004654 DefineStd(Builder, "MIPSEB", Opts);
4655 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004656 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004657 }
4658};
4659
4660class Mips32ELTargetInfo : public Mips32TargetInfoBase {
4661public:
4662 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004663 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004664 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 +00004665 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004666 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004667 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004668 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004669 DefineStd(Builder, "MIPSEL", Opts);
4670 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004671 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004672 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004673};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004674
4675class Mips64TargetInfoBase : public MipsTargetInfoBase {
4676 virtual void SetDescriptionString(const std::string &Name) = 0;
4677public:
4678 Mips64TargetInfoBase(const std::string& triple) :
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004679 MipsTargetInfoBase(triple, "n64", "mips64") {
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004680 LongWidth = LongAlign = 64;
4681 PointerWidth = PointerAlign = 64;
4682 LongDoubleWidth = LongDoubleAlign = 128;
4683 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00004684 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
4685 LongDoubleWidth = LongDoubleAlign = 64;
4686 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4687 }
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004688 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004689 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004690 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004691 virtual bool setABI(const std::string &Name) {
4692 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004693 if (Name == "n32") {
4694 LongWidth = LongAlign = 32;
4695 PointerWidth = PointerAlign = 32;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004696 ABI = Name;
4697 return true;
4698 } else if (Name == "n64") {
4699 ABI = Name;
4700 return true;
4701 } else if (Name == "64") {
4702 ABI = "n64";
4703 return true;
4704 } else
4705 return false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004706 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004707 virtual void getTargetDefines(const LangOptions &Opts,
4708 MacroBuilder &Builder) const {
4709 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004710
Simon Atanasyan600a5132012-08-29 20:50:11 +00004711 Builder.defineMacro("__mips64");
4712 Builder.defineMacro("__mips64__");
4713
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004714 if (ABI == "n32") {
4715 Builder.defineMacro("__mips_n32");
4716 Builder.defineMacro("_ABIN32", "2");
4717 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
4718 }
4719 else if (ABI == "n64") {
4720 Builder.defineMacro("__mips_n64");
4721 Builder.defineMacro("_ABI64", "3");
4722 Builder.defineMacro("_MIPS_SIM", "_ABI64");
4723 }
4724 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004725 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004726 }
4727 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4728 unsigned &NumAliases) const {
4729 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4730 { { "at" }, "$1" },
4731 { { "v0" }, "$2" },
4732 { { "v1" }, "$3" },
4733 { { "a0" }, "$4" },
4734 { { "a1" }, "$5" },
4735 { { "a2" }, "$6" },
4736 { { "a3" }, "$7" },
4737 { { "a4" }, "$8" },
4738 { { "a5" }, "$9" },
4739 { { "a6" }, "$10" },
4740 { { "a7" }, "$11" },
4741 { { "t0" }, "$12" },
4742 { { "t1" }, "$13" },
4743 { { "t2" }, "$14" },
4744 { { "t3" }, "$15" },
4745 { { "s0" }, "$16" },
4746 { { "s1" }, "$17" },
4747 { { "s2" }, "$18" },
4748 { { "s3" }, "$19" },
4749 { { "s4" }, "$20" },
4750 { { "s5" }, "$21" },
4751 { { "s6" }, "$22" },
4752 { { "s7" }, "$23" },
4753 { { "t8" }, "$24" },
4754 { { "t9" }, "$25" },
4755 { { "k0" }, "$26" },
4756 { { "k1" }, "$27" },
4757 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00004758 { { "sp","$sp" }, "$29" },
4759 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004760 { { "ra" }, "$31" }
4761 };
4762 Aliases = GCCRegAliases;
4763 NumAliases = llvm::array_lengthof(GCCRegAliases);
4764 }
4765};
4766
4767class Mips64EBTargetInfo : public Mips64TargetInfoBase {
4768 virtual void SetDescriptionString(const std::string &Name) {
4769 // Change DescriptionString only if ABI is n32.
4770 if (Name == "n32")
4771 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 +00004772 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004773 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004774 }
4775public:
4776 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
4777 // Default ABI is n64.
4778 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 +00004779 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004780 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004781 }
4782 virtual void getTargetDefines(const LangOptions &Opts,
4783 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004784 DefineStd(Builder, "MIPSEB", Opts);
4785 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004786 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004787 }
4788};
4789
4790class Mips64ELTargetInfo : public Mips64TargetInfoBase {
4791 virtual void SetDescriptionString(const std::string &Name) {
4792 // Change DescriptionString only if ABI is n32.
4793 if (Name == "n32")
4794 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 +00004795 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004796 "-v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004797 }
4798public:
4799 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004800 // Default ABI is n64.
4801 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004802 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 +00004803 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004804 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004805 }
4806 virtual void getTargetDefines(const LangOptions &Opts,
4807 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004808 DefineStd(Builder, "MIPSEL", Opts);
4809 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004810 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004811 }
4812};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004813} // end anonymous namespace.
4814
Ivan Krasinef05abd2011-08-24 20:22:22 +00004815namespace {
4816class PNaClTargetInfo : public TargetInfo {
4817public:
4818 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004819 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00004820 this->UserLabelPrefix = "";
4821 this->LongAlign = 32;
4822 this->LongWidth = 32;
4823 this->PointerAlign = 32;
4824 this->PointerWidth = 32;
4825 this->IntMaxType = TargetInfo::SignedLongLong;
4826 this->UIntMaxType = TargetInfo::UnsignedLongLong;
4827 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00004828 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00004829 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00004830 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00004831 this->SizeType = TargetInfo::UnsignedInt;
4832 this->PtrDiffType = TargetInfo::SignedInt;
4833 this->IntPtrType = TargetInfo::SignedInt;
David Meyerdd4a8892011-10-11 03:12:01 +00004834 this->RegParmMax = 2;
Ivan Krasinef05abd2011-08-24 20:22:22 +00004835 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
4836 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
4837 }
4838
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004839 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00004840 }
4841 virtual void getArchDefines(const LangOptions &Opts,
4842 MacroBuilder &Builder) const {
4843 Builder.defineMacro("__le32__");
4844 Builder.defineMacro("__pnacl__");
4845 }
4846 virtual void getTargetDefines(const LangOptions &Opts,
4847 MacroBuilder &Builder) const {
Jan Wen Voungdde3bdb2012-03-29 00:05:59 +00004848 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasinef05abd2011-08-24 20:22:22 +00004849 getArchDefines(Opts, Builder);
4850 }
Douglas Gregore727d212012-01-30 06:38:25 +00004851 virtual bool hasFeature(StringRef Feature) const {
4852 return Feature == "pnacl";
4853 }
Ivan Krasinef05abd2011-08-24 20:22:22 +00004854 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4855 unsigned &NumRecords) const {
4856 }
Meador Ingec5613b22012-06-16 03:34:49 +00004857 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4858 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00004859 }
4860 virtual void getGCCRegNames(const char * const *&Names,
4861 unsigned &NumNames) const;
4862 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4863 unsigned &NumAliases) const;
4864 virtual bool validateAsmConstraint(const char *&Name,
4865 TargetInfo::ConstraintInfo &Info) const {
4866 return false;
4867 }
4868
4869 virtual const char *getClobbers() const {
4870 return "";
4871 }
4872};
4873
4874void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
4875 unsigned &NumNames) const {
4876 Names = NULL;
4877 NumNames = 0;
4878}
4879
4880void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4881 unsigned &NumAliases) const {
4882 Aliases = NULL;
4883 NumAliases = 0;
4884}
4885} // end anonymous namespace.
4886
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004887namespace {
4888 static const unsigned SPIRAddrSpaceMap[] = {
4889 1, // opencl_global
4890 3, // opencl_local
4891 2, // opencl_constant
4892 0, // cuda_device
4893 0, // cuda_constant
4894 0 // cuda_shared
4895 };
4896 class SPIRTargetInfo : public TargetInfo {
4897 static const char * const GCCRegNames[];
4898 static const Builtin::Info BuiltinInfo[];
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00004899 std::vector<StringRef> AvailableFeatures;
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004900 public:
4901 SPIRTargetInfo(const std::string& triple) : TargetInfo(triple) {
4902 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
4903 "SPIR target must use unknown OS");
4904 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
4905 "SPIR target must use unknown environment type");
4906 BigEndian = false;
4907 TLSSupported = false;
4908 LongWidth = LongAlign = 64;
4909 AddrSpaceMap = &SPIRAddrSpaceMap;
4910 // Define available target features
4911 // These must be defined in sorted order!
4912 NoAsmVariants = true;
4913 }
4914 virtual void getTargetDefines(const LangOptions &Opts,
4915 MacroBuilder &Builder) const {
4916 DefineStd(Builder, "SPIR", Opts);
4917 }
4918 virtual bool hasFeature(StringRef Feature) const {
4919 return Feature == "spir";
4920 }
4921
4922 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4923 unsigned &NumRecords) const {}
4924 virtual const char *getClobbers() const {
4925 return "";
4926 }
4927 virtual void getGCCRegNames(const char * const *&Names,
4928 unsigned &NumNames) const {}
4929 virtual bool validateAsmConstraint(const char *&Name,
4930 TargetInfo::ConstraintInfo &info) const {
4931 return true;
4932 }
4933 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4934 unsigned &NumAliases) const {}
4935 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4936 return TargetInfo::VoidPtrBuiltinVaList;
4937 }
4938 };
4939
4940
4941 class SPIR32TargetInfo : public SPIRTargetInfo {
4942 public:
4943 SPIR32TargetInfo(const std::string& triple) : SPIRTargetInfo(triple) {
4944 PointerWidth = PointerAlign = 32;
4945 SizeType = TargetInfo::UnsignedInt;
4946 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
4947 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00004948 = "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 +00004949 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
4950 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
4951 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00004952 }
4953 virtual void getTargetDefines(const LangOptions &Opts,
4954 MacroBuilder &Builder) const {
4955 DefineStd(Builder, "SPIR32", Opts);
4956 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004957 };
4958
4959 class SPIR64TargetInfo : public SPIRTargetInfo {
4960 public:
4961 SPIR64TargetInfo(const std::string& triple) : SPIRTargetInfo(triple) {
4962 PointerWidth = PointerAlign = 64;
4963 SizeType = TargetInfo::UnsignedLong;
4964 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
4965 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00004966 = "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 +00004967 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
4968 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
4969 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00004970 }
4971 virtual void getTargetDefines(const LangOptions &Opts,
4972 MacroBuilder &Builder) const {
4973 DefineStd(Builder, "SPIR64", Opts);
4974 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004975 };
4976}
4977
Ivan Krasinef05abd2011-08-24 20:22:22 +00004978
Reid Spencer5f016e22007-07-11 17:01:13 +00004979//===----------------------------------------------------------------------===//
4980// Driver code
4981//===----------------------------------------------------------------------===//
4982
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004983static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004984 llvm::Triple Triple(T);
4985 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00004986
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004987 switch (Triple.getArch()) {
4988 default:
4989 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00004990
Tony Linthicum96319392011-12-12 21:14:55 +00004991 case llvm::Triple::hexagon:
4992 return new HexagonTargetInfo(T);
4993
Tim Northoverc264e162013-01-31 12:13:10 +00004994 case llvm::Triple::aarch64:
4995 switch (os) {
4996 case llvm::Triple::Linux:
4997 return new LinuxTargetInfo<AArch64TargetInfo>(T);
4998 default:
4999 return new AArch64TargetInfo(T);
5000 }
5001
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005002 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00005003 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005004 if (Triple.isOSDarwin())
5005 return new DarwinARMTargetInfo(T);
5006
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005007 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00005008 case llvm::Triple::Linux:
5009 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005010 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00005011 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005012 case llvm::Triple::NetBSD:
5013 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005014 case llvm::Triple::OpenBSD:
5015 return new OpenBSDTargetInfo<ARMTargetInfo>(T);
Eli Friedman42f74f22012-08-08 23:57:20 +00005016 case llvm::Triple::Bitrig:
5017 return new BitrigTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00005018 case llvm::Triple::RTEMS:
5019 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005020 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00005021 return new NaClTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005022 default:
5023 return new ARMTargetInfo(T);
5024 }
Eli Friedman61538a72008-05-20 14:21:01 +00005025
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005026 case llvm::Triple::msp430:
5027 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00005028
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005029 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005030 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005031 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005032 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005033 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005034 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005035 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005036 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005037 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005038 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005039 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005040 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005041 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005042
5043 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005044 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005045 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005046 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005047 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005048 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005049 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005050 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005051 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005052 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005053 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005054 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005055 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005056
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005057 case llvm::Triple::mips64:
5058 switch (os) {
5059 case llvm::Triple::Linux:
5060 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
5061 case llvm::Triple::RTEMS:
5062 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
5063 case llvm::Triple::FreeBSD:
5064 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
5065 case llvm::Triple::NetBSD:
5066 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005067 case llvm::Triple::OpenBSD:
5068 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(T);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005069 default:
5070 return new Mips64EBTargetInfo(T);
5071 }
5072
5073 case llvm::Triple::mips64el:
5074 switch (os) {
5075 case llvm::Triple::Linux:
5076 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
5077 case llvm::Triple::RTEMS:
5078 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
5079 case llvm::Triple::FreeBSD:
5080 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
5081 case llvm::Triple::NetBSD:
5082 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005083 case llvm::Triple::OpenBSD:
5084 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(T);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005085 default:
5086 return new Mips64ELTargetInfo(T);
5087 }
5088
Ivan Krasinef05abd2011-08-24 20:22:22 +00005089 case llvm::Triple::le32:
5090 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00005091 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00005092 return new NaClTargetInfo<PNaClTargetInfo>(T);
Ivan Krasinef05abd2011-08-24 20:22:22 +00005093 default:
5094 return NULL;
5095 }
5096
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005097 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005098 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00005099 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005100 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005101 case llvm::Triple::Linux:
5102 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005103 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00005104 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005105 case llvm::Triple::NetBSD:
5106 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005107 case llvm::Triple::OpenBSD:
5108 return new OpenBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005109 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00005110 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005111 default:
5112 return new PPC32TargetInfo(T);
5113 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005114
5115 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005116 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00005117 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005118 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005119 case llvm::Triple::Linux:
5120 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005121 case llvm::Triple::Lv2:
John Thompson3f6918a2009-11-19 17:18:50 +00005122 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005123 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00005124 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005125 case llvm::Triple::NetBSD:
5126 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
5127 default:
5128 return new PPC64TargetInfo(T);
5129 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005130
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005131 case llvm::Triple::nvptx:
5132 return new NVPTX32TargetInfo(T);
5133 case llvm::Triple::nvptx64:
5134 return new NVPTX64TargetInfo(T);
5135
Chris Lattner9cbeb632010-03-06 21:21:27 +00005136 case llvm::Triple::mblaze:
5137 return new MBlazeTargetInfo(T);
5138
Eli Friedman6505a292012-10-12 23:32:00 +00005139 case llvm::Triple::r600:
5140 return new R600TargetInfo(T);
5141
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005142 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005143 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005144 case llvm::Triple::Linux:
5145 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005146 case llvm::Triple::AuroraUX:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005147 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005148 case llvm::Triple::Solaris:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005149 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005150 case llvm::Triple::NetBSD:
5151 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005152 case llvm::Triple::OpenBSD:
5153 return new OpenBSDTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005154 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00005155 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005156 default:
5157 return new SparcV8TargetInfo(T);
5158 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005159
Eli Friedmanb63decf2009-08-19 20:47:07 +00005160 case llvm::Triple::tce:
5161 return new TCETargetInfo(T);
5162
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005163 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005164 if (Triple.isOSDarwin())
5165 return new DarwinI386TargetInfo(T);
5166
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005167 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005168 case llvm::Triple::AuroraUX:
5169 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005170 case llvm::Triple::Linux:
5171 return new LinuxTargetInfo<X86_32TargetInfo>(T);
5172 case llvm::Triple::DragonFly:
5173 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
5174 case llvm::Triple::NetBSD:
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00005175 return new NetBSDI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005176 case llvm::Triple::OpenBSD:
5177 return new OpenBSDI386TargetInfo(T);
Eli Friedman42f74f22012-08-08 23:57:20 +00005178 case llvm::Triple::Bitrig:
5179 return new BitrigI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005180 case llvm::Triple::FreeBSD:
5181 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00005182 case llvm::Triple::Minix:
5183 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005184 case llvm::Triple::Solaris:
5185 return new SolarisTargetInfo<X86_32TargetInfo>(T);
5186 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005187 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005188 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005189 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005190 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00005191 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00005192 case llvm::Triple::Haiku:
5193 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00005194 case llvm::Triple::RTEMS:
5195 return new RTEMSX86_32TargetInfo(T);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005196 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00005197 return new NaClTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005198 default:
5199 return new X86_32TargetInfo(T);
5200 }
5201
5202 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005203 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
5204 return new DarwinX86_64TargetInfo(T);
5205
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005206 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005207 case llvm::Triple::AuroraUX:
5208 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005209 case llvm::Triple::Linux:
5210 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00005211 case llvm::Triple::DragonFly:
5212 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005213 case llvm::Triple::NetBSD:
5214 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
5215 case llvm::Triple::OpenBSD:
5216 return new OpenBSDX86_64TargetInfo(T);
Eli Friedman42f74f22012-08-08 23:57:20 +00005217 case llvm::Triple::Bitrig:
5218 return new BitrigX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005219 case llvm::Triple::FreeBSD:
5220 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
5221 case llvm::Triple::Solaris:
5222 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00005223 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005224 return new MinGWX86_64TargetInfo(T);
5225 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005226 return new VisualStudioWindowsX86_64TargetInfo(T);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005227 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00005228 return new NaClTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005229 default:
5230 return new X86_64TargetInfo(T);
5231 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005232
5233 case llvm::Triple::spir: {
5234 llvm::Triple Triple(T);
5235 if (Triple.getOS() != llvm::Triple::UnknownOS ||
5236 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
5237 return NULL;
5238 return new SPIR32TargetInfo(T);
5239 }
5240 case llvm::Triple::spir64: {
5241 llvm::Triple Triple(T);
5242 if (Triple.getOS() != llvm::Triple::UnknownOS ||
5243 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
5244 return NULL;
5245 return new SPIR64TargetInfo(T);
5246 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005247 }
Reid Spencer5f016e22007-07-11 17:01:13 +00005248}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005249
5250/// CreateTargetInfo - Return the target info object for the specified target
5251/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00005252TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregor49a87542012-11-16 04:24:59 +00005253 TargetOptions *Opts) {
5254 llvm::Triple Triple(Opts->Triple);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005255
5256 // Construct the target
Dylan Noblesmith6f42b622012-02-05 02:12:40 +00005257 OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005258 if (!Target) {
5259 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5260 return 0;
5261 }
Douglas Gregor9a022bb2012-10-15 16:45:32 +00005262 Target->setTargetOpts(Opts);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005263
Daniel Dunbareac7c532009-12-18 18:42:37 +00005264 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005265 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5266 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbareac7c532009-12-18 18:42:37 +00005267 return 0;
5268 }
5269
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005270 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005271 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5272 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005273 return 0;
5274 }
5275
Charles Davis98b7c5c2010-06-11 01:06:47 +00005276 // Set the target C++ ABI.
Douglas Gregor49a87542012-11-16 04:24:59 +00005277 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5278 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis98b7c5c2010-06-11 01:06:47 +00005279 return 0;
5280 }
5281
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005282 // Compute the default target features, we need the target to handle this
5283 // because features may have dependencies on one another.
5284 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00005285 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005286
5287 // Apply the user specified deltas.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005288 // First the enables.
Douglas Gregor57016dd2012-10-16 23:40:58 +00005289 for (std::vector<std::string>::const_iterator
Douglas Gregor49a87542012-11-16 04:24:59 +00005290 it = Opts->FeaturesAsWritten.begin(),
5291 ie = Opts->FeaturesAsWritten.end();
Douglas Gregor57016dd2012-10-16 23:40:58 +00005292 it != ie; ++it) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005293 const char *Name = it->c_str();
5294
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005295 if (Name[0] != '+')
5296 continue;
5297
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005298 // Apply the feature via the target.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005299 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
5300 Diags.Report(diag::err_target_invalid_feature) << Name;
5301 return 0;
5302 }
5303 }
5304
5305 // Then the disables.
Douglas Gregor57016dd2012-10-16 23:40:58 +00005306 for (std::vector<std::string>::const_iterator
Douglas Gregor49a87542012-11-16 04:24:59 +00005307 it = Opts->FeaturesAsWritten.begin(),
5308 ie = Opts->FeaturesAsWritten.end();
Douglas Gregor57016dd2012-10-16 23:40:58 +00005309 it != ie; ++it) {
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005310 const char *Name = it->c_str();
5311
5312 if (Name[0] == '+')
5313 continue;
5314
5315 // Apply the feature via the target.
5316 if (Name[0] != '-' ||
5317 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005318 Diags.Report(diag::err_target_invalid_feature) << Name;
5319 return 0;
5320 }
5321 }
5322
5323 // Add the features to the compile options.
5324 //
5325 // FIXME: If we are completely confident that we have the right set, we only
5326 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00005327 Opts->Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005328 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5329 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00005330 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
5331 Target->HandleTargetFeatures(Opts->Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005332
5333 return Target.take();
5334}