blob: 4ca8fbf7736a223513712b60c2012081ffac29d6 [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 Finkel829d1872013-03-28 13:51:36 +00001032 if (Name == "altivec" || Name == "mfocrf" || Name == "popcntd" ||
1033 Name == "qpx") {
Bill Schmidt199402b2013-02-01 02:14:03 +00001034 Features[Name] = Enabled;
1035 return true;
Hal Finkel02a84272012-06-11 22:35:19 +00001036 }
Bill Schmidt199402b2013-02-01 02:14:03 +00001037
1038 return false;
Chris Lattnerc0f59212009-03-02 22:27:17 +00001039}
1040
Douglas Gregore727d212012-01-30 06:38:25 +00001041bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1042 return Feature == "powerpc";
1043}
Chris Lattner393ff042008-04-21 18:56:49 +00001044
Douglas Gregore727d212012-01-30 06:38:25 +00001045
Eli Friedmane4277982008-08-20 23:11:40 +00001046const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +00001047 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1048 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1049 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1050 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1051 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1052 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1053 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1054 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +00001055 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +00001056 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +00001057 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +00001058 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1059 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1060 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1061 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +00001062 "vrsave", "vscr",
1063 "spe_acc", "spefscr",
1064 "sfp"
1065};
Reid Spencer5f016e22007-07-11 17:01:13 +00001066
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001067void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +00001068 unsigned &NumNames) const {
1069 Names = GCCRegNames;
1070 NumNames = llvm::array_lengthof(GCCRegNames);
1071}
Reid Spencer5f016e22007-07-11 17:01:13 +00001072
Eli Friedmane4277982008-08-20 23:11:40 +00001073const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1074 // While some of these aliases do map to different registers
1075 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001076 { { "0" }, "r0" },
1077 { { "1"}, "r1" },
1078 { { "2" }, "r2" },
1079 { { "3" }, "r3" },
1080 { { "4" }, "r4" },
1081 { { "5" }, "r5" },
1082 { { "6" }, "r6" },
1083 { { "7" }, "r7" },
1084 { { "8" }, "r8" },
1085 { { "9" }, "r9" },
1086 { { "10" }, "r10" },
1087 { { "11" }, "r11" },
1088 { { "12" }, "r12" },
1089 { { "13" }, "r13" },
1090 { { "14" }, "r14" },
1091 { { "15" }, "r15" },
1092 { { "16" }, "r16" },
1093 { { "17" }, "r17" },
1094 { { "18" }, "r18" },
1095 { { "19" }, "r19" },
1096 { { "20" }, "r20" },
1097 { { "21" }, "r21" },
1098 { { "22" }, "r22" },
1099 { { "23" }, "r23" },
1100 { { "24" }, "r24" },
1101 { { "25" }, "r25" },
1102 { { "26" }, "r26" },
1103 { { "27" }, "r27" },
1104 { { "28" }, "r28" },
1105 { { "29" }, "r29" },
1106 { { "30" }, "r30" },
1107 { { "31" }, "r31" },
1108 { { "fr0" }, "f0" },
1109 { { "fr1" }, "f1" },
1110 { { "fr2" }, "f2" },
1111 { { "fr3" }, "f3" },
1112 { { "fr4" }, "f4" },
1113 { { "fr5" }, "f5" },
1114 { { "fr6" }, "f6" },
1115 { { "fr7" }, "f7" },
1116 { { "fr8" }, "f8" },
1117 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +00001118 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001119 { { "fr11" }, "f11" },
1120 { { "fr12" }, "f12" },
1121 { { "fr13" }, "f13" },
1122 { { "fr14" }, "f14" },
1123 { { "fr15" }, "f15" },
1124 { { "fr16" }, "f16" },
1125 { { "fr17" }, "f17" },
1126 { { "fr18" }, "f18" },
1127 { { "fr19" }, "f19" },
1128 { { "fr20" }, "f20" },
1129 { { "fr21" }, "f21" },
1130 { { "fr22" }, "f22" },
1131 { { "fr23" }, "f23" },
1132 { { "fr24" }, "f24" },
1133 { { "fr25" }, "f25" },
1134 { { "fr26" }, "f26" },
1135 { { "fr27" }, "f27" },
1136 { { "fr28" }, "f28" },
1137 { { "fr29" }, "f29" },
1138 { { "fr30" }, "f30" },
1139 { { "fr31" }, "f31" },
1140 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +00001141};
1142
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001143void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +00001144 unsigned &NumAliases) const {
1145 Aliases = GCCRegAliases;
1146 NumAliases = llvm::array_lengthof(GCCRegAliases);
1147}
1148} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00001149
1150namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001151class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001152public:
Chris Lattnere03ae302010-02-16 18:14:57 +00001153 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001154 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 +00001155 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +00001156
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001157 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +00001158 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001159 case llvm::Triple::FreeBSD:
1160 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001161 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +00001162 PtrDiffType = SignedInt;
1163 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001164 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +00001165 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001166 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001167 }
Roman Divackye3d175d2012-03-13 16:53:54 +00001168
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001169 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1170 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001171 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001172 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001173
1174 // PPC32 supports atomics up to 4 bytes.
1175 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001176 }
1177
Meador Ingec5613b22012-06-16 03:34:49 +00001178 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001179 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Ingec5613b22012-06-16 03:34:49 +00001180 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001181 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001182};
1183} // end anonymous namespace.
1184
1185namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001186class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001187public:
Eli Friedmane4277982008-08-20 23:11:40 +00001188 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001189 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001190 IntMaxType = SignedLong;
1191 UIntMaxType = UnsignedLong;
1192 Int64Type = SignedLong;
Roman Divackye3d175d2012-03-13 16:53:54 +00001193
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001194 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1195 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001196 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001197 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1198 "i64:64:64-f32:32:32-f64:64:64-f128:64:64-"
1199 "v128:128:128-n32:64";
1200 } else
1201 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1202 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
1203 "v128:128:128-n32:64";
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001204
1205 // PPC64 supports atomics up to 8 bytes.
1206 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerf291b102008-05-09 06:17:04 +00001207 }
Meador Ingec5613b22012-06-16 03:34:49 +00001208 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1209 return TargetInfo::CharPtrBuiltinVaList;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001210 }
Eli Friedmane4277982008-08-20 23:11:40 +00001211};
1212} // end anonymous namespace.
1213
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001214
1215namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001216class DarwinPPC32TargetInfo :
1217 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001218public:
Roman Divackyc81f2a22011-01-06 08:27:10 +00001219 DarwinPPC32TargetInfo(const std::string& triple)
1220 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001221 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001222 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001223 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001224 SuitableAlign = 128;
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001225 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1226 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +00001227 }
Meador Ingec5613b22012-06-16 03:34:49 +00001228 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1229 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001230 }
1231};
1232
1233class DarwinPPC64TargetInfo :
1234 public DarwinTargetInfo<PPC64TargetInfo> {
1235public:
1236 DarwinPPC64TargetInfo(const std::string& triple)
1237 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
1238 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001239 SuitableAlign = 128;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001240 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1241 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001242 }
1243};
1244} // end anonymous namespace.
1245
Reid Spencer5f016e22007-07-11 17:01:13 +00001246namespace {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001247 static const unsigned NVPTXAddrSpaceMap[] = {
1248 1, // opencl_global
1249 3, // opencl_local
1250 4, // opencl_constant
1251 1, // cuda_device
1252 4, // cuda_constant
1253 3, // cuda_shared
1254 };
1255 class NVPTXTargetInfo : public TargetInfo {
1256 static const char * const GCCRegNames[];
Justin Holewinski2c585b92012-05-24 17:43:12 +00001257 static const Builtin::Info BuiltinInfo[];
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00001258 std::vector<StringRef> AvailableFeatures;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001259 public:
1260 NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
1261 BigEndian = false;
1262 TLSSupported = false;
1263 LongWidth = LongAlign = 64;
1264 AddrSpaceMap = &NVPTXAddrSpaceMap;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001265 // Define available target features
1266 // These must be defined in sorted order!
Justin Holewinski9903e942012-07-11 15:34:55 +00001267 NoAsmVariants = true;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001268 }
1269 virtual void getTargetDefines(const LangOptions &Opts,
1270 MacroBuilder &Builder) const {
1271 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001272 Builder.defineMacro("__NVPTX__");
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001273 }
1274 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1275 unsigned &NumRecords) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001276 Records = BuiltinInfo;
1277 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001278 }
1279 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001280 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001281 }
1282
1283 virtual void getGCCRegNames(const char * const *&Names,
1284 unsigned &NumNames) const;
1285 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1286 unsigned &NumAliases) const {
1287 // No aliases.
1288 Aliases = 0;
1289 NumAliases = 0;
1290 }
1291 virtual bool validateAsmConstraint(const char *&Name,
1292 TargetInfo::ConstraintInfo &info) const {
1293 // FIXME: implement
1294 return true;
1295 }
1296 virtual const char *getClobbers() const {
1297 // FIXME: Is this really right?
1298 return "";
1299 }
Meador Ingec5613b22012-06-16 03:34:49 +00001300 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001301 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00001302 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001303 }
1304 virtual bool setCPU(const std::string &Name) {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001305 return Name == "sm_10" || Name == "sm_13" || Name == "sm_20";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001306 }
Justin Holewinski2c585b92012-05-24 17:43:12 +00001307 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1308 StringRef Name,
1309 bool Enabled) const;
1310 };
1311
1312 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1313#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1314#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1315 ALL_LANGUAGES },
1316#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001317 };
1318
1319 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1320 "r0"
1321 };
1322
1323 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1324 unsigned &NumNames) const {
1325 Names = GCCRegNames;
1326 NumNames = llvm::array_lengthof(GCCRegNames);
1327 }
1328
Justin Holewinski2c585b92012-05-24 17:43:12 +00001329 bool NVPTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1330 StringRef Name,
1331 bool Enabled) const {
1332 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1333 Name)) {
1334 Features[Name] = Enabled;
1335 return true;
1336 } else {
1337 return false;
1338 }
1339 }
1340
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001341 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1342 public:
Justin Holewinski2c585b92012-05-24 17:43:12 +00001343 NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001344 PointerWidth = PointerAlign = 32;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001345 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001346 DescriptionString
1347 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1348 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1349 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001350 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001351 };
1352
1353 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1354 public:
Justin Holewinski2c585b92012-05-24 17:43:12 +00001355 NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001356 PointerWidth = PointerAlign = 64;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001357 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001358 DescriptionString
1359 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1360 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1361 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001362 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001363 };
1364}
1365
1366namespace {
Eli Friedman6505a292012-10-12 23:32:00 +00001367
1368static const unsigned R600AddrSpaceMap[] = {
1369 1, // opencl_global
1370 3, // opencl_local
1371 2, // opencl_constant
1372 1, // cuda_device
1373 2, // cuda_constant
1374 3 // cuda_shared
1375};
1376
Tom Stellardfd075912013-03-04 17:40:53 +00001377static const char *DescriptionStringR600 =
1378 "e"
1379 "-p:32:32:32"
1380 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32"
1381 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1382 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1383 "-n32:64";
1384
1385static const char *DescriptionStringR600DoubleOps =
1386 "e"
1387 "-p:32:32:32"
1388 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1389 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1390 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1391 "-n32:64";
1392
1393static const char *DescriptionStringSI =
1394 "e"
1395 "-p:64:64:64"
1396 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1397 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1398 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1399 "-n32:64";
1400
Eli Friedman6505a292012-10-12 23:32:00 +00001401class R600TargetInfo : public TargetInfo {
Tom Stellardfd075912013-03-04 17:40:53 +00001402 /// \brief The GPU profiles supported by the R600 target.
1403 enum GPUKind {
1404 GK_NONE,
1405 GK_R600,
1406 GK_R600_DOUBLE_OPS,
1407 GK_R700,
1408 GK_R700_DOUBLE_OPS,
1409 GK_EVERGREEN,
1410 GK_EVERGREEN_DOUBLE_OPS,
1411 GK_NORTHERN_ISLANDS,
1412 GK_CAYMAN,
1413 GK_SOUTHERN_ISLANDS
1414 } GPU;
1415
Eli Friedman6505a292012-10-12 23:32:00 +00001416public:
Tom Stellardfd075912013-03-04 17:40:53 +00001417 R600TargetInfo(const std::string& triple)
1418 : TargetInfo(triple),
1419 GPU(GK_R600) {
1420 DescriptionString = DescriptionStringR600;
Eli Friedman6505a292012-10-12 23:32:00 +00001421 AddrSpaceMap = &R600AddrSpaceMap;
1422 }
1423
1424 virtual const char * getClobbers() const {
1425 return "";
1426 }
1427
1428 virtual void getGCCRegNames(const char * const *&Names,
1429 unsigned &numNames) const {
1430 Names = NULL;
1431 numNames = 0;
1432 }
1433
1434 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1435 unsigned &NumAliases) const {
1436 Aliases = NULL;
1437 NumAliases = 0;
1438 }
1439
1440 virtual bool validateAsmConstraint(const char *&Name,
1441 TargetInfo::ConstraintInfo &info) const {
1442 return true;
1443 }
1444
1445 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1446 unsigned &NumRecords) const {
1447 Records = NULL;
1448 NumRecords = 0;
1449 }
1450
1451
1452 virtual void getTargetDefines(const LangOptions &Opts,
1453 MacroBuilder &Builder) const {
1454 Builder.defineMacro("__R600__");
1455 }
1456
1457 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1458 return TargetInfo::CharPtrBuiltinVaList;
1459 }
1460
Tom Stellardfd075912013-03-04 17:40:53 +00001461 virtual bool setCPU(const std::string &Name) {
1462 GPU = llvm::StringSwitch<GPUKind>(Name)
1463 .Case("r600" , GK_R600)
1464 .Case("rv610", GK_R600)
1465 .Case("rv620", GK_R600)
1466 .Case("rv630", GK_R600)
1467 .Case("rv635", GK_R600)
1468 .Case("rs780", GK_R600)
1469 .Case("rs880", GK_R600)
1470 .Case("rv670", GK_R600_DOUBLE_OPS)
1471 .Case("rv710", GK_R700)
1472 .Case("rv730", GK_R700)
1473 .Case("rv740", GK_R700_DOUBLE_OPS)
1474 .Case("rv770", GK_R700_DOUBLE_OPS)
1475 .Case("palm", GK_EVERGREEN)
1476 .Case("cedar", GK_EVERGREEN)
1477 .Case("sumo", GK_EVERGREEN)
1478 .Case("sumo2", GK_EVERGREEN)
1479 .Case("redwood", GK_EVERGREEN)
1480 .Case("juniper", GK_EVERGREEN)
1481 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1482 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1483 .Case("barts", GK_NORTHERN_ISLANDS)
1484 .Case("turks", GK_NORTHERN_ISLANDS)
1485 .Case("caicos", GK_NORTHERN_ISLANDS)
1486 .Case("cayman", GK_CAYMAN)
1487 .Case("aruba", GK_CAYMAN)
1488 .Case("SI", GK_SOUTHERN_ISLANDS)
1489 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1490 .Case("verde", GK_SOUTHERN_ISLANDS)
1491 .Case("oland", GK_SOUTHERN_ISLANDS)
1492 .Default(GK_NONE);
1493
1494 if (GPU == GK_NONE) {
1495 return false;
1496 }
1497
1498 // Set the correct data layout
1499 switch (GPU) {
1500 case GK_NONE:
1501 case GK_R600:
1502 case GK_R700:
1503 case GK_EVERGREEN:
1504 case GK_NORTHERN_ISLANDS:
1505 DescriptionString = DescriptionStringR600;
1506 break;
1507 case GK_R600_DOUBLE_OPS:
1508 case GK_R700_DOUBLE_OPS:
1509 case GK_EVERGREEN_DOUBLE_OPS:
1510 case GK_CAYMAN:
1511 DescriptionString = DescriptionStringR600DoubleOps;
1512 break;
1513 case GK_SOUTHERN_ISLANDS:
1514 DescriptionString = DescriptionStringSI;
1515 break;
1516 }
1517
1518 return true;
1519 }
Eli Friedman6505a292012-10-12 23:32:00 +00001520};
1521
1522} // end anonymous namespace
1523
1524namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +00001525// MBlaze abstract base class
1526class MBlazeTargetInfo : public TargetInfo {
1527 static const char * const GCCRegNames[];
1528 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1529
1530public:
1531 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +00001532 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +00001533 }
1534
1535 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1536 unsigned &NumRecords) const {
1537 // FIXME: Implement.
1538 Records = 0;
1539 NumRecords = 0;
1540 }
1541
1542 virtual void getTargetDefines(const LangOptions &Opts,
1543 MacroBuilder &Builder) const;
1544
Douglas Gregore727d212012-01-30 06:38:25 +00001545 virtual bool hasFeature(StringRef Feature) const {
1546 return Feature == "mblaze";
1547 }
1548
Meador Ingec5613b22012-06-16 03:34:49 +00001549 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1550 return TargetInfo::CharPtrBuiltinVaList;
Chris Lattner9cbeb632010-03-06 21:21:27 +00001551 }
1552 virtual const char *getTargetPrefix() const {
1553 return "mblaze";
1554 }
1555 virtual void getGCCRegNames(const char * const *&Names,
1556 unsigned &NumNames) const;
1557 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1558 unsigned &NumAliases) const;
1559 virtual bool validateAsmConstraint(const char *&Name,
1560 TargetInfo::ConstraintInfo &Info) const {
1561 switch (*Name) {
1562 default: return false;
1563 case 'O': // Zero
1564 return true;
1565 case 'b': // Base register
1566 case 'f': // Floating point register
1567 Info.setAllowsRegister();
1568 return true;
1569 }
1570 }
1571 virtual const char *getClobbers() const {
1572 return "";
1573 }
1574};
1575
1576/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1577/// #defines that are not tied to a specific subtarget.
1578void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1579 MacroBuilder &Builder) const {
1580 // Target identification.
1581 Builder.defineMacro("__microblaze__");
1582 Builder.defineMacro("_ARCH_MICROBLAZE");
1583 Builder.defineMacro("__MICROBLAZE__");
1584
1585 // Target properties.
1586 Builder.defineMacro("_BIG_ENDIAN");
1587 Builder.defineMacro("__BIG_ENDIAN__");
1588
1589 // Subtarget options.
1590 Builder.defineMacro("__REGISTER_PREFIX__", "");
1591}
1592
1593
1594const char * const MBlazeTargetInfo::GCCRegNames[] = {
1595 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1596 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1597 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1598 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1599 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1600 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1601 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1602 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1603 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1604 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1605};
1606
1607void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1608 unsigned &NumNames) const {
1609 Names = GCCRegNames;
1610 NumNames = llvm::array_lengthof(GCCRegNames);
1611}
1612
1613const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1614 { {"f0"}, "r0" },
1615 { {"f1"}, "r1" },
1616 { {"f2"}, "r2" },
1617 { {"f3"}, "r3" },
1618 { {"f4"}, "r4" },
1619 { {"f5"}, "r5" },
1620 { {"f6"}, "r6" },
1621 { {"f7"}, "r7" },
1622 { {"f8"}, "r8" },
1623 { {"f9"}, "r9" },
1624 { {"f10"}, "r10" },
1625 { {"f11"}, "r11" },
1626 { {"f12"}, "r12" },
1627 { {"f13"}, "r13" },
1628 { {"f14"}, "r14" },
1629 { {"f15"}, "r15" },
1630 { {"f16"}, "r16" },
1631 { {"f17"}, "r17" },
1632 { {"f18"}, "r18" },
1633 { {"f19"}, "r19" },
1634 { {"f20"}, "r20" },
1635 { {"f21"}, "r21" },
1636 { {"f22"}, "r22" },
1637 { {"f23"}, "r23" },
1638 { {"f24"}, "r24" },
1639 { {"f25"}, "r25" },
1640 { {"f26"}, "r26" },
1641 { {"f27"}, "r27" },
1642 { {"f28"}, "r28" },
1643 { {"f29"}, "r29" },
1644 { {"f30"}, "r30" },
1645 { {"f31"}, "r31" },
1646};
1647
1648void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1649 unsigned &NumAliases) const {
1650 Aliases = GCCRegAliases;
1651 NumAliases = llvm::array_lengthof(GCCRegAliases);
1652}
1653} // end anonymous namespace.
1654
1655namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001656// Namespace for x86 abstract base class
1657const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001658#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001659#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001660 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001661#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001662};
Eli Friedman61538a72008-05-20 14:21:01 +00001663
Nuno Lopes2550d702009-12-23 17:49:57 +00001664static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001665 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1666 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001667 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001668 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1669 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1670 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001671 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001672 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1673 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001674};
1675
Eric Christophercfd323d2011-06-21 00:05:20 +00001676const TargetInfo::AddlRegName AddlRegNames[] = {
1677 { { "al", "ah", "eax", "rax" }, 0 },
1678 { { "bl", "bh", "ebx", "rbx" }, 3 },
1679 { { "cl", "ch", "ecx", "rcx" }, 2 },
1680 { { "dl", "dh", "edx", "rdx" }, 1 },
1681 { { "esi", "rsi" }, 4 },
1682 { { "edi", "rdi" }, 5 },
1683 { { "esp", "rsp" }, 7 },
1684 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001685};
1686
1687// X86 target abstract base class; x86-32 and x86-64 are very close, so
1688// most of the implementation can be shared.
1689class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001690 enum X86SSEEnum {
Craig Topper05fe4b52012-01-09 09:19:09 +00001691 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner84f0ea82009-03-02 22:40:39 +00001692 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001693 enum MMX3DNowEnum {
1694 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1695 } MMX3DNowLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001696
Eric Christophereea12d12010-04-02 23:50:19 +00001697 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001698 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001699 bool HasLZCNT;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001700 bool HasRDRND;
Craig Topper31ceea02011-12-25 05:06:45 +00001701 bool HasBMI;
1702 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001703 bool HasPOPCNT;
Michael Liao463eb892012-11-10 05:17:46 +00001704 bool HasRTM;
Michael Liao72339a02013-03-26 17:52:08 +00001705 bool HasPRFCHW;
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00001706 bool HasSSE4a;
Craig Topper6a511e12011-12-30 07:33:42 +00001707 bool HasFMA4;
Craig Topper2ae95072012-06-03 21:46:30 +00001708 bool HasFMA;
Craig Topperb6af69e2012-06-09 22:24:14 +00001709 bool HasXOP;
Manman Ren146e5a42012-10-11 00:59:55 +00001710 bool HasF16C;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001711
Chandler Carruth499d9722011-09-28 08:55:34 +00001712 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1713 ///
1714 /// Each enumeration represents a particular CPU supported by Clang. These
1715 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1716 enum CPUKind {
1717 CK_Generic,
1718
1719 /// \name i386
1720 /// i386-generation processors.
1721 //@{
1722 CK_i386,
1723 //@}
1724
1725 /// \name i486
1726 /// i486-generation processors.
1727 //@{
1728 CK_i486,
1729 CK_WinChipC6,
1730 CK_WinChip2,
1731 CK_C3,
1732 //@}
1733
1734 /// \name i586
1735 /// i586-generation processors, P5 microarchitecture based.
1736 //@{
1737 CK_i586,
1738 CK_Pentium,
1739 CK_PentiumMMX,
1740 //@}
1741
1742 /// \name i686
1743 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1744 //@{
1745 CK_i686,
1746 CK_PentiumPro,
1747 CK_Pentium2,
1748 CK_Pentium3,
1749 CK_Pentium3M,
1750 CK_PentiumM,
1751 CK_C3_2,
1752
1753 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1754 /// Clang however has some logic to suport this.
1755 // FIXME: Warn, deprecate, and potentially remove this.
1756 CK_Yonah,
1757 //@}
1758
1759 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001760 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001761 //@{
1762 CK_Pentium4,
1763 CK_Pentium4M,
1764 CK_Prescott,
1765 CK_Nocona,
1766 //@}
1767
1768 /// \name Core
1769 /// Core microarchitecture based processors.
1770 //@{
1771 CK_Core2,
1772
1773 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1774 /// codename which GCC no longer accepts as an option to -march, but Clang
1775 /// has some logic for recognizing it.
1776 // FIXME: Warn, deprecate, and potentially remove this.
1777 CK_Penryn,
1778 //@}
1779
1780 /// \name Atom
1781 /// Atom processors
1782 //@{
1783 CK_Atom,
1784 //@}
1785
1786 /// \name Nehalem
1787 /// Nehalem microarchitecture based processors.
1788 //@{
1789 CK_Corei7,
1790 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001791 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001792 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001793 //@}
1794
1795 /// \name K6
1796 /// K6 architecture processors.
1797 //@{
1798 CK_K6,
1799 CK_K6_2,
1800 CK_K6_3,
1801 //@}
1802
1803 /// \name K7
1804 /// K7 architecture processors.
1805 //@{
1806 CK_Athlon,
1807 CK_AthlonThunderbird,
1808 CK_Athlon4,
1809 CK_AthlonXP,
1810 CK_AthlonMP,
1811 //@}
1812
1813 /// \name K8
1814 /// K8 architecture processors.
1815 //@{
1816 CK_Athlon64,
1817 CK_Athlon64SSE3,
1818 CK_AthlonFX,
1819 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001820 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001821 CK_Opteron,
1822 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001823 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001824 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001825
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001826 /// \name Bobcat
1827 /// Bobcat architecture processors.
1828 //@{
1829 CK_BTVER1,
1830 //@}
1831
1832 /// \name Bulldozer
1833 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001834 //@{
1835 CK_BDVER1,
1836 CK_BDVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001837 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001838
Chandler Carruth499d9722011-09-28 08:55:34 +00001839 /// This specification is deprecated and will be removed in the future.
1840 /// Users should prefer \see CK_K8.
1841 // FIXME: Warn on this when the CPU is set to it.
1842 CK_x86_64,
1843 //@}
1844
1845 /// \name Geode
1846 /// Geode processors.
1847 //@{
1848 CK_Geode
1849 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001850 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001851
Eli Friedman618234a2008-08-20 02:34:37 +00001852public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001853 X86TargetInfo(const std::string& triple)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001854 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Benjamin Kramer84f30802012-07-07 09:39:18 +00001855 HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false),
Michael Liao463eb892012-11-10 05:17:46 +00001856 HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasRTM(false),
Michael Liao72339a02013-03-26 17:52:08 +00001857 HasPRFCHW(false), HasSSE4a(false), HasFMA4(false),
1858 HasFMA(false), HasXOP(false), HasF16C(false), CPU(CK_Generic) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001859 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001860 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001861 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001862 virtual unsigned getFloatEvalMethod() const {
1863 // X87 evaluates with 80 bits "long double" precision.
1864 return SSELevel == NoSSE ? 2 : 0;
1865 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001866 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1867 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001868 Records = BuiltinInfo;
1869 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001870 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001871 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001872 unsigned &NumNames) const {
1873 Names = GCCRegNames;
1874 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001875 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001876 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001877 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001878 Aliases = 0;
1879 NumAliases = 0;
1880 }
1881 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopher825d3862012-11-14 22:08:59 +00001882 unsigned &NumNames) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001883 Names = AddlRegNames;
1884 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001885 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001886 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001887 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001888 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001889 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001890 return "~{dirflag},~{fpsr},~{flags}";
1891 }
Chris Lattner33328642009-03-20 15:52:06 +00001892 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001893 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001894 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00001895 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001896 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001897 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregore727d212012-01-30 06:38:25 +00001898 virtual bool hasFeature(StringRef Feature) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001899 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001900 virtual const char* getABI() const {
Derek Schuffbabaf312012-10-11 15:52:22 +00001901 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001902 return "avx";
Derek Schuffbabaf312012-10-11 15:52:22 +00001903 else if (getTriple().getArch() == llvm::Triple::x86 &&
1904 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001905 return "no-mmx";
1906 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001907 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001908 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001909 CPU = llvm::StringSwitch<CPUKind>(Name)
1910 .Case("i386", CK_i386)
1911 .Case("i486", CK_i486)
1912 .Case("winchip-c6", CK_WinChipC6)
1913 .Case("winchip2", CK_WinChip2)
1914 .Case("c3", CK_C3)
1915 .Case("i586", CK_i586)
1916 .Case("pentium", CK_Pentium)
1917 .Case("pentium-mmx", CK_PentiumMMX)
1918 .Case("i686", CK_i686)
1919 .Case("pentiumpro", CK_PentiumPro)
1920 .Case("pentium2", CK_Pentium2)
1921 .Case("pentium3", CK_Pentium3)
1922 .Case("pentium3m", CK_Pentium3M)
1923 .Case("pentium-m", CK_PentiumM)
1924 .Case("c3-2", CK_C3_2)
1925 .Case("yonah", CK_Yonah)
1926 .Case("pentium4", CK_Pentium4)
1927 .Case("pentium4m", CK_Pentium4M)
1928 .Case("prescott", CK_Prescott)
1929 .Case("nocona", CK_Nocona)
1930 .Case("core2", CK_Core2)
1931 .Case("penryn", CK_Penryn)
1932 .Case("atom", CK_Atom)
1933 .Case("corei7", CK_Corei7)
1934 .Case("corei7-avx", CK_Corei7AVX)
1935 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001936 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001937 .Case("k6", CK_K6)
1938 .Case("k6-2", CK_K6_2)
1939 .Case("k6-3", CK_K6_3)
1940 .Case("athlon", CK_Athlon)
1941 .Case("athlon-tbird", CK_AthlonThunderbird)
1942 .Case("athlon-4", CK_Athlon4)
1943 .Case("athlon-xp", CK_AthlonXP)
1944 .Case("athlon-mp", CK_AthlonMP)
1945 .Case("athlon64", CK_Athlon64)
1946 .Case("athlon64-sse3", CK_Athlon64SSE3)
1947 .Case("athlon-fx", CK_AthlonFX)
1948 .Case("k8", CK_K8)
1949 .Case("k8-sse3", CK_K8SSE3)
1950 .Case("opteron", CK_Opteron)
1951 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001952 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001953 .Case("btver1", CK_BTVER1)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001954 .Case("bdver1", CK_BDVER1)
1955 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001956 .Case("x86-64", CK_x86_64)
1957 .Case("geode", CK_Geode)
1958 .Default(CK_Generic);
1959
Chandler Carruth26a39142011-09-28 09:45:08 +00001960 // Perform any per-CPU checks necessary to determine if this CPU is
1961 // acceptable.
1962 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1963 // invalid without explaining *why*.
1964 switch (CPU) {
1965 case CK_Generic:
1966 // No processor selected!
1967 return false;
1968
1969 case CK_i386:
1970 case CK_i486:
1971 case CK_WinChipC6:
1972 case CK_WinChip2:
1973 case CK_C3:
1974 case CK_i586:
1975 case CK_Pentium:
1976 case CK_PentiumMMX:
1977 case CK_i686:
1978 case CK_PentiumPro:
1979 case CK_Pentium2:
1980 case CK_Pentium3:
1981 case CK_Pentium3M:
1982 case CK_PentiumM:
1983 case CK_Yonah:
1984 case CK_C3_2:
1985 case CK_Pentium4:
1986 case CK_Pentium4M:
1987 case CK_Prescott:
1988 case CK_K6:
1989 case CK_K6_2:
1990 case CK_K6_3:
1991 case CK_Athlon:
1992 case CK_AthlonThunderbird:
1993 case CK_Athlon4:
1994 case CK_AthlonXP:
1995 case CK_AthlonMP:
1996 case CK_Geode:
1997 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffbabaf312012-10-11 15:52:22 +00001998 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth26a39142011-09-28 09:45:08 +00001999 return false;
2000
2001 // Fallthrough
2002 case CK_Nocona:
2003 case CK_Core2:
2004 case CK_Penryn:
2005 case CK_Atom:
2006 case CK_Corei7:
2007 case CK_Corei7AVX:
2008 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002009 case CK_CoreAVX2:
Chandler Carruth26a39142011-09-28 09:45:08 +00002010 case CK_Athlon64:
2011 case CK_Athlon64SSE3:
2012 case CK_AthlonFX:
2013 case CK_K8:
2014 case CK_K8SSE3:
2015 case CK_Opteron:
2016 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00002017 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002018 case CK_BTVER1:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002019 case CK_BDVER1:
2020 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00002021 case CK_x86_64:
2022 return true;
2023 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00002024 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002025 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00002026
2027 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
2028 // We accept all non-ARM calling conventions
2029 return (CC == CC_X86ThisCall ||
2030 CC == CC_X86FastCall ||
Peter Collingbourne7728cdd2013-02-23 00:06:18 +00002031 CC == CC_X86StdCall ||
2032 CC == CC_C ||
Guy Benyei38980082012-12-25 08:53:55 +00002033 CC == CC_X86Pascal ||
2034 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002035 }
2036
Aaron Ballmanfff32482012-12-09 17:45:41 +00002037 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
2038 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002039 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002040};
Chris Lattner3daed522009-03-02 22:20:04 +00002041
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002042void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002043 // FIXME: This should not be here.
2044 Features["3dnow"] = false;
2045 Features["3dnowa"] = false;
2046 Features["mmx"] = false;
2047 Features["sse"] = false;
2048 Features["sse2"] = false;
2049 Features["sse3"] = false;
2050 Features["ssse3"] = false;
2051 Features["sse41"] = false;
2052 Features["sse42"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00002053 Features["sse4a"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00002054 Features["aes"] = false;
Craig Topper3c0bc152012-05-31 05:18:48 +00002055 Features["pclmul"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00002056 Features["avx"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00002057 Features["avx2"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002058 Features["lzcnt"] = false;
Benjamin Kramer84f30802012-07-07 09:39:18 +00002059 Features["rdrand"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002060 Features["bmi"] = false;
2061 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00002062 Features["popcnt"] = false;
Michael Liao463eb892012-11-10 05:17:46 +00002063 Features["rtm"] = false;
Michael Liao72339a02013-03-26 17:52:08 +00002064 Features["prfchw"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00002065 Features["fma4"] = false;
Craig Topper2ae95072012-06-03 21:46:30 +00002066 Features["fma"] = false;
Craig Topperb6af69e2012-06-09 22:24:14 +00002067 Features["xop"] = false;
Manman Ren146e5a42012-10-11 00:59:55 +00002068 Features["f16c"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002069
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002070 // FIXME: This *really* should not be here.
2071
2072 // X86_64 always has SSE2.
Derek Schuffbabaf312012-10-11 15:52:22 +00002073 if (getTriple().getArch() == llvm::Triple::x86_64)
Eli Friedman612db2a2012-11-17 01:16:19 +00002074 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002075
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002076 switch (CPU) {
2077 case CK_Generic:
2078 case CK_i386:
2079 case CK_i486:
2080 case CK_i586:
2081 case CK_Pentium:
2082 case CK_i686:
2083 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002084 break;
2085 case CK_PentiumMMX:
2086 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002087 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002088 break;
2089 case CK_Pentium3:
2090 case CK_Pentium3M:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002091 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002092 break;
2093 case CK_PentiumM:
2094 case CK_Pentium4:
2095 case CK_Pentium4M:
2096 case CK_x86_64:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002097 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002098 break;
2099 case CK_Yonah:
2100 case CK_Prescott:
2101 case CK_Nocona:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002102 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002103 break;
2104 case CK_Core2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002105 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002106 break;
2107 case CK_Penryn:
Benjamin Kramerb3453a82012-01-04 14:36:57 +00002108 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002109 break;
2110 case CK_Atom:
Chandler Carruth49defe62011-09-28 10:36:46 +00002111 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002112 break;
2113 case CK_Corei7:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002114 setFeatureEnabled(Features, "sse4", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002115 break;
2116 case CK_Corei7AVX:
Benjamin Kramer84f30802012-07-07 09:39:18 +00002117 setFeatureEnabled(Features, "avx", true);
2118 setFeatureEnabled(Features, "aes", true);
2119 setFeatureEnabled(Features, "pclmul", true);
2120 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002121 case CK_CoreAVXi:
Craig Topperfd936302012-04-26 07:31:30 +00002122 setFeatureEnabled(Features, "avx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00002123 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002124 setFeatureEnabled(Features, "pclmul", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002125 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002126 setFeatureEnabled(Features, "f16c", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002127 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00002128 case CK_CoreAVX2:
Craig Topperfd936302012-04-26 07:31:30 +00002129 setFeatureEnabled(Features, "avx2", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002130 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002131 setFeatureEnabled(Features, "pclmul", true);
Craig Topper31ceea02011-12-25 05:06:45 +00002132 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002133 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002134 setFeatureEnabled(Features, "f16c", true);
Craig Topper31ceea02011-12-25 05:06:45 +00002135 setFeatureEnabled(Features, "bmi", true);
2136 setFeatureEnabled(Features, "bmi2", true);
Michael Liao463eb892012-11-10 05:17:46 +00002137 setFeatureEnabled(Features, "rtm", true);
Craig Topper2ae95072012-06-03 21:46:30 +00002138 setFeatureEnabled(Features, "fma", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002139 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002140 case CK_K6:
2141 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002142 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002143 break;
2144 case CK_K6_2:
2145 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002146 case CK_WinChip2:
2147 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002148 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002149 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00002150 case CK_Athlon:
2151 case CK_AthlonThunderbird:
2152 case CK_Geode:
2153 setFeatureEnabled(Features, "3dnowa", true);
2154 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002155 case CK_Athlon4:
2156 case CK_AthlonXP:
2157 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002158 setFeatureEnabled(Features, "sse", true);
2159 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002160 break;
2161 case CK_K8:
2162 case CK_Opteron:
2163 case CK_Athlon64:
2164 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00002165 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002166 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002167 break;
2168 case CK_K8SSE3:
2169 case CK_OpteronSSE3:
2170 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00002171 setFeatureEnabled(Features, "sse3", true);
2172 setFeatureEnabled(Features, "3dnowa", true);
2173 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002174 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00002175 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00002176 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00002177 setFeatureEnabled(Features, "3dnowa", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002178 setFeatureEnabled(Features, "lzcnt", true);
2179 setFeatureEnabled(Features, "popcnt", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002180 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002181 case CK_BTVER1:
2182 setFeatureEnabled(Features, "ssse3", true);
2183 setFeatureEnabled(Features, "sse4a", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002184 setFeatureEnabled(Features, "lzcnt", true);
2185 setFeatureEnabled(Features, "popcnt", true);
Craig Topper90ea0362012-05-30 05:54:54 +00002186 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002187 case CK_BDVER1:
Craig Topperb6af69e2012-06-09 22:24:14 +00002188 setFeatureEnabled(Features, "xop", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002189 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002190 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002191 setFeatureEnabled(Features, "pclmul", true);
Eli Friedmanf5824992012-11-26 21:57:28 +00002192 break;
Eli Friedmanfaf35382012-11-17 01:43:10 +00002193 case CK_BDVER2:
2194 setFeatureEnabled(Features, "xop", true);
2195 setFeatureEnabled(Features, "lzcnt", true);
2196 setFeatureEnabled(Features, "aes", true);
2197 setFeatureEnabled(Features, "pclmul", true);
2198 setFeatureEnabled(Features, "bmi", true);
2199 setFeatureEnabled(Features, "fma", true);
2200 setFeatureEnabled(Features, "f16c", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002201 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002202 case CK_C3_2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002203 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002204 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002205 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002206}
2207
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002208bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00002209 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002210 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00002211 // FIXME: This *really* should not be here. We need some way of translating
2212 // options into llvm subtarget features.
2213 if (!Features.count(Name) &&
Benjamin Kramer84f30802012-07-07 09:39:18 +00002214 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1" &&
2215 Name != "rdrnd"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002216 return false;
2217
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002218 // FIXME: this should probably use a switch with fall through.
2219
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002220 if (Enabled) {
2221 if (Name == "mmx")
2222 Features["mmx"] = true;
2223 else if (Name == "sse")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002224 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002225 else if (Name == "sse2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002226 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002227 else if (Name == "sse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002228 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2229 true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002230 else if (Name == "ssse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002231 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002232 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00002233 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002234 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00002235 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2236 Features["popcnt"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00002237 else if (Name == "sse4.1")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002238 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00002239 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002240 else if (Name == "3dnow")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002241 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002242 else if (Name == "3dnowa")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002243 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00002244 else if (Name == "aes")
Craig Toppera7463c32012-06-03 21:56:22 +00002245 Features["sse"] = Features["sse2"] = Features["aes"] = true;
Craig Topper3c0bc152012-05-31 05:18:48 +00002246 else if (Name == "pclmul")
Craig Toppera7463c32012-06-03 21:56:22 +00002247 Features["sse"] = Features["sse2"] = Features["pclmul"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00002248 else if (Name == "avx")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002249 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2250 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00002251 Features["popcnt"] = Features["avx"] = true;
Craig Topper2b03bb02011-12-17 19:55:21 +00002252 else if (Name == "avx2")
2253 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2254 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00002255 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topper2ae95072012-06-03 21:46:30 +00002256 else if (Name == "fma")
2257 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2258 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2259 Features["popcnt"] = Features["avx"] = Features["fma"] = true;
Craig Topper6a511e12011-12-30 07:33:42 +00002260 else if (Name == "fma4")
Eli Friedman612db2a2012-11-17 01:16:19 +00002261 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00002262 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper90ea0362012-05-30 05:54:54 +00002263 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
2264 Features["fma4"] = true;
Craig Topperb6af69e2012-06-09 22:24:14 +00002265 else if (Name == "xop")
Eli Friedman612db2a2012-11-17 01:16:19 +00002266 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002267 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2268 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
2269 Features["fma4"] = Features["xop"] = true;
Roman Divacky80b32b82011-10-30 13:47:56 +00002270 else if (Name == "sse4a")
Craig Topper6a511e12011-12-30 07:33:42 +00002271 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper90ea0362012-05-30 05:54:54 +00002272 Features["sse4a"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00002273 else if (Name == "lzcnt")
2274 Features["lzcnt"] = true;
Benjamin Kramer84f30802012-07-07 09:39:18 +00002275 else if (Name == "rdrnd")
2276 Features["rdrand"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00002277 else if (Name == "bmi")
2278 Features["bmi"] = true;
2279 else if (Name == "bmi2")
2280 Features["bmi2"] = true;
Craig Toppere14e08b2011-12-29 16:10:46 +00002281 else if (Name == "popcnt")
2282 Features["popcnt"] = true;
Manman Ren146e5a42012-10-11 00:59:55 +00002283 else if (Name == "f16c")
2284 Features["f16c"] = true;
Michael Liao463eb892012-11-10 05:17:46 +00002285 else if (Name == "rtm")
2286 Features["rtm"] = true;
Michael Liao72339a02013-03-26 17:52:08 +00002287 else if (Name == "prfchw")
2288 Features["prfchw"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002289 } else {
2290 if (Name == "mmx")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002291 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002292 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00002293 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00002294 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper31380fb2012-06-03 22:23:42 +00002295 Features["sse4a"] = Features["avx"] = Features["avx2"] =
2296 Features["fma"] = Features["fma4"] = Features["aes"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002297 Features["pclmul"] = Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002298 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00002299 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Toppera7463c32012-06-03 21:56:22 +00002300 Features["sse41"] = Features["sse42"] = Features["sse4a"] =
Craig Topper31380fb2012-06-03 22:23:42 +00002301 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002302 Features["fma4"] = Features["aes"] = Features["pclmul"] =
2303 Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002304 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00002305 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topper31380fb2012-06-03 22:23:42 +00002306 Features["sse42"] = Features["sse4a"] = Features["avx"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002307 Features["avx2"] = Features["fma"] = Features["fma4"] =
2308 Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002309 else if (Name == "ssse3")
Craig Topper31380fb2012-06-03 22:23:42 +00002310 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2311 Features["avx"] = Features["avx2"] = Features["fma"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00002312 else if (Name == "sse4" || Name == "sse4.1")
Craig Topper31380fb2012-06-03 22:23:42 +00002313 Features["sse41"] = Features["sse42"] = Features["avx"] =
2314 Features["avx2"] = Features["fma"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00002315 else if (Name == "sse4.2")
Craig Topper31380fb2012-06-03 22:23:42 +00002316 Features["sse42"] = Features["avx"] = Features["avx2"] =
2317 Features["fma"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002318 else if (Name == "3dnow")
2319 Features["3dnow"] = Features["3dnowa"] = false;
2320 else if (Name == "3dnowa")
2321 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00002322 else if (Name == "aes")
2323 Features["aes"] = false;
Craig Topper3c0bc152012-05-31 05:18:48 +00002324 else if (Name == "pclmul")
2325 Features["pclmul"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00002326 else if (Name == "avx")
Craig Topper2ae95072012-06-03 21:46:30 +00002327 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002328 Features["fma4"] = Features["xop"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00002329 else if (Name == "avx2")
2330 Features["avx2"] = false;
Craig Topper2ae95072012-06-03 21:46:30 +00002331 else if (Name == "fma")
2332 Features["fma"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00002333 else if (Name == "sse4a")
Craig Topperb6af69e2012-06-09 22:24:14 +00002334 Features["sse4a"] = Features["fma4"] = Features["xop"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002335 else if (Name == "lzcnt")
2336 Features["lzcnt"] = false;
Benjamin Kramer84f30802012-07-07 09:39:18 +00002337 else if (Name == "rdrnd")
2338 Features["rdrand"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002339 else if (Name == "bmi")
2340 Features["bmi"] = false;
2341 else if (Name == "bmi2")
2342 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00002343 else if (Name == "popcnt")
2344 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00002345 else if (Name == "fma4")
Craig Topperb6af69e2012-06-09 22:24:14 +00002346 Features["fma4"] = Features["xop"] = false;
2347 else if (Name == "xop")
2348 Features["xop"] = false;
Manman Ren146e5a42012-10-11 00:59:55 +00002349 else if (Name == "f16c")
2350 Features["f16c"] = false;
Michael Liao463eb892012-11-10 05:17:46 +00002351 else if (Name == "rtm")
2352 Features["rtm"] = false;
Michael Liao72339a02013-03-26 17:52:08 +00002353 else if (Name == "prfchw")
2354 Features["prfchw"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002355 }
2356
2357 return true;
2358}
2359
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002360/// HandleTargetOptions - Perform initialization based on the user
2361/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002362void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002363 // Remember the maximum enabled sselevel.
2364 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2365 // Ignore disabled features.
2366 if (Features[i][0] == '-')
2367 continue;
2368
Benjamin Kramer713575a2012-03-05 15:10:44 +00002369 StringRef Feature = StringRef(Features[i]).substr(1);
2370
2371 if (Feature == "aes") {
Eric Christophereea12d12010-04-02 23:50:19 +00002372 HasAES = true;
2373 continue;
2374 }
2375
Craig Topper3c0bc152012-05-31 05:18:48 +00002376 if (Feature == "pclmul") {
2377 HasPCLMUL = true;
2378 continue;
2379 }
2380
Benjamin Kramer713575a2012-03-05 15:10:44 +00002381 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00002382 HasLZCNT = true;
2383 continue;
2384 }
2385
Benjamin Kramer84f30802012-07-07 09:39:18 +00002386 if (Feature == "rdrand") {
2387 HasRDRND = true;
2388 continue;
2389 }
2390
Benjamin Kramer713575a2012-03-05 15:10:44 +00002391 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00002392 HasBMI = true;
2393 continue;
2394 }
2395
Benjamin Kramer713575a2012-03-05 15:10:44 +00002396 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00002397 HasBMI2 = true;
2398 continue;
2399 }
2400
Benjamin Kramer713575a2012-03-05 15:10:44 +00002401 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00002402 HasPOPCNT = true;
2403 continue;
2404 }
2405
Michael Liao463eb892012-11-10 05:17:46 +00002406 if (Feature == "rtm") {
2407 HasRTM = true;
2408 continue;
2409 }
2410
Michael Liao72339a02013-03-26 17:52:08 +00002411 if (Feature == "prfchw") {
2412 HasPRFCHW = true;
2413 continue;
2414 }
2415
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002416 if (Feature == "sse4a") {
2417 HasSSE4a = true;
2418 continue;
2419 }
2420
Benjamin Kramer713575a2012-03-05 15:10:44 +00002421 if (Feature == "fma4") {
Craig Topper6a511e12011-12-30 07:33:42 +00002422 HasFMA4 = true;
2423 continue;
2424 }
2425
Craig Topper2ae95072012-06-03 21:46:30 +00002426 if (Feature == "fma") {
2427 HasFMA = true;
2428 continue;
2429 }
2430
Craig Topperb6af69e2012-06-09 22:24:14 +00002431 if (Feature == "xop") {
2432 HasXOP = true;
2433 continue;
2434 }
2435
Manman Ren146e5a42012-10-11 00:59:55 +00002436 if (Feature == "f16c") {
2437 HasF16C = true;
2438 continue;
2439 }
2440
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002441 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00002442 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper05fe4b52012-01-09 09:19:09 +00002443 .Case("avx2", AVX2)
2444 .Case("avx", AVX)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002445 .Case("sse42", SSE42)
2446 .Case("sse41", SSE41)
2447 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00002448 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002449 .Case("sse2", SSE2)
2450 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002451 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002452 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002453
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002454 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00002455 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002456 .Case("3dnowa", AMD3DNowAthlon)
2457 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002458 .Case("mmx", MMX)
2459 .Default(NoMMX3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002460
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002461 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002462 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002463
2464 // Don't tell the backend if we're turning off mmx; it will end up disabling
2465 // SSE, which we don't want.
2466 std::vector<std::string>::iterator it;
2467 it = std::find(Features.begin(), Features.end(), "-mmx");
2468 if (it != Features.end())
2469 Features.erase(it);
Chris Lattner3daed522009-03-02 22:20:04 +00002470}
Chris Lattnerc0f59212009-03-02 22:27:17 +00002471
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002472/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2473/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00002474void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002475 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002476 // Target identification.
Derek Schuffbabaf312012-10-11 15:52:22 +00002477 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002478 Builder.defineMacro("__amd64__");
2479 Builder.defineMacro("__amd64");
2480 Builder.defineMacro("__x86_64");
2481 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00002482 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00002483 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00002484 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002485
Chris Lattnerc0f59212009-03-02 22:27:17 +00002486 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002487 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2488 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002489 switch (CPU) {
2490 case CK_Generic:
2491 break;
2492 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002493 // The rest are coming from the i386 define above.
2494 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002495 break;
2496 case CK_i486:
2497 case CK_WinChipC6:
2498 case CK_WinChip2:
2499 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002500 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002501 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002502 case CK_PentiumMMX:
2503 Builder.defineMacro("__pentium_mmx__");
2504 Builder.defineMacro("__tune_pentium_mmx__");
2505 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002506 case CK_i586:
2507 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002508 defineCPUMacros(Builder, "i586");
2509 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002510 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002511 case CK_Pentium3:
2512 case CK_Pentium3M:
2513 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002514 Builder.defineMacro("__tune_pentium3__");
2515 // Fallthrough
2516 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002517 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002518 Builder.defineMacro("__tune_pentium2__");
2519 // Fallthrough
2520 case CK_PentiumPro:
2521 Builder.defineMacro("__tune_i686__");
2522 Builder.defineMacro("__tune_pentiumpro__");
2523 // Fallthrough
2524 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002525 Builder.defineMacro("__i686");
2526 Builder.defineMacro("__i686__");
2527 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2528 Builder.defineMacro("__pentiumpro");
2529 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002530 break;
2531 case CK_Pentium4:
2532 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002533 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002534 break;
2535 case CK_Yonah:
2536 case CK_Prescott:
2537 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002538 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002539 break;
2540 case CK_Core2:
2541 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002542 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002543 break;
2544 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002545 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002546 break;
2547 case CK_Corei7:
2548 case CK_Corei7AVX:
2549 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002550 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002551 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002552 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002553 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002554 Builder.defineMacro("__k6_2__");
2555 Builder.defineMacro("__tune_k6_2__");
2556 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002557 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002558 if (CPU != CK_K6_2) { // In case of fallthrough
2559 // FIXME: GCC may be enabling these in cases where some other k6
2560 // architecture is specified but -m3dnow is explicitly provided. The
2561 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002562 Builder.defineMacro("__k6_3__");
2563 Builder.defineMacro("__tune_k6_3__");
2564 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00002565 // Fallthrough
2566 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002567 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002568 break;
2569 case CK_Athlon:
2570 case CK_AthlonThunderbird:
2571 case CK_Athlon4:
2572 case CK_AthlonXP:
2573 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002574 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002575 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002576 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002577 Builder.defineMacro("__tune_athlon_sse__");
2578 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002579 break;
2580 case CK_K8:
2581 case CK_K8SSE3:
2582 case CK_x86_64:
2583 case CK_Opteron:
2584 case CK_OpteronSSE3:
2585 case CK_Athlon64:
2586 case CK_Athlon64SSE3:
2587 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002588 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002589 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002590 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002591 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00002592 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002593 case CK_BTVER1:
2594 defineCPUMacros(Builder, "btver1");
2595 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002596 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002597 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002598 break;
2599 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002600 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002601 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002602 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002603 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002604 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002605 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00002606
Chandler Carruth88c75b02011-09-28 09:54:07 +00002607 // Target properties.
2608 Builder.defineMacro("__LITTLE_ENDIAN__");
2609 Builder.defineMacro("__REGISTER_PREFIX__", "");
2610
Chris Lattner54175442009-04-19 17:32:33 +00002611 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2612 // functions in glibc header files that use FP Stack inline asm which the
2613 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00002614 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002615
Chandler Carruth88c75b02011-09-28 09:54:07 +00002616 if (HasAES)
2617 Builder.defineMacro("__AES__");
2618
Craig Topper3c0bc152012-05-31 05:18:48 +00002619 if (HasPCLMUL)
2620 Builder.defineMacro("__PCLMUL__");
2621
Craig Topper31ceea02011-12-25 05:06:45 +00002622 if (HasLZCNT)
2623 Builder.defineMacro("__LZCNT__");
2624
Benjamin Kramer84f30802012-07-07 09:39:18 +00002625 if (HasRDRND)
2626 Builder.defineMacro("__RDRND__");
2627
Craig Topper31ceea02011-12-25 05:06:45 +00002628 if (HasBMI)
2629 Builder.defineMacro("__BMI__");
2630
2631 if (HasBMI2)
2632 Builder.defineMacro("__BMI2__");
2633
Craig Toppere14e08b2011-12-29 16:10:46 +00002634 if (HasPOPCNT)
2635 Builder.defineMacro("__POPCNT__");
2636
Michael Liao463eb892012-11-10 05:17:46 +00002637 if (HasRTM)
2638 Builder.defineMacro("__RTM__");
2639
Michael Liao72339a02013-03-26 17:52:08 +00002640 if (HasPRFCHW)
2641 Builder.defineMacro("__PRFCHW__");
2642
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002643 if (HasSSE4a)
2644 Builder.defineMacro("__SSE4A__");
2645
Craig Topper6a511e12011-12-30 07:33:42 +00002646 if (HasFMA4)
2647 Builder.defineMacro("__FMA4__");
2648
Craig Topper2ae95072012-06-03 21:46:30 +00002649 if (HasFMA)
2650 Builder.defineMacro("__FMA__");
2651
Craig Topperb6af69e2012-06-09 22:24:14 +00002652 if (HasXOP)
2653 Builder.defineMacro("__XOP__");
2654
Manman Ren146e5a42012-10-11 00:59:55 +00002655 if (HasF16C)
2656 Builder.defineMacro("__F16C__");
2657
Chris Lattner84f0ea82009-03-02 22:40:39 +00002658 // Each case falls through to the previous one here.
2659 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002660 case AVX2:
2661 Builder.defineMacro("__AVX2__");
2662 case AVX:
2663 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002664 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00002665 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002666 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002667 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002668 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002669 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002670 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002671 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002672 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002673 Builder.defineMacro("__SSE2__");
2674 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002675 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002676 Builder.defineMacro("__SSE__");
2677 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002678 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002679 break;
2680 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002681
Derek Schuffbabaf312012-10-11 15:52:22 +00002682 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002683 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002684 case AVX2:
2685 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002686 case SSE42:
2687 case SSE41:
2688 case SSSE3:
2689 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002690 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002691 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002692 break;
2693 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002694 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002695 break;
2696 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002697 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002698 }
2699 }
2700
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002701 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002702 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002703 case AMD3DNowAthlon:
2704 Builder.defineMacro("__3dNOW_A__");
2705 case AMD3DNow:
2706 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002707 case MMX:
2708 Builder.defineMacro("__MMX__");
2709 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002710 break;
2711 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00002712}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002713
Douglas Gregore727d212012-01-30 06:38:25 +00002714bool X86TargetInfo::hasFeature(StringRef Feature) const {
2715 return llvm::StringSwitch<bool>(Feature)
2716 .Case("aes", HasAES)
2717 .Case("avx", SSELevel >= AVX)
2718 .Case("avx2", SSELevel >= AVX2)
2719 .Case("bmi", HasBMI)
2720 .Case("bmi2", HasBMI2)
Craig Topper2ae95072012-06-03 21:46:30 +00002721 .Case("fma", HasFMA)
Douglas Gregore727d212012-01-30 06:38:25 +00002722 .Case("fma4", HasFMA4)
2723 .Case("lzcnt", HasLZCNT)
Benjamin Kramer84f30802012-07-07 09:39:18 +00002724 .Case("rdrnd", HasRDRND)
Douglas Gregore727d212012-01-30 06:38:25 +00002725 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2726 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2727 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00002728 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00002729 .Case("popcnt", HasPOPCNT)
Michael Liao463eb892012-11-10 05:17:46 +00002730 .Case("rtm", HasRTM)
Michael Liao72339a02013-03-26 17:52:08 +00002731 .Case("prfchw", HasPRFCHW)
Douglas Gregore727d212012-01-30 06:38:25 +00002732 .Case("sse", SSELevel >= SSE1)
2733 .Case("sse2", SSELevel >= SSE2)
2734 .Case("sse3", SSELevel >= SSE3)
2735 .Case("ssse3", SSELevel >= SSSE3)
2736 .Case("sse41", SSELevel >= SSE41)
2737 .Case("sse42", SSELevel >= SSE42)
Craig Topper3c0bc152012-05-31 05:18:48 +00002738 .Case("sse4a", HasSSE4a)
Douglas Gregore727d212012-01-30 06:38:25 +00002739 .Case("x86", true)
Derek Schuffbabaf312012-10-11 15:52:22 +00002740 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2741 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Craig Topperb6af69e2012-06-09 22:24:14 +00002742 .Case("xop", HasXOP)
Manman Ren146e5a42012-10-11 00:59:55 +00002743 .Case("f16c", HasF16C)
Douglas Gregore727d212012-01-30 06:38:25 +00002744 .Default(false);
2745}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002746
Eli Friedman618234a2008-08-20 02:34:37 +00002747bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002748X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002749 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002750 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002751 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002752 case 'Y': // first letter of a pair:
2753 switch (*(Name+1)) {
2754 default: return false;
2755 case '0': // First SSE register.
2756 case 't': // Any SSE register, when SSE2 is enabled.
2757 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2758 case 'm': // any MMX register, when inter-unit moves enabled.
2759 break; // falls through to setAllowsRegister.
2760 }
Eli Friedman618234a2008-08-20 02:34:37 +00002761 case 'a': // eax.
2762 case 'b': // ebx.
2763 case 'c': // ecx.
2764 case 'd': // edx.
2765 case 'S': // esi.
2766 case 'D': // edi.
2767 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002768 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002769 case 't': // top of floating point stack.
2770 case 'u': // second from top of floating point stack.
2771 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002772 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002773 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002774 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002775 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2776 case 'l': // "Index" registers: any general register that can be used as an
2777 // index in a base+index memory access.
2778 Info.setAllowsRegister();
2779 return true;
2780 case 'C': // SSE floating point constant.
2781 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002782 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002783 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002784 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002785 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002786 return true;
2787 }
2788}
2789
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002790
Eli Friedman618234a2008-08-20 02:34:37 +00002791std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002792X86TargetInfo::convertConstraint(const char *&Constraint) const {
2793 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002794 case 'a': return std::string("{ax}");
2795 case 'b': return std::string("{bx}");
2796 case 'c': return std::string("{cx}");
2797 case 'd': return std::string("{dx}");
2798 case 'S': return std::string("{si}");
2799 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002800 case 'p': // address
2801 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002802 case 't': // top of floating point stack.
2803 return std::string("{st}");
2804 case 'u': // second from top of floating point stack.
2805 return std::string("{st(1)}"); // second from top of floating point stack.
2806 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002807 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002808 }
2809}
Eli Friedman618234a2008-08-20 02:34:37 +00002810} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002811
2812namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002813// X86-32 generic target
2814class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002815public:
Eli Friedman618234a2008-08-20 02:34:37 +00002816 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2817 DoubleAlign = LongLongAlign = 32;
2818 LongDoubleWidth = 96;
2819 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002820 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002821 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2822 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002823 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002824 SizeType = UnsignedInt;
2825 PtrDiffType = SignedInt;
2826 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002827 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002828
2829 // Use fpret for all types.
2830 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2831 (1 << TargetInfo::Double) |
2832 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002833
2834 // x86-32 has atomics up to 8 bytes
2835 // FIXME: Check that we actually have cmpxchg8b before setting
2836 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2837 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002838 }
Meador Ingec5613b22012-06-16 03:34:49 +00002839 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2840 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman618234a2008-08-20 02:34:37 +00002841 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002842
Chris Lattner21fb98e2009-09-23 06:06:36 +00002843 int getEHDataRegisterNumber(unsigned RegNo) const {
2844 if (RegNo == 0) return 0;
2845 if (RegNo == 1) return 2;
2846 return -1;
2847 }
Bill Wendling68fd6082012-11-12 06:42:51 +00002848 virtual bool validateInputSize(StringRef Constraint,
2849 unsigned Size) const {
2850 switch (Constraint[0]) {
2851 default: break;
2852 case 'a':
2853 case 'b':
2854 case 'c':
2855 case 'd':
Bill Wendlingf634bdf2012-11-12 18:52:32 +00002856 return Size <= 32;
Bill Wendling68fd6082012-11-12 06:42:51 +00002857 }
2858
2859 return true;
2860 }
Eli Friedman618234a2008-08-20 02:34:37 +00002861};
2862} // end anonymous namespace
2863
2864namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002865class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2866public:
2867 NetBSDI386TargetInfo(const std::string &triple) :
2868 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2869 }
2870
2871 virtual unsigned getFloatEvalMethod() const {
2872 // NetBSD defaults to "double" rounding
2873 return 1;
2874 }
2875};
2876} // end anonymous namespace
2877
2878namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002879class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2880public:
2881 OpenBSDI386TargetInfo(const std::string& triple) :
2882 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2883 SizeType = UnsignedLong;
2884 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002885 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002886 }
2887};
2888} // end anonymous namespace
2889
2890namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00002891class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
2892public:
2893 BitrigI386TargetInfo(const std::string& triple) :
2894 BitrigTargetInfo<X86_32TargetInfo>(triple) {
2895 SizeType = UnsignedLong;
2896 IntPtrType = SignedLong;
2897 PtrDiffType = SignedLong;
2898 }
2899};
2900} // end anonymous namespace
2901
2902namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002903class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002904public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002905 DarwinI386TargetInfo(const std::string& triple) :
2906 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002907 LongDoubleWidth = 128;
2908 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002909 SuitableAlign = 128;
Chad Rosierf9e9af72012-07-13 23:57:43 +00002910 MaxVectorAlign = 256;
Eli Friedman1afabd92009-03-29 20:31:09 +00002911 SizeType = UnsignedLong;
2912 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002913 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2914 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002915 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002916 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002917 }
2918
Eli Friedman618234a2008-08-20 02:34:37 +00002919};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002920} // end anonymous namespace
2921
2922namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002923// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002924class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002925public:
2926 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002927 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002928 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002929 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002930 DoubleAlign = LongLongAlign = 64;
2931 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 +00002932 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002933 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002934 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002935 virtual void getTargetDefines(const LangOptions &Opts,
2936 MacroBuilder &Builder) const {
2937 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2938 }
2939};
2940} // end anonymous namespace
2941
2942namespace {
2943
2944// x86-32 Windows Visual Studio target
2945class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2946public:
2947 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2948 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002949 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002950 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2951 }
2952 virtual void getTargetDefines(const LangOptions &Opts,
2953 MacroBuilder &Builder) const {
2954 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2955 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2956 // The value of the following reflects processor type.
2957 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2958 // We lost the original triple, so we use the default.
2959 Builder.defineMacro("_M_IX86", "600");
2960 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002961};
2962} // end anonymous namespace
2963
2964namespace {
2965// x86-32 MinGW target
2966class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2967public:
2968 MinGWX86_32TargetInfo(const std::string& triple)
2969 : WindowsX86_32TargetInfo(triple) {
2970 }
2971 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002972 MacroBuilder &Builder) const {
2973 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002974 DefineStd(Builder, "WIN32", Opts);
2975 DefineStd(Builder, "WINNT", Opts);
2976 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002977 Builder.defineMacro("__MSVCRT__");
2978 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002979
2980 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2981 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002982 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002983 // Provide "as-is" __declspec.
2984 Builder.defineMacro("__declspec", "__declspec");
2985 else
2986 // Provide alias of __attribute__ like mingw32-gcc.
2987 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002988 }
2989};
2990} // end anonymous namespace
2991
2992namespace {
2993// x86-32 Cygwin target
2994class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2995public:
2996 CygwinX86_32TargetInfo(const std::string& triple)
2997 : X86_32TargetInfo(triple) {
2998 TLSSupported = false;
2999 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003000 DoubleAlign = LongLongAlign = 64;
3001 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3002 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003003 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003004 }
3005 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003006 MacroBuilder &Builder) const {
3007 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumie72f4d92012-12-14 10:17:26 +00003008 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00003009 Builder.defineMacro("__CYGWIN__");
3010 Builder.defineMacro("__CYGWIN32__");
3011 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00003012 if (Opts.CPlusPlus)
3013 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00003014 }
Eli Friedman29a30502008-08-21 01:40:19 +00003015};
3016} // end anonymous namespace
3017
3018namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00003019// x86-32 Haiku target
3020class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3021public:
3022 HaikuX86_32TargetInfo(const std::string& triple)
3023 : X86_32TargetInfo(triple) {
3024 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00003025 IntPtrType = SignedLong;
3026 PtrDiffType = SignedLong;
Eli Friedman6902e412012-11-27 02:58:24 +00003027 ProcessIDType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00003028 this->UserLabelPrefix = "";
Benjamin Krameref7bcea2012-11-08 12:59:15 +00003029 this->TLSSupported = false;
Eli Friedmana7e68452010-08-22 01:00:03 +00003030 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00003031 virtual void getTargetDefines(const LangOptions &Opts,
3032 MacroBuilder &Builder) const {
3033 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3034 Builder.defineMacro("__INTEL__");
3035 Builder.defineMacro("__HAIKU__");
3036 }
3037};
3038} // end anonymous namespace
3039
Douglas Gregordca52262011-07-01 22:41:14 +00003040// RTEMS Target
3041template<typename Target>
3042class RTEMSTargetInfo : public OSTargetInfo<Target> {
3043protected:
3044 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3045 MacroBuilder &Builder) const {
3046 // RTEMS defines; list based off of gcc output
3047
Douglas Gregordca52262011-07-01 22:41:14 +00003048 Builder.defineMacro("__rtems__");
3049 Builder.defineMacro("__ELF__");
3050 }
3051public:
3052 RTEMSTargetInfo(const std::string &triple)
3053 : OSTargetInfo<Target>(triple) {
3054 this->UserLabelPrefix = "";
3055
3056 llvm::Triple Triple(triple);
3057 switch (Triple.getArch()) {
3058 default:
3059 case llvm::Triple::x86:
3060 // this->MCountName = ".mcount";
3061 break;
3062 case llvm::Triple::mips:
3063 case llvm::Triple::mipsel:
3064 case llvm::Triple::ppc:
3065 case llvm::Triple::ppc64:
3066 // this->MCountName = "_mcount";
3067 break;
3068 case llvm::Triple::arm:
3069 // this->MCountName = "__mcount";
3070 break;
3071 }
3072
3073 }
3074};
3075
3076namespace {
3077// x86-32 RTEMS target
3078class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3079public:
3080 RTEMSX86_32TargetInfo(const std::string& triple)
3081 : X86_32TargetInfo(triple) {
3082 SizeType = UnsignedLong;
3083 IntPtrType = SignedLong;
3084 PtrDiffType = SignedLong;
3085 this->UserLabelPrefix = "";
3086 }
3087 virtual void getTargetDefines(const LangOptions &Opts,
3088 MacroBuilder &Builder) const {
3089 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3090 Builder.defineMacro("__INTEL__");
3091 Builder.defineMacro("__rtems__");
3092 }
3093};
3094} // end anonymous namespace
3095
Chris Lattner86ed3a32010-04-11 19:29:39 +00003096namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00003097// x86-64 generic target
3098class X86_64TargetInfo : public X86TargetInfo {
3099public:
Chris Lattner33328642009-03-20 15:52:06 +00003100 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00003101 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00003102 LongDoubleWidth = 128;
3103 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00003104 LargeArrayMinWidth = 128;
3105 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003106 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00003107 IntMaxType = SignedLong;
3108 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003109 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00003110 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00003111
Eli Friedmaned855cb2008-08-21 00:13:15 +00003112 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3113 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003114 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00003115
3116 // Use fpret only for long double.
3117 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00003118
Anders Carlssoneea64802011-10-31 16:27:11 +00003119 // Use fp2ret for _Complex long double.
3120 ComplexLongDoubleUsesFP2Ret = true;
3121
Eli Friedman2be46072011-10-14 20:59:01 +00003122 // x86-64 has atomics up to 16 bytes.
3123 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3124 // on CPUs with cmpxchg16b
3125 MaxAtomicPromoteWidth = 128;
3126 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00003127 }
Meador Ingec5613b22012-06-16 03:34:49 +00003128 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3129 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson3346ae62007-11-24 23:38:12 +00003130 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00003131
Chris Lattner21fb98e2009-09-23 06:06:36 +00003132 int getEHDataRegisterNumber(unsigned RegNo) const {
3133 if (RegNo == 0) return 0;
3134 if (RegNo == 1) return 1;
3135 return -1;
3136 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003137
3138 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Peter Collingbourne7728cdd2013-02-23 00:06:18 +00003139 return (CC == CC_Default ||
3140 CC == CC_C ||
3141 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003142 }
3143
Aaron Ballmanfff32482012-12-09 17:45:41 +00003144 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3145 return CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003146 }
3147
Eli Friedman618234a2008-08-20 02:34:37 +00003148};
3149} // end anonymous namespace
3150
3151namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003152// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003153class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003154public:
3155 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003156 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003157 TLSSupported = false;
3158 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00003159 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00003160 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00003161 IntMaxType = SignedLongLong;
3162 UIntMaxType = UnsignedLongLong;
3163 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00003164 SizeType = UnsignedLongLong;
3165 PtrDiffType = SignedLongLong;
3166 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00003167 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003168 }
3169 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003170 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003171 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003172 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00003173 }
Meador Ingec5613b22012-06-16 03:34:49 +00003174 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3175 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumi79521992011-01-17 22:56:23 +00003176 }
Michael J. Spencera764e832010-10-21 08:22:51 +00003177};
3178} // end anonymous namespace
3179
3180namespace {
3181// x86-64 Windows Visual Studio target
3182class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3183public:
3184 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
3185 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003186 LongDoubleWidth = LongDoubleAlign = 64;
3187 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00003188 }
3189 virtual void getTargetDefines(const LangOptions &Opts,
3190 MacroBuilder &Builder) const {
3191 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3192 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00003193 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003194 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003195 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003196};
3197} // end anonymous namespace
3198
3199namespace {
3200// x86-64 MinGW target
3201class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3202public:
3203 MinGWX86_64TargetInfo(const std::string& triple)
3204 : WindowsX86_64TargetInfo(triple) {
3205 }
3206 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003207 MacroBuilder &Builder) const {
3208 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00003209 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00003210 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00003211 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00003212 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003213
3214 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3215 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00003216 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003217 // Provide "as-is" __declspec.
3218 Builder.defineMacro("__declspec", "__declspec");
3219 else
3220 // Provide alias of __attribute__ like mingw32-gcc.
3221 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003222 }
3223};
3224} // end anonymous namespace
3225
3226namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003227class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3228public:
Mike Stump1eb44332009-09-09 15:08:12 +00003229 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003230 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
3231 Int64Type = SignedLongLong;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003232 MaxVectorAlign = 256;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003233 }
3234};
3235} // end anonymous namespace
3236
3237namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00003238class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3239public:
Mike Stump1eb44332009-09-09 15:08:12 +00003240 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00003241 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
3242 IntMaxType = SignedLongLong;
3243 UIntMaxType = UnsignedLongLong;
3244 Int64Type = SignedLongLong;
3245 }
3246};
3247} // end anonymous namespace
3248
3249namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003250class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3251public:
3252 BitrigX86_64TargetInfo(const std::string& triple)
3253 : BitrigTargetInfo<X86_64TargetInfo>(triple) {
3254 IntMaxType = SignedLongLong;
3255 UIntMaxType = UnsignedLongLong;
3256 Int64Type = SignedLongLong;
3257 }
3258};
Tim Northoverc264e162013-01-31 12:13:10 +00003259}
3260
3261namespace {
3262class AArch64TargetInfo : public TargetInfo {
3263 static const char * const GCCRegNames[];
3264 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3265public:
3266 AArch64TargetInfo(const std::string& triple) : TargetInfo(triple) {
3267 BigEndian = false;
3268 LongWidth = LongAlign = 64;
3269 LongDoubleWidth = LongDoubleAlign = 128;
3270 PointerWidth = PointerAlign = 64;
3271 SuitableAlign = 128;
3272 DescriptionString = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3273 "i64:64:64-i128:128:128-f32:32:32-f64:64:64-"
3274 "f128:128:128-n32:64-S128";
3275
3276 WCharType = UnsignedInt;
3277 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3278
Tim Northover6a93c862013-02-18 12:11:32 +00003279 // AArch64 backend supports 64-bit operations at the moment. In principle
3280 // 128-bit is possible if register-pairs are used.
3281 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3282
Tim Northoverc264e162013-01-31 12:13:10 +00003283 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3284 }
3285 virtual void getTargetDefines(const LangOptions &Opts,
3286 MacroBuilder &Builder) const {
3287 // GCC defines theses currently
3288 Builder.defineMacro("__aarch64__");
3289 Builder.defineMacro("__AARCH64EL__");
3290
3291 // ACLE predefines. Many can only have one possible value on v8 AArch64.
3292
3293 // FIXME: these were written based on an unreleased version of a 32-bit ACLE
3294 // which was intended to be compatible with a 64-bit implementation. They
3295 // will need updating when a real 64-bit ACLE exists. Particularly pressing
3296 // instances are: __AARCH_ISA_A32, __AARCH_ISA_T32, __ARCH_PCS.
3297 Builder.defineMacro("__AARCH_ACLE", "101");
3298 Builder.defineMacro("__AARCH", "8");
3299 Builder.defineMacro("__AARCH_PROFILE", "'A'");
3300
3301 Builder.defineMacro("__AARCH_FEATURE_UNALIGNED");
3302 Builder.defineMacro("__AARCH_FEATURE_CLZ");
3303 Builder.defineMacro("__AARCH_FEATURE_FMA");
3304
3305 // FIXME: ACLE 1.1 reserves bit 4. Will almost certainly come to mean
3306 // 128-bit LDXP present, at which point this becomes 0x1f.
3307 Builder.defineMacro("__AARCH_FEATURE_LDREX", "0xf");
3308
3309 // 0xe implies support for half, single and double precision operations.
3310 Builder.defineMacro("__AARCH_FP", "0xe");
3311
3312 // PCS specifies this for SysV variants, which is all we support. Other ABIs
3313 // may choose __AARCH_FP16_FORMAT_ALTERNATIVE.
3314 Builder.defineMacro("__AARCH_FP16_FORMAT_IEEE");
3315
3316 if (Opts.FastMath || Opts.FiniteMathOnly)
3317 Builder.defineMacro("__AARCH_FP_FAST");
3318
3319 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
3320 Builder.defineMacro("__AARCH_FP_FENV_ROUNDING");
3321
3322 Builder.defineMacro("__AARCH_SIZEOF_WCHAR_T",
3323 Opts.ShortWChar ? "2" : "4");
3324
3325 Builder.defineMacro("__AARCH_SIZEOF_MINIMAL_ENUM",
3326 Opts.ShortEnums ? "1" : "4");
3327
3328 if (BigEndian)
3329 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3330 }
3331 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3332 unsigned &NumRecords) const {
3333 Records = 0;
3334 NumRecords = 0;
3335 }
3336 virtual bool hasFeature(StringRef Feature) const {
3337 return Feature == "aarch64";
3338 }
3339 virtual void getGCCRegNames(const char * const *&Names,
3340 unsigned &NumNames) const;
3341 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3342 unsigned &NumAliases) const;
3343
3344 virtual bool isCLZForZeroUndef() const { return false; }
3345
3346 virtual bool validateAsmConstraint(const char *&Name,
3347 TargetInfo::ConstraintInfo &Info) const {
3348 switch (*Name) {
3349 default: return false;
3350 case 'w': // An FP/SIMD vector register
3351 Info.setAllowsRegister();
3352 return true;
3353 case 'I': // Constant that can be used with an ADD instruction
3354 case 'J': // Constant that can be used with a SUB instruction
3355 case 'K': // Constant that can be used with a 32-bit logical instruction
3356 case 'L': // Constant that can be used with a 64-bit logical instruction
3357 case 'M': // Constant that can be used as a 32-bit MOV immediate
3358 case 'N': // Constant that can be used as a 64-bit MOV immediate
3359 case 'Y': // Floating point constant zero
3360 case 'Z': // Integer constant zero
3361 return true;
3362 case 'Q': // A memory reference with base register and no offset
3363 Info.setAllowsMemory();
3364 return true;
3365 case 'S': // A symbolic address
3366 Info.setAllowsRegister();
3367 return true;
3368 case 'U':
3369 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3370 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3371 // Usa: An absolute symbolic address
3372 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3373 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3374 }
3375 }
3376
3377 virtual const char *getClobbers() const {
3378 // There are no AArch64 clobbers shared by all asm statements.
3379 return "";
3380 }
3381
3382 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3383 return TargetInfo::AArch64ABIBuiltinVaList;
3384 }
3385};
3386
3387const char * const AArch64TargetInfo::GCCRegNames[] = {
3388 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3389 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3390 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3391 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3392
3393 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3394 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3395 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3396 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3397
3398 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3399 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3400 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3401 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3402
3403 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3404 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3405 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3406 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3407
3408 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3409 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3410 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3411 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3412
3413 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3414 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3415 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3416 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3417
3418 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3419 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3420 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3421 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3422};
3423
3424void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3425 unsigned &NumNames) const {
3426 Names = GCCRegNames;
3427 NumNames = llvm::array_lengthof(GCCRegNames);
3428}
3429
3430const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3431 { { "x16" }, "ip0"},
3432 { { "x17" }, "ip1"},
3433 { { "x29" }, "fp" },
3434 { { "x30" }, "lr" }
3435};
3436
3437void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3438 unsigned &NumAliases) const {
3439 Aliases = GCCRegAliases;
3440 NumAliases = llvm::array_lengthof(GCCRegAliases);
3441
3442}
Eli Friedman42f74f22012-08-08 23:57:20 +00003443} // end anonymous namespace
3444
3445namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00003446class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003447 // Possible FPU choices.
3448 enum FPUMode {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003449 VFP2FPU = (1 << 0),
3450 VFP3FPU = (1 << 1),
3451 VFP4FPU = (1 << 2),
3452 NeonFPU = (1 << 3)
Daniel Dunbara91320b2009-12-21 23:28:17 +00003453 };
3454
3455 static bool FPUModeIsVFP(FPUMode Mode) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003456 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU);
Daniel Dunbara91320b2009-12-21 23:28:17 +00003457 }
3458
3459 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3460 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003461
Daniel Dunbareac7c532009-12-18 18:42:37 +00003462 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003463
Bob Wilsoncfaab002012-09-29 23:52:52 +00003464 unsigned FPU : 4;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003465
Logan Chieneae5a8202012-10-10 06:56:20 +00003466 unsigned IsAAPCS : 1;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003467 unsigned IsThumb : 1;
3468
3469 // Initialized via features.
3470 unsigned SoftFloat : 1;
3471 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003472
Chris Lattner2752c012010-03-03 19:03:45 +00003473 static const Builtin::Info BuiltinInfo[];
3474
Chris Lattner393ff042008-04-21 18:56:49 +00003475public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003476 ARMTargetInfo(const std::string &TripleStr)
Logan Chieneae5a8202012-10-10 06:56:20 +00003477 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s"), IsAAPCS(true)
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003478 {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003479 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003480 SizeType = UnsignedInt;
3481 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00003482 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3483 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003484
Chris Lattner9bffb072010-04-23 16:29:58 +00003485 // {} in inline assembly are neon specifiers, not assembly variant
3486 // specifiers.
3487 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00003488
Daniel Dunbareac7c532009-12-18 18:42:37 +00003489 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00003490 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003491 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003492 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3493 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003494 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
3495 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003496 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003497 } else {
3498 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3499 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003500 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003501 }
John McCallee79a4c2010-08-21 22:46:04 +00003502
3503 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00003504 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00003505
3506 // ARM has atomics up to 8 bytes
3507 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
3508 MaxAtomicPromoteWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00003509
3510 // Do force alignment of members that follow zero length bitfields. If
3511 // the alignment of the zero-length bitfield is greater than the member
3512 // that follows it, `bar', `bar' will be aligned as the type of the
3513 // zero length bitfield.
3514 UseZeroLengthBitfieldAlignment = true;
Eli Friedman61538a72008-05-20 14:21:01 +00003515 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003516 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00003517 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003518 ABI = Name;
3519
Daniel Dunbara2a41612009-09-14 00:02:24 +00003520 // The defaults (above) are for AAPCS, check if we need to change them.
3521 //
3522 // FIXME: We need support for -meabi... we could just mangle it into the
3523 // name.
3524 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003525 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindola27fa2362012-12-13 04:17:14 +00003526 // size_t is unsigned int on FreeBSD.
3527 if (getTriple().getOS() != llvm::Triple::FreeBSD)
3528 SizeType = UnsignedLong;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003529
James Molloya6d81f92011-11-23 13:35:08 +00003530 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3531 WCharType = SignedInt;
3532
Daniel Dunbar684de632010-04-22 16:14:54 +00003533 // Do not respect the alignment of bit-field types when laying out
3534 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3535 UseBitFieldTypeAlignment = false;
3536
Chad Rosier61a62212011-08-04 01:21:14 +00003537 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00003538 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3539 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00003540 ZeroLengthBitfieldBoundary = 32;
3541
Logan Chieneae5a8202012-10-10 06:56:20 +00003542 IsAAPCS = false;
3543
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003544 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003545 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3546 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003547 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 +00003548 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003549 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003550 } else {
3551 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 +00003552 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003553 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003554 }
3555
Chad Rosier9f1210c2011-07-26 07:03:04 +00003556 // FIXME: Override "preferred align" for double and long long.
David Tweedb16abb12012-10-25 13:33:01 +00003557 } else if (Name == "aapcs" || Name == "aapcs-vfp") {
Logan Chieneae5a8202012-10-10 06:56:20 +00003558 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003559 // FIXME: Enumerated types are variable width in straight AAPCS.
3560 } else if (Name == "aapcs-linux") {
Logan Chieneae5a8202012-10-10 06:56:20 +00003561 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003562 } else
3563 return false;
3564
3565 return true;
3566 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003567
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003568 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003569 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3570 Features["vfp2"] = true;
Bob Wilsoncfaab002012-09-29 23:52:52 +00003571 else if (CPU == "cortex-a8" || CPU == "cortex-a15" ||
3572 CPU == "cortex-a9" || CPU == "cortex-a9-mp")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003573 Features["neon"] = true;
Bob Wilsonfc553452013-03-04 22:37:46 +00003574 else if (CPU == "swift" || CPU == "cortex-a7") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003575 Features["vfp4"] = true;
3576 Features["neon"] = true;
3577 }
Daniel Dunbara91320b2009-12-21 23:28:17 +00003578 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00003579
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003580 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00003581 StringRef Name,
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003582 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00003583 if (Name == "soft-float" || Name == "soft-float-abi" ||
Bob Wilsoncfaab002012-09-29 23:52:52 +00003584 Name == "vfp2" || Name == "vfp3" || Name == "vfp4" || Name == "neon" ||
3585 Name == "d16" || Name == "neonfp") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003586 Features[Name] = Enabled;
3587 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003588 return false;
3589
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003590 return true;
3591 }
3592
3593 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003594 FPU = 0;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003595 SoftFloat = SoftFloatABI = false;
3596 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3597 if (Features[i] == "+soft-float")
3598 SoftFloat = true;
3599 else if (Features[i] == "+soft-float-abi")
3600 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003601 else if (Features[i] == "+vfp2")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003602 FPU |= VFP2FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003603 else if (Features[i] == "+vfp3")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003604 FPU |= VFP3FPU;
3605 else if (Features[i] == "+vfp4")
3606 FPU |= VFP4FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003607 else if (Features[i] == "+neon")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003608 FPU |= NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003609 }
3610
3611 // Remove front-end specific options which the backend handles differently.
3612 std::vector<std::string>::iterator it;
3613 it = std::find(Features.begin(), Features.end(), "+soft-float");
3614 if (it != Features.end())
3615 Features.erase(it);
3616 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3617 if (it != Features.end())
3618 Features.erase(it);
3619 }
3620
Douglas Gregore727d212012-01-30 06:38:25 +00003621 virtual bool hasFeature(StringRef Feature) const {
3622 return llvm::StringSwitch<bool>(Feature)
3623 .Case("arm", true)
3624 .Case("softfloat", SoftFloat)
3625 .Case("thumb", IsThumb)
3626 .Case("neon", FPU == NeonFPU && !SoftFloat &&
3627 StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
3628 .Default(false);
3629 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003630 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00003631 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00003632 return llvm::StringSwitch<const char*>(Name)
3633 .Cases("arm8", "arm810", "4")
3634 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3635 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3636 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3637 .Case("ep9312", "4T")
3638 .Cases("arm10tdmi", "arm1020t", "5T")
3639 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3640 .Case("arm926ej-s", "5TEJ")
3641 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3642 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003643 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003644 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003645 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003646 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonfc553452013-03-04 22:37:46 +00003647 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
3648 .Cases("cortex-a9", "cortex-a15", "7A")
Quentin Colombetab137512012-12-21 17:57:47 +00003649 .Case("cortex-r5", "7R")
Bob Wilson336bfa32012-09-29 23:52:50 +00003650 .Case("cortex-a9-mp", "7F")
3651 .Case("swift", "7S")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003652 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00003653 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003654 .Default(0);
3655 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003656 static const char *getCPUProfile(StringRef Name) {
3657 return llvm::StringSwitch<const char*>(Name)
3658 .Cases("cortex-a8", "cortex-a9", "A")
3659 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Quentin Colombetab137512012-12-21 17:57:47 +00003660 .Case("cortex-r5", "R")
Anton Korobeynikov8b0703d2012-09-08 08:22:13 +00003661 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003662 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003663 virtual bool setCPU(const std::string &Name) {
3664 if (!getCPUDefineSuffix(Name))
3665 return false;
3666
3667 CPU = Name;
3668 return true;
3669 }
Chris Lattner33328642009-03-20 15:52:06 +00003670 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003671 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00003672 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00003673 Builder.defineMacro("__arm");
3674 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003675
Chris Lattnerc0f59212009-03-02 22:27:17 +00003676 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00003677 Builder.defineMacro("__ARMEL__");
3678 Builder.defineMacro("__LITTLE_ENDIAN__");
3679 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003680
Chris Lattner5f9e2722011-07-23 10:55:15 +00003681 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00003682 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003683 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3684 StringRef CPUProfile = getCPUProfile(CPU);
3685 if (!CPUProfile.empty())
3686 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3687
Mike Stump437bb4b2009-04-08 02:07:04 +00003688 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003689
Daniel Dunbareac7c532009-12-18 18:42:37 +00003690 // FIXME: It's more complicated than this and we don't really support
3691 // interworking.
3692 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00003693 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003694
David Tweedb16abb12012-10-25 13:33:01 +00003695 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Daniel Dunbar849289e2012-10-22 18:51:13 +00003696 // M-class CPUs on Darwin follow AAPCS, but not EABI.
Daniel Dunbar4d3ee9b2012-10-22 18:56:43 +00003697 if (!(getTriple().isOSDarwin() && CPUProfile == "M"))
Daniel Dunbar849289e2012-10-22 18:51:13 +00003698 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003699 Builder.defineMacro("__ARM_PCS", "1");
3700
David Tweedb16abb12012-10-25 13:33:01 +00003701 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003702 Builder.defineMacro("__ARM_PCS_VFP", "1");
3703 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003704
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003705 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00003706 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003707
3708 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00003709 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003710
Bob Wilson84f95cf2011-05-13 18:56:03 +00003711 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003712 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003713 Builder.defineMacro("__THUMBEL__");
3714 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00003715 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003716 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003717 }
3718
3719 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00003720 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00003721
Bob Wilsoncfaab002012-09-29 23:52:52 +00003722 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003723 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00003724 if (FPU & VFP2FPU)
3725 Builder.defineMacro("__ARM_VFPV2__");
3726 if (FPU & VFP3FPU)
3727 Builder.defineMacro("__ARM_VFPV3__");
3728 if (FPU & VFP4FPU)
3729 Builder.defineMacro("__ARM_VFPV4__");
3730 }
3731
Daniel Dunbara91320b2009-12-21 23:28:17 +00003732 // This only gets set when Neon instructions are actually available, unlike
3733 // the VFP define, hence the soft float and arch check. This is subtly
3734 // different from gcc, we follow the intent which was that it should be set
3735 // when Neon instructions are actually available.
Bob Wilsoncfaab002012-09-29 23:52:52 +00003736 if ((FPU & NeonFPU) && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003737 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00003738 }
3739 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3740 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00003741 Records = BuiltinInfo;
3742 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00003743 }
Bob Wilson8b30a932012-01-26 22:14:27 +00003744 virtual bool isCLZForZeroUndef() const { return false; }
Meador Ingec5613b22012-06-16 03:34:49 +00003745 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chieneae5a8202012-10-10 06:56:20 +00003746 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner393ff042008-04-21 18:56:49 +00003747 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003748 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003749 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003750 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003751 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003752 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00003753 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003754 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00003755 default: break;
Nate Begemanad487f42008-04-22 05:03:19 +00003756 case 'l': // r0-r7
3757 case 'h': // r8-r15
3758 case 'w': // VFP Floating point register single precision
3759 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00003760 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00003761 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00003762 case 'Q': // A memory address that is a single base register.
3763 Info.setAllowsMemory();
3764 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00003765 case 'U': // a memory reference...
3766 switch (Name[1]) {
3767 case 'q': // ...ARMV4 ldrsb
3768 case 'v': // ...VFP load/store (reg+constant offset)
3769 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00003770 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00003771 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00003772 case 'n': // valid address for Neon doubleword vector load/store
3773 case 'm': // valid address for Neon element and structure load/store
3774 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00003775 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00003776 Info.setAllowsMemory();
3777 Name++;
3778 return true;
3779 }
Nate Begemanad487f42008-04-22 05:03:19 +00003780 }
Chris Lattner393ff042008-04-21 18:56:49 +00003781 return false;
3782 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00003783 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00003784 std::string R;
3785 switch (*Constraint) {
3786 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00003787 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00003788 Constraint++;
3789 break;
Eric Christopher283f4472011-06-17 00:40:18 +00003790 case 'p': // 'p' should be translated to 'r' by default.
3791 R = std::string("r");
3792 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00003793 default:
3794 return std::string(1, *Constraint);
3795 }
3796 return R;
3797 }
Bill Wendling50d46ca2012-10-25 23:28:48 +00003798 virtual bool validateConstraintModifier(StringRef Constraint,
3799 const char Modifier,
3800 unsigned Size) const {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00003801 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00003802 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00003803
Bill Wendling50d46ca2012-10-25 23:28:48 +00003804 // Strip off constraint modifiers.
3805 while (Constraint[0] == '=' ||
3806 Constraint[0] == '+' ||
3807 Constraint[0] == '&')
3808 Constraint = Constraint.substr(1);
3809
3810 switch (Constraint[0]) {
3811 default: break;
3812 case 'r': {
3813 switch (Modifier) {
3814 default:
Bill Wendling6e6330c2012-11-30 23:46:56 +00003815 return isInOut || (isOutput && Size >= 32) ||
3816 (!isOutput && !isInOut && Size <= 32);
Bill Wendling50d46ca2012-10-25 23:28:48 +00003817 case 'q':
3818 // A register of size 32 cannot fit a vector type.
3819 return false;
3820 }
3821 }
3822 }
3823
3824 return true;
3825 }
Chris Lattner393ff042008-04-21 18:56:49 +00003826 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00003827 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00003828 return "";
3829 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003830
3831 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3832 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
3833 }
Logan Chiena8f7a972013-02-23 04:24:36 +00003834
3835 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
3836 if (RegNo == 0) return 0;
3837 if (RegNo == 1) return 1;
3838 return -1;
3839 }
Chris Lattner393ff042008-04-21 18:56:49 +00003840};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003841
3842const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003843 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003844 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003845 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
3846
3847 // Float registers
3848 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3849 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3850 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003851 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003852
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003853 // Double registers
3854 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3855 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00003856 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3857 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003858
3859 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00003860 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3861 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003862};
3863
3864void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003865 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003866 Names = GCCRegNames;
3867 NumNames = llvm::array_lengthof(GCCRegNames);
3868}
3869
3870const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003871 { { "a1" }, "r0" },
3872 { { "a2" }, "r1" },
3873 { { "a3" }, "r2" },
3874 { { "a4" }, "r3" },
3875 { { "v1" }, "r4" },
3876 { { "v2" }, "r5" },
3877 { { "v3" }, "r6" },
3878 { { "v4" }, "r7" },
3879 { { "v5" }, "r8" },
3880 { { "v6", "rfp" }, "r9" },
3881 { { "sl" }, "r10" },
3882 { { "fp" }, "r11" },
3883 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003884 { { "r13" }, "sp" },
3885 { { "r14" }, "lr" },
3886 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003887 // The S, D and Q registers overlap, but aren't really aliases; we
3888 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003889};
3890
3891void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3892 unsigned &NumAliases) const {
3893 Aliases = GCCRegAliases;
3894 NumAliases = llvm::array_lengthof(GCCRegAliases);
3895}
Chris Lattner2752c012010-03-03 19:03:45 +00003896
3897const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00003898#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00003899#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00003900 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00003901#include "clang/Basic/BuiltinsARM.def"
3902};
Chris Lattner393ff042008-04-21 18:56:49 +00003903} // end anonymous namespace.
3904
Eli Friedmana9f54962008-08-20 07:44:10 +00003905namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00003906class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003907 public DarwinTargetInfo<ARMTargetInfo> {
3908protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00003909 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00003910 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00003911 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00003912 }
Eli Friedmana9f54962008-08-20 07:44:10 +00003913
Torok Edwin5f6c1942009-06-30 17:10:35 +00003914public:
Mike Stump1eb44332009-09-09 15:08:12 +00003915 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00003916 : DarwinTargetInfo<ARMTargetInfo>(triple) {
3917 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00003918 // iOS always has 64-bit atomic instructions.
3919 // FIXME: This should be based off of the target features in ARMTargetInfo.
3920 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00003921
3922 // Darwin on iOS uses a variant of the ARM C++ ABI.
3923 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar350b9f32010-05-27 07:00:26 +00003924 }
Eli Friedmana9f54962008-08-20 07:44:10 +00003925};
3926} // end anonymous namespace.
3927
Tony Linthicum96319392011-12-12 21:14:55 +00003928
3929namespace {
3930// Hexagon abstract base class
3931class HexagonTargetInfo : public TargetInfo {
3932 static const Builtin::Info BuiltinInfo[];
3933 static const char * const GCCRegNames[];
3934 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3935 std::string CPU;
3936public:
3937 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003938 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00003939 DescriptionString = ("e-p:32:32:32-"
Anshuman Dasgupta1a090f12013-01-02 21:25:57 +00003940 "i64:64:64-i32:32:32-i16:16:16-i1:32:32-"
Sirish Pande5f9688b2012-05-10 20:19:54 +00003941 "f64:64:64-f32:32:32-a0:0-n32");
Tony Linthicum96319392011-12-12 21:14:55 +00003942
3943 // {} in inline assembly are packet specifiers, not assembly variant
3944 // specifiers.
3945 NoAsmVariants = true;
3946 }
3947
3948 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3949 unsigned &NumRecords) const {
3950 Records = BuiltinInfo;
3951 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3952 }
3953
3954 virtual bool validateAsmConstraint(const char *&Name,
3955 TargetInfo::ConstraintInfo &Info) const {
3956 return true;
3957 }
3958
3959 virtual void getTargetDefines(const LangOptions &Opts,
3960 MacroBuilder &Builder) const;
3961
Douglas Gregore727d212012-01-30 06:38:25 +00003962 virtual bool hasFeature(StringRef Feature) const {
3963 return Feature == "hexagon";
3964 }
3965
Meador Ingec5613b22012-06-16 03:34:49 +00003966 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3967 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00003968 }
3969 virtual void getGCCRegNames(const char * const *&Names,
3970 unsigned &NumNames) const;
3971 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3972 unsigned &NumAliases) const;
3973 virtual const char *getClobbers() const {
3974 return "";
3975 }
Sebastian Pop43115d42012-01-13 20:37:10 +00003976
3977 static const char *getHexagonCPUSuffix(StringRef Name) {
3978 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop43115d42012-01-13 20:37:10 +00003979 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00003980 .Case("hexagonv5", "5")
Sebastian Pop43115d42012-01-13 20:37:10 +00003981 .Default(0);
3982 }
3983
Tony Linthicum96319392011-12-12 21:14:55 +00003984 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00003985 if (!getHexagonCPUSuffix(Name))
3986 return false;
3987
Tony Linthicum96319392011-12-12 21:14:55 +00003988 CPU = Name;
3989 return true;
3990 }
3991};
3992
3993void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
3994 MacroBuilder &Builder) const {
3995 Builder.defineMacro("qdsp6");
3996 Builder.defineMacro("__qdsp6", "1");
3997 Builder.defineMacro("__qdsp6__", "1");
3998
3999 Builder.defineMacro("hexagon");
4000 Builder.defineMacro("__hexagon", "1");
4001 Builder.defineMacro("__hexagon__", "1");
4002
4003 if(CPU == "hexagonv1") {
4004 Builder.defineMacro("__HEXAGON_V1__");
4005 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4006 if(Opts.HexagonQdsp6Compat) {
4007 Builder.defineMacro("__QDSP6_V1__");
4008 Builder.defineMacro("__QDSP6_ARCH__", "1");
4009 }
4010 }
4011 else if(CPU == "hexagonv2") {
4012 Builder.defineMacro("__HEXAGON_V2__");
4013 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4014 if(Opts.HexagonQdsp6Compat) {
4015 Builder.defineMacro("__QDSP6_V2__");
4016 Builder.defineMacro("__QDSP6_ARCH__", "2");
4017 }
4018 }
4019 else if(CPU == "hexagonv3") {
4020 Builder.defineMacro("__HEXAGON_V3__");
4021 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4022 if(Opts.HexagonQdsp6Compat) {
4023 Builder.defineMacro("__QDSP6_V3__");
4024 Builder.defineMacro("__QDSP6_ARCH__", "3");
4025 }
4026 }
4027 else if(CPU == "hexagonv4") {
4028 Builder.defineMacro("__HEXAGON_V4__");
4029 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4030 if(Opts.HexagonQdsp6Compat) {
4031 Builder.defineMacro("__QDSP6_V4__");
4032 Builder.defineMacro("__QDSP6_ARCH__", "4");
4033 }
4034 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00004035 else if(CPU == "hexagonv5") {
4036 Builder.defineMacro("__HEXAGON_V5__");
4037 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4038 if(Opts.HexagonQdsp6Compat) {
4039 Builder.defineMacro("__QDSP6_V5__");
4040 Builder.defineMacro("__QDSP6_ARCH__", "5");
4041 }
4042 }
Tony Linthicum96319392011-12-12 21:14:55 +00004043}
4044
4045const char * const HexagonTargetInfo::GCCRegNames[] = {
4046 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4047 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4048 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4049 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4050 "p0", "p1", "p2", "p3",
4051 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4052};
4053
4054void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4055 unsigned &NumNames) const {
4056 Names = GCCRegNames;
4057 NumNames = llvm::array_lengthof(GCCRegNames);
4058}
4059
4060
4061const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4062 { { "sp" }, "r29" },
4063 { { "fp" }, "r30" },
4064 { { "lr" }, "r31" },
4065 };
4066
4067void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4068 unsigned &NumAliases) const {
4069 Aliases = GCCRegAliases;
4070 NumAliases = llvm::array_lengthof(GCCRegAliases);
4071}
4072
4073
4074const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4075#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4076#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4077 ALL_LANGUAGES },
4078#include "clang/Basic/BuiltinsHexagon.def"
4079};
4080}
4081
4082
Reid Spencer5f016e22007-07-11 17:01:13 +00004083namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00004084class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00004085 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4086 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004087 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00004088public:
Eli Friedman01b86682008-08-20 07:28:14 +00004089 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
4090 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00004091 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 +00004092 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00004093 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004094 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00004095 StringRef Name,
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004096 bool Enabled) const {
4097 if (Name == "soft-float")
4098 Features[Name] = Enabled;
4099 else
4100 return false;
4101
4102 return true;
4103 }
4104 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
4105 SoftFloat = false;
4106 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4107 if (Features[i] == "+soft-float")
4108 SoftFloat = true;
4109 }
Chris Lattner33328642009-03-20 15:52:06 +00004110 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004111 MacroBuilder &Builder) const {
4112 DefineStd(Builder, "sparc", Opts);
4113 Builder.defineMacro("__sparcv8");
4114 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004115
4116 if (SoftFloat)
4117 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00004118 }
Douglas Gregore727d212012-01-30 06:38:25 +00004119
4120 virtual bool hasFeature(StringRef Feature) const {
4121 return llvm::StringSwitch<bool>(Feature)
4122 .Case("softfloat", SoftFloat)
4123 .Case("sparc", true)
4124 .Default(false);
4125 }
4126
Gabor Greif26658672008-02-21 16:29:08 +00004127 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4128 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004129 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00004130 }
Meador Ingec5613b22012-06-16 03:34:49 +00004131 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4132 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif26658672008-02-21 16:29:08 +00004133 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004134 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00004135 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004136 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00004137 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00004138 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00004139 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004140 // FIXME: Implement!
4141 return false;
Gabor Greif26658672008-02-21 16:29:08 +00004142 }
4143 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00004144 // FIXME: Implement!
4145 return "";
Gabor Greif26658672008-02-21 16:29:08 +00004146 }
4147};
4148
Chris Lattnere957f532009-01-27 01:58:38 +00004149const char * const SparcV8TargetInfo::GCCRegNames[] = {
4150 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4151 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4152 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4153 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4154};
4155
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004156void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00004157 unsigned &NumNames) const {
4158 Names = GCCRegNames;
4159 NumNames = llvm::array_lengthof(GCCRegNames);
4160}
4161
4162const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004163 { { "g0" }, "r0" },
4164 { { "g1" }, "r1" },
4165 { { "g2" }, "r2" },
4166 { { "g3" }, "r3" },
4167 { { "g4" }, "r4" },
4168 { { "g5" }, "r5" },
4169 { { "g6" }, "r6" },
4170 { { "g7" }, "r7" },
4171 { { "o0" }, "r8" },
4172 { { "o1" }, "r9" },
4173 { { "o2" }, "r10" },
4174 { { "o3" }, "r11" },
4175 { { "o4" }, "r12" },
4176 { { "o5" }, "r13" },
4177 { { "o6", "sp" }, "r14" },
4178 { { "o7" }, "r15" },
4179 { { "l0" }, "r16" },
4180 { { "l1" }, "r17" },
4181 { { "l2" }, "r18" },
4182 { { "l3" }, "r19" },
4183 { { "l4" }, "r20" },
4184 { { "l5" }, "r21" },
4185 { { "l6" }, "r22" },
4186 { { "l7" }, "r23" },
4187 { { "i0" }, "r24" },
4188 { { "i1" }, "r25" },
4189 { { "i2" }, "r26" },
4190 { { "i3" }, "r27" },
4191 { { "i4" }, "r28" },
4192 { { "i5" }, "r29" },
4193 { { "i6", "fp" }, "r30" },
4194 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00004195};
4196
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004197void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00004198 unsigned &NumAliases) const {
4199 Aliases = GCCRegAliases;
4200 NumAliases = llvm::array_lengthof(GCCRegAliases);
4201}
Gabor Greif26658672008-02-21 16:29:08 +00004202} // end anonymous namespace.
4203
Eli Friedman01b86682008-08-20 07:28:14 +00004204namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004205class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4206public:
4207 AuroraUXSparcV8TargetInfo(const std::string& triple) :
4208 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
4209 SizeType = UnsignedInt;
4210 PtrDiffType = SignedInt;
4211 }
4212};
Torok Edwin5f6c1942009-06-30 17:10:35 +00004213class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00004214public:
4215 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00004216 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00004217 SizeType = UnsignedInt;
4218 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00004219 }
4220};
4221} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00004222
Chris Lattner2621fd12008-05-08 05:58:21 +00004223namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004224 class MSP430TargetInfo : public TargetInfo {
4225 static const char * const GCCRegNames[];
4226 public:
4227 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004228 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004229 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00004230 IntWidth = 16; IntAlign = 16;
4231 LongWidth = 32; LongLongWidth = 64;
4232 LongAlign = LongLongAlign = 16;
4233 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004234 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004235 SizeType = UnsignedInt;
4236 IntMaxType = SignedLong;
4237 UIntMaxType = UnsignedLong;
4238 IntPtrType = SignedShort;
4239 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00004240 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00004241 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004242 }
4243 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004244 MacroBuilder &Builder) const {
4245 Builder.defineMacro("MSP430");
4246 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004247 // FIXME: defines for different 'flavours' of MCU
4248 }
4249 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4250 unsigned &NumRecords) const {
4251 // FIXME: Implement.
4252 Records = 0;
4253 NumRecords = 0;
4254 }
Douglas Gregore727d212012-01-30 06:38:25 +00004255 virtual bool hasFeature(StringRef Feature) const {
4256 return Feature == "msp430";
4257 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004258 virtual void getGCCRegNames(const char * const *&Names,
4259 unsigned &NumNames) const;
4260 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4261 unsigned &NumAliases) const {
4262 // No aliases.
4263 Aliases = 0;
4264 NumAliases = 0;
4265 }
4266 virtual bool validateAsmConstraint(const char *&Name,
4267 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00004268 // No target constraints for now.
4269 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004270 }
4271 virtual const char *getClobbers() const {
4272 // FIXME: Is this really right?
4273 return "";
4274 }
Meador Ingec5613b22012-06-16 03:34:49 +00004275 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004276 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00004277 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004278 }
4279 };
4280
4281 const char * const MSP430TargetInfo::GCCRegNames[] = {
4282 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4283 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4284 };
4285
4286 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4287 unsigned &NumNames) const {
4288 Names = GCCRegNames;
4289 NumNames = llvm::array_lengthof(GCCRegNames);
4290 }
4291}
4292
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00004293namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00004294
Mike Stump1eb44332009-09-09 15:08:12 +00004295 // LLVM and Clang cannot be used directly to output native binaries for
4296 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00004297 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00004298 //
4299 // TCE uses the llvm bitcode as input and uses it for generating customized
4300 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00004301 // publicly available in http://tce.cs.tut.fi
4302
Eli Friedman209f5bb2011-10-07 19:51:42 +00004303 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4304 3, // opencl_global
4305 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00004306 5, // opencl_constant
4307 0, // cuda_device
4308 0, // cuda_constant
4309 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00004310 };
4311
Eli Friedmanb63decf2009-08-19 20:47:07 +00004312 class TCETargetInfo : public TargetInfo{
4313 public:
4314 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
4315 TLSSupported = false;
4316 IntWidth = 32;
4317 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004318 PointerWidth = 32;
4319 IntAlign = 32;
4320 LongAlign = LongLongAlign = 32;
4321 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004322 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004323 SizeType = UnsignedInt;
4324 IntMaxType = SignedLong;
4325 UIntMaxType = UnsignedLong;
4326 IntPtrType = SignedInt;
4327 PtrDiffType = SignedInt;
4328 FloatWidth = 32;
4329 FloatAlign = 32;
4330 DoubleWidth = 32;
4331 DoubleAlign = 32;
4332 LongDoubleWidth = 32;
4333 LongDoubleAlign = 32;
4334 FloatFormat = &llvm::APFloat::IEEEsingle;
4335 DoubleFormat = &llvm::APFloat::IEEEsingle;
4336 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00004337 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
4338 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00004339 "f32:32:32-f64:32:32-v64:32:32-"
4340 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00004341 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004342 }
4343
4344 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004345 MacroBuilder &Builder) const {
4346 DefineStd(Builder, "tce", Opts);
4347 Builder.defineMacro("__TCE__");
4348 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00004349 }
Douglas Gregore727d212012-01-30 06:38:25 +00004350 virtual bool hasFeature(StringRef Feature) const {
4351 return Feature == "tce";
4352 }
4353
Eli Friedmanb63decf2009-08-19 20:47:07 +00004354 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4355 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00004356 virtual const char *getClobbers() const {
4357 return "";
4358 }
Meador Ingec5613b22012-06-16 03:34:49 +00004359 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4360 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004361 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00004362 virtual void getGCCRegNames(const char * const *&Names,
4363 unsigned &NumNames) const {}
4364 virtual bool validateAsmConstraint(const char *&Name,
4365 TargetInfo::ConstraintInfo &info) const {
4366 return true;
4367 }
4368 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4369 unsigned &NumAliases) const {}
4370 };
4371}
4372
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004373namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004374class MipsTargetInfoBase : public TargetInfo {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004375 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004376 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004377 bool IsMips16;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004378 enum MipsFloatABI {
4379 HardFloat, SingleFloat, SoftFloat
4380 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004381 enum DspRevEnum {
4382 NoDSP, DSP1, DSP2
4383 } DspRev;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004384
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004385protected:
4386 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004387
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004388public:
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004389 MipsTargetInfoBase(const std::string& triple,
4390 const std::string& ABIStr,
4391 const std::string& CPUStr)
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004392 : TargetInfo(triple),
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004393 CPU(CPUStr),
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004394 IsMips16(false),
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004395 FloatABI(HardFloat),
Simon Atanasyana1b62272012-07-05 20:16:22 +00004396 DspRev(NoDSP),
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004397 ABI(ABIStr)
4398 {}
4399
Eric Christophered734732010-03-02 02:41:08 +00004400 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004401 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00004402 virtual bool setCPU(const std::string &Name) {
4403 CPU = Name;
4404 return true;
4405 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004406 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00004407 Features[ABI] = true;
4408 Features[CPU] = true;
4409 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004410
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004411 virtual void getTargetDefines(const LangOptions &Opts,
4412 MacroBuilder &Builder) const {
Simon Atanasyand4935a02012-08-29 19:14:58 +00004413 DefineStd(Builder, "mips", Opts);
4414 Builder.defineMacro("_mips");
4415 Builder.defineMacro("__REGISTER_PREFIX__", "");
4416
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004417 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004418 case HardFloat:
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004419 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004420 break;
4421 case SingleFloat:
4422 Builder.defineMacro("__mips_hard_float", Twine(1));
4423 Builder.defineMacro("__mips_single_float", Twine(1));
4424 break;
4425 case SoftFloat:
4426 Builder.defineMacro("__mips_soft_float", Twine(1));
4427 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004428 }
Simon Atanasyan90913892012-04-05 19:28:31 +00004429
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004430 if (IsMips16)
4431 Builder.defineMacro("__mips16", Twine(1));
4432
Simon Atanasyana1b62272012-07-05 20:16:22 +00004433 switch (DspRev) {
4434 default:
4435 break;
4436 case DSP1:
4437 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4438 Builder.defineMacro("__mips_dsp", Twine(1));
4439 break;
4440 case DSP2:
4441 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4442 Builder.defineMacro("__mips_dspr2", Twine(1));
4443 Builder.defineMacro("__mips_dsp", Twine(1));
4444 break;
4445 }
4446
Simon Atanasyan90913892012-04-05 19:28:31 +00004447 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4448 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4449 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00004450
4451 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4452 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004453 }
4454
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004455 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4456 unsigned &NumRecords) const {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004457 Records = BuiltinInfo;
4458 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004459 }
Douglas Gregore727d212012-01-30 06:38:25 +00004460 virtual bool hasFeature(StringRef Feature) const {
4461 return Feature == "mips";
4462 }
Meador Ingec5613b22012-06-16 03:34:49 +00004463 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4464 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004465 }
4466 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004467 unsigned &NumNames) const {
4468 static const char * const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00004469 // CPU register names
4470 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004471 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4472 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4473 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004474 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4475 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004476 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4477 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4478 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4479 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004480 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004481 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
4482 "$fcc5","$fcc6","$fcc7"
4483 };
4484 Names = GCCRegNames;
4485 NumNames = llvm::array_lengthof(GCCRegNames);
4486 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004487 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004488 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004489 virtual bool validateAsmConstraint(const char *&Name,
4490 TargetInfo::ConstraintInfo &Info) const {
4491 switch (*Name) {
4492 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00004493 return false;
4494
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004495 case 'r': // CPU registers.
4496 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4497 case 'y': // Equivalent to "r", backwards compatibility only.
4498 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00004499 case 'c': // $25 for indirect jumps
4500 case 'l': // lo register
4501 case 'x': // hilo register pair
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004502 Info.setAllowsRegister();
4503 return true;
Jack Carter97102302013-03-05 19:10:54 +00004504 case 'R': // An address that can be used in a non-macro load or store
Jack Carterd2ab6d32013-03-04 21:36:11 +00004505 Info.setAllowsMemory();
4506 return true;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004507 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004508 }
4509
4510 virtual const char *getClobbers() const {
4511 // FIXME: Implement!
4512 return "";
4513 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004514
4515 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
4516 StringRef Name,
4517 bool Enabled) const {
Simon Atanasyan8b2a5d22012-04-18 12:00:11 +00004518 if (Name == "soft-float" || Name == "single-float" ||
4519 Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
4520 Name == "mips32" || Name == "mips32r2" ||
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00004521 Name == "mips64" || Name == "mips64r2" ||
Simon Atanasyand797a852012-07-05 19:23:00 +00004522 Name == "mips16" || Name == "dsp" || Name == "dspr2") {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004523 Features[Name] = Enabled;
4524 return true;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004525 } else if (Name == "32") {
4526 Features["o32"] = Enabled;
4527 return true;
4528 } else if (Name == "64") {
4529 Features["n64"] = Enabled;
4530 return true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004531 }
4532 return false;
4533 }
4534
4535 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004536 IsMips16 = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004537 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004538 DspRev = NoDSP;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004539
4540 for (std::vector<std::string>::iterator it = Features.begin(),
4541 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004542 if (*it == "+single-float")
4543 FloatABI = SingleFloat;
4544 else if (*it == "+soft-float")
4545 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004546 else if (*it == "+mips16")
4547 IsMips16 = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004548 else if (*it == "+dsp")
4549 DspRev = std::max(DspRev, DSP1);
4550 else if (*it == "+dspr2")
4551 DspRev = std::max(DspRev, DSP2);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004552 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004553
4554 // Remove front-end specific option.
4555 std::vector<std::string>::iterator it =
4556 std::find(Features.begin(), Features.end(), "+soft-float");
4557 if (it != Features.end())
4558 Features.erase(it);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004559 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004560
4561 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4562 if (RegNo == 0) return 4;
4563 if (RegNo == 1) return 5;
4564 return -1;
4565 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004566};
4567
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004568const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
4569#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4570#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4571 ALL_LANGUAGES },
4572#include "clang/Basic/BuiltinsMips.def"
4573};
4574
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004575class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004576public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004577 Mips32TargetInfoBase(const std::string& triple) :
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004578 MipsTargetInfoBase(triple, "o32", "mips32") {
Akira Hatanaka148735e2011-11-05 01:48:34 +00004579 SizeType = UnsignedInt;
4580 PtrDiffType = SignedInt;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004581 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka148735e2011-11-05 01:48:34 +00004582 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004583 virtual bool setABI(const std::string &Name) {
4584 if ((Name == "o32") || (Name == "eabi")) {
4585 ABI = Name;
4586 return true;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004587 } else if (Name == "32") {
4588 ABI = "o32";
4589 return true;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004590 } else
4591 return false;
4592 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004593 virtual void getTargetDefines(const LangOptions &Opts,
4594 MacroBuilder &Builder) const {
4595 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004596
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004597 if (ABI == "o32") {
4598 Builder.defineMacro("__mips_o32");
4599 Builder.defineMacro("_ABIO32", "1");
4600 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
4601 }
4602 else if (ABI == "eabi")
4603 Builder.defineMacro("__mips_eabi");
4604 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004605 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004606 }
4607 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4608 unsigned &NumAliases) const {
4609 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4610 { { "at" }, "$1" },
4611 { { "v0" }, "$2" },
4612 { { "v1" }, "$3" },
4613 { { "a0" }, "$4" },
4614 { { "a1" }, "$5" },
4615 { { "a2" }, "$6" },
4616 { { "a3" }, "$7" },
4617 { { "t0" }, "$8" },
4618 { { "t1" }, "$9" },
4619 { { "t2" }, "$10" },
4620 { { "t3" }, "$11" },
4621 { { "t4" }, "$12" },
4622 { { "t5" }, "$13" },
4623 { { "t6" }, "$14" },
4624 { { "t7" }, "$15" },
4625 { { "s0" }, "$16" },
4626 { { "s1" }, "$17" },
4627 { { "s2" }, "$18" },
4628 { { "s3" }, "$19" },
4629 { { "s4" }, "$20" },
4630 { { "s5" }, "$21" },
4631 { { "s6" }, "$22" },
4632 { { "s7" }, "$23" },
4633 { { "t8" }, "$24" },
4634 { { "t9" }, "$25" },
4635 { { "k0" }, "$26" },
4636 { { "k1" }, "$27" },
4637 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00004638 { { "sp","$sp" }, "$29" },
4639 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004640 { { "ra" }, "$31" }
4641 };
4642 Aliases = GCCRegAliases;
4643 NumAliases = llvm::array_lengthof(GCCRegAliases);
4644 }
4645};
4646
4647class Mips32EBTargetInfo : public Mips32TargetInfoBase {
4648public:
4649 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
4650 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 +00004651 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004652 }
4653 virtual void getTargetDefines(const LangOptions &Opts,
4654 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004655 DefineStd(Builder, "MIPSEB", Opts);
4656 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004657 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004658 }
4659};
4660
4661class Mips32ELTargetInfo : public Mips32TargetInfoBase {
4662public:
4663 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004664 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004665 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 +00004666 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004667 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004668 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004669 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004670 DefineStd(Builder, "MIPSEL", Opts);
4671 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004672 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004673 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004674};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004675
4676class Mips64TargetInfoBase : public MipsTargetInfoBase {
4677 virtual void SetDescriptionString(const std::string &Name) = 0;
4678public:
4679 Mips64TargetInfoBase(const std::string& triple) :
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004680 MipsTargetInfoBase(triple, "n64", "mips64") {
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004681 LongWidth = LongAlign = 64;
4682 PointerWidth = PointerAlign = 64;
4683 LongDoubleWidth = LongDoubleAlign = 128;
4684 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00004685 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
4686 LongDoubleWidth = LongDoubleAlign = 64;
4687 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4688 }
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004689 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004690 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004691 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004692 virtual bool setABI(const std::string &Name) {
4693 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004694 if (Name == "n32") {
4695 LongWidth = LongAlign = 32;
4696 PointerWidth = PointerAlign = 32;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004697 ABI = Name;
4698 return true;
4699 } else if (Name == "n64") {
4700 ABI = Name;
4701 return true;
4702 } else if (Name == "64") {
4703 ABI = "n64";
4704 return true;
4705 } else
4706 return false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004707 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004708 virtual void getTargetDefines(const LangOptions &Opts,
4709 MacroBuilder &Builder) const {
4710 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004711
Simon Atanasyan600a5132012-08-29 20:50:11 +00004712 Builder.defineMacro("__mips64");
4713 Builder.defineMacro("__mips64__");
4714
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004715 if (ABI == "n32") {
4716 Builder.defineMacro("__mips_n32");
4717 Builder.defineMacro("_ABIN32", "2");
4718 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
4719 }
4720 else if (ABI == "n64") {
4721 Builder.defineMacro("__mips_n64");
4722 Builder.defineMacro("_ABI64", "3");
4723 Builder.defineMacro("_MIPS_SIM", "_ABI64");
4724 }
4725 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004726 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004727 }
4728 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4729 unsigned &NumAliases) const {
4730 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4731 { { "at" }, "$1" },
4732 { { "v0" }, "$2" },
4733 { { "v1" }, "$3" },
4734 { { "a0" }, "$4" },
4735 { { "a1" }, "$5" },
4736 { { "a2" }, "$6" },
4737 { { "a3" }, "$7" },
4738 { { "a4" }, "$8" },
4739 { { "a5" }, "$9" },
4740 { { "a6" }, "$10" },
4741 { { "a7" }, "$11" },
4742 { { "t0" }, "$12" },
4743 { { "t1" }, "$13" },
4744 { { "t2" }, "$14" },
4745 { { "t3" }, "$15" },
4746 { { "s0" }, "$16" },
4747 { { "s1" }, "$17" },
4748 { { "s2" }, "$18" },
4749 { { "s3" }, "$19" },
4750 { { "s4" }, "$20" },
4751 { { "s5" }, "$21" },
4752 { { "s6" }, "$22" },
4753 { { "s7" }, "$23" },
4754 { { "t8" }, "$24" },
4755 { { "t9" }, "$25" },
4756 { { "k0" }, "$26" },
4757 { { "k1" }, "$27" },
4758 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00004759 { { "sp","$sp" }, "$29" },
4760 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004761 { { "ra" }, "$31" }
4762 };
4763 Aliases = GCCRegAliases;
4764 NumAliases = llvm::array_lengthof(GCCRegAliases);
4765 }
4766};
4767
4768class Mips64EBTargetInfo : public Mips64TargetInfoBase {
4769 virtual void SetDescriptionString(const std::string &Name) {
4770 // Change DescriptionString only if ABI is n32.
4771 if (Name == "n32")
4772 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 +00004773 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004774 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004775 }
4776public:
4777 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
4778 // Default ABI is n64.
4779 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 +00004780 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004781 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004782 }
4783 virtual void getTargetDefines(const LangOptions &Opts,
4784 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004785 DefineStd(Builder, "MIPSEB", Opts);
4786 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004787 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004788 }
4789};
4790
4791class Mips64ELTargetInfo : public Mips64TargetInfoBase {
4792 virtual void SetDescriptionString(const std::string &Name) {
4793 // Change DescriptionString only if ABI is n32.
4794 if (Name == "n32")
4795 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 +00004796 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004797 "-v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004798 }
4799public:
4800 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004801 // Default ABI is n64.
4802 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004803 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 +00004804 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004805 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004806 }
4807 virtual void getTargetDefines(const LangOptions &Opts,
4808 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004809 DefineStd(Builder, "MIPSEL", Opts);
4810 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004811 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004812 }
4813};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004814} // end anonymous namespace.
4815
Ivan Krasinef05abd2011-08-24 20:22:22 +00004816namespace {
4817class PNaClTargetInfo : public TargetInfo {
4818public:
4819 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004820 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00004821 this->UserLabelPrefix = "";
4822 this->LongAlign = 32;
4823 this->LongWidth = 32;
4824 this->PointerAlign = 32;
4825 this->PointerWidth = 32;
4826 this->IntMaxType = TargetInfo::SignedLongLong;
4827 this->UIntMaxType = TargetInfo::UnsignedLongLong;
4828 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00004829 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00004830 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00004831 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00004832 this->SizeType = TargetInfo::UnsignedInt;
4833 this->PtrDiffType = TargetInfo::SignedInt;
4834 this->IntPtrType = TargetInfo::SignedInt;
David Meyerdd4a8892011-10-11 03:12:01 +00004835 this->RegParmMax = 2;
Ivan Krasinef05abd2011-08-24 20:22:22 +00004836 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
4837 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
4838 }
4839
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004840 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00004841 }
4842 virtual void getArchDefines(const LangOptions &Opts,
4843 MacroBuilder &Builder) const {
4844 Builder.defineMacro("__le32__");
4845 Builder.defineMacro("__pnacl__");
4846 }
4847 virtual void getTargetDefines(const LangOptions &Opts,
4848 MacroBuilder &Builder) const {
Jan Wen Voungdde3bdb2012-03-29 00:05:59 +00004849 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasinef05abd2011-08-24 20:22:22 +00004850 getArchDefines(Opts, Builder);
4851 }
Douglas Gregore727d212012-01-30 06:38:25 +00004852 virtual bool hasFeature(StringRef Feature) const {
4853 return Feature == "pnacl";
4854 }
Ivan Krasinef05abd2011-08-24 20:22:22 +00004855 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4856 unsigned &NumRecords) const {
4857 }
Meador Ingec5613b22012-06-16 03:34:49 +00004858 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4859 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00004860 }
4861 virtual void getGCCRegNames(const char * const *&Names,
4862 unsigned &NumNames) const;
4863 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4864 unsigned &NumAliases) const;
4865 virtual bool validateAsmConstraint(const char *&Name,
4866 TargetInfo::ConstraintInfo &Info) const {
4867 return false;
4868 }
4869
4870 virtual const char *getClobbers() const {
4871 return "";
4872 }
4873};
4874
4875void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
4876 unsigned &NumNames) const {
4877 Names = NULL;
4878 NumNames = 0;
4879}
4880
4881void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4882 unsigned &NumAliases) const {
4883 Aliases = NULL;
4884 NumAliases = 0;
4885}
4886} // end anonymous namespace.
4887
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004888namespace {
4889 static const unsigned SPIRAddrSpaceMap[] = {
4890 1, // opencl_global
4891 3, // opencl_local
4892 2, // opencl_constant
4893 0, // cuda_device
4894 0, // cuda_constant
4895 0 // cuda_shared
4896 };
4897 class SPIRTargetInfo : public TargetInfo {
4898 static const char * const GCCRegNames[];
4899 static const Builtin::Info BuiltinInfo[];
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00004900 std::vector<StringRef> AvailableFeatures;
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004901 public:
4902 SPIRTargetInfo(const std::string& triple) : TargetInfo(triple) {
4903 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
4904 "SPIR target must use unknown OS");
4905 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
4906 "SPIR target must use unknown environment type");
4907 BigEndian = false;
4908 TLSSupported = false;
4909 LongWidth = LongAlign = 64;
4910 AddrSpaceMap = &SPIRAddrSpaceMap;
4911 // Define available target features
4912 // These must be defined in sorted order!
4913 NoAsmVariants = true;
4914 }
4915 virtual void getTargetDefines(const LangOptions &Opts,
4916 MacroBuilder &Builder) const {
4917 DefineStd(Builder, "SPIR", Opts);
4918 }
4919 virtual bool hasFeature(StringRef Feature) const {
4920 return Feature == "spir";
4921 }
4922
4923 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4924 unsigned &NumRecords) const {}
4925 virtual const char *getClobbers() const {
4926 return "";
4927 }
4928 virtual void getGCCRegNames(const char * const *&Names,
4929 unsigned &NumNames) const {}
4930 virtual bool validateAsmConstraint(const char *&Name,
4931 TargetInfo::ConstraintInfo &info) const {
4932 return true;
4933 }
4934 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4935 unsigned &NumAliases) const {}
4936 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4937 return TargetInfo::VoidPtrBuiltinVaList;
4938 }
4939 };
4940
4941
4942 class SPIR32TargetInfo : public SPIRTargetInfo {
4943 public:
4944 SPIR32TargetInfo(const std::string& triple) : SPIRTargetInfo(triple) {
4945 PointerWidth = PointerAlign = 32;
4946 SizeType = TargetInfo::UnsignedInt;
4947 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
4948 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00004949 = "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 +00004950 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
4951 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
4952 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00004953 }
4954 virtual void getTargetDefines(const LangOptions &Opts,
4955 MacroBuilder &Builder) const {
4956 DefineStd(Builder, "SPIR32", Opts);
4957 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004958 };
4959
4960 class SPIR64TargetInfo : public SPIRTargetInfo {
4961 public:
4962 SPIR64TargetInfo(const std::string& triple) : SPIRTargetInfo(triple) {
4963 PointerWidth = PointerAlign = 64;
4964 SizeType = TargetInfo::UnsignedLong;
4965 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
4966 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00004967 = "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 +00004968 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
4969 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
4970 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00004971 }
4972 virtual void getTargetDefines(const LangOptions &Opts,
4973 MacroBuilder &Builder) const {
4974 DefineStd(Builder, "SPIR64", Opts);
4975 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004976 };
4977}
4978
Ivan Krasinef05abd2011-08-24 20:22:22 +00004979
Reid Spencer5f016e22007-07-11 17:01:13 +00004980//===----------------------------------------------------------------------===//
4981// Driver code
4982//===----------------------------------------------------------------------===//
4983
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004984static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004985 llvm::Triple Triple(T);
4986 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00004987
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004988 switch (Triple.getArch()) {
4989 default:
4990 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00004991
Tony Linthicum96319392011-12-12 21:14:55 +00004992 case llvm::Triple::hexagon:
4993 return new HexagonTargetInfo(T);
4994
Tim Northoverc264e162013-01-31 12:13:10 +00004995 case llvm::Triple::aarch64:
4996 switch (os) {
4997 case llvm::Triple::Linux:
4998 return new LinuxTargetInfo<AArch64TargetInfo>(T);
4999 default:
5000 return new AArch64TargetInfo(T);
5001 }
5002
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005003 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00005004 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005005 if (Triple.isOSDarwin())
5006 return new DarwinARMTargetInfo(T);
5007
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005008 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00005009 case llvm::Triple::Linux:
5010 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005011 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00005012 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005013 case llvm::Triple::NetBSD:
5014 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005015 case llvm::Triple::OpenBSD:
5016 return new OpenBSDTargetInfo<ARMTargetInfo>(T);
Eli Friedman42f74f22012-08-08 23:57:20 +00005017 case llvm::Triple::Bitrig:
5018 return new BitrigTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00005019 case llvm::Triple::RTEMS:
5020 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005021 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00005022 return new NaClTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005023 default:
5024 return new ARMTargetInfo(T);
5025 }
Eli Friedman61538a72008-05-20 14:21:01 +00005026
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005027 case llvm::Triple::msp430:
5028 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00005029
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005030 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005031 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005032 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005033 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005034 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005035 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005036 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005037 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005038 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005039 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005040 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005041 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005042 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005043
5044 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005045 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005046 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005047 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005048 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005049 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005050 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005051 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005052 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005053 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005054 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005055 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005056 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005057
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005058 case llvm::Triple::mips64:
5059 switch (os) {
5060 case llvm::Triple::Linux:
5061 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
5062 case llvm::Triple::RTEMS:
5063 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
5064 case llvm::Triple::FreeBSD:
5065 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
5066 case llvm::Triple::NetBSD:
5067 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005068 case llvm::Triple::OpenBSD:
5069 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(T);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005070 default:
5071 return new Mips64EBTargetInfo(T);
5072 }
5073
5074 case llvm::Triple::mips64el:
5075 switch (os) {
5076 case llvm::Triple::Linux:
5077 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
5078 case llvm::Triple::RTEMS:
5079 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
5080 case llvm::Triple::FreeBSD:
5081 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
5082 case llvm::Triple::NetBSD:
5083 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005084 case llvm::Triple::OpenBSD:
5085 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(T);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005086 default:
5087 return new Mips64ELTargetInfo(T);
5088 }
5089
Ivan Krasinef05abd2011-08-24 20:22:22 +00005090 case llvm::Triple::le32:
5091 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00005092 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00005093 return new NaClTargetInfo<PNaClTargetInfo>(T);
Ivan Krasinef05abd2011-08-24 20:22:22 +00005094 default:
5095 return NULL;
5096 }
5097
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005098 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005099 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00005100 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005101 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005102 case llvm::Triple::Linux:
5103 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005104 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00005105 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005106 case llvm::Triple::NetBSD:
5107 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005108 case llvm::Triple::OpenBSD:
5109 return new OpenBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005110 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00005111 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005112 default:
5113 return new PPC32TargetInfo(T);
5114 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005115
5116 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005117 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00005118 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005119 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005120 case llvm::Triple::Linux:
5121 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005122 case llvm::Triple::Lv2:
John Thompson3f6918a2009-11-19 17:18:50 +00005123 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005124 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00005125 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005126 case llvm::Triple::NetBSD:
5127 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
5128 default:
5129 return new PPC64TargetInfo(T);
5130 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005131
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005132 case llvm::Triple::nvptx:
5133 return new NVPTX32TargetInfo(T);
5134 case llvm::Triple::nvptx64:
5135 return new NVPTX64TargetInfo(T);
5136
Chris Lattner9cbeb632010-03-06 21:21:27 +00005137 case llvm::Triple::mblaze:
5138 return new MBlazeTargetInfo(T);
5139
Eli Friedman6505a292012-10-12 23:32:00 +00005140 case llvm::Triple::r600:
5141 return new R600TargetInfo(T);
5142
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005143 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005144 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005145 case llvm::Triple::Linux:
5146 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005147 case llvm::Triple::AuroraUX:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005148 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005149 case llvm::Triple::Solaris:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005150 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005151 case llvm::Triple::NetBSD:
5152 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005153 case llvm::Triple::OpenBSD:
5154 return new OpenBSDTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005155 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00005156 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005157 default:
5158 return new SparcV8TargetInfo(T);
5159 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005160
Eli Friedmanb63decf2009-08-19 20:47:07 +00005161 case llvm::Triple::tce:
5162 return new TCETargetInfo(T);
5163
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005164 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005165 if (Triple.isOSDarwin())
5166 return new DarwinI386TargetInfo(T);
5167
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005168 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005169 case llvm::Triple::AuroraUX:
5170 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005171 case llvm::Triple::Linux:
5172 return new LinuxTargetInfo<X86_32TargetInfo>(T);
5173 case llvm::Triple::DragonFly:
5174 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
5175 case llvm::Triple::NetBSD:
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00005176 return new NetBSDI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005177 case llvm::Triple::OpenBSD:
5178 return new OpenBSDI386TargetInfo(T);
Eli Friedman42f74f22012-08-08 23:57:20 +00005179 case llvm::Triple::Bitrig:
5180 return new BitrigI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005181 case llvm::Triple::FreeBSD:
5182 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00005183 case llvm::Triple::Minix:
5184 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005185 case llvm::Triple::Solaris:
5186 return new SolarisTargetInfo<X86_32TargetInfo>(T);
5187 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005188 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005189 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005190 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005191 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00005192 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00005193 case llvm::Triple::Haiku:
5194 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00005195 case llvm::Triple::RTEMS:
5196 return new RTEMSX86_32TargetInfo(T);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005197 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00005198 return new NaClTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005199 default:
5200 return new X86_32TargetInfo(T);
5201 }
5202
5203 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005204 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
5205 return new DarwinX86_64TargetInfo(T);
5206
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005207 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005208 case llvm::Triple::AuroraUX:
5209 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005210 case llvm::Triple::Linux:
5211 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00005212 case llvm::Triple::DragonFly:
5213 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005214 case llvm::Triple::NetBSD:
5215 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
5216 case llvm::Triple::OpenBSD:
5217 return new OpenBSDX86_64TargetInfo(T);
Eli Friedman42f74f22012-08-08 23:57:20 +00005218 case llvm::Triple::Bitrig:
5219 return new BitrigX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005220 case llvm::Triple::FreeBSD:
5221 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
5222 case llvm::Triple::Solaris:
5223 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00005224 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005225 return new MinGWX86_64TargetInfo(T);
5226 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005227 return new VisualStudioWindowsX86_64TargetInfo(T);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005228 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00005229 return new NaClTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005230 default:
5231 return new X86_64TargetInfo(T);
5232 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005233
5234 case llvm::Triple::spir: {
5235 llvm::Triple Triple(T);
5236 if (Triple.getOS() != llvm::Triple::UnknownOS ||
5237 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
5238 return NULL;
5239 return new SPIR32TargetInfo(T);
5240 }
5241 case llvm::Triple::spir64: {
5242 llvm::Triple Triple(T);
5243 if (Triple.getOS() != llvm::Triple::UnknownOS ||
5244 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
5245 return NULL;
5246 return new SPIR64TargetInfo(T);
5247 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005248 }
Reid Spencer5f016e22007-07-11 17:01:13 +00005249}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005250
5251/// CreateTargetInfo - Return the target info object for the specified target
5252/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00005253TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregor49a87542012-11-16 04:24:59 +00005254 TargetOptions *Opts) {
5255 llvm::Triple Triple(Opts->Triple);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005256
5257 // Construct the target
Dylan Noblesmith6f42b622012-02-05 02:12:40 +00005258 OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005259 if (!Target) {
5260 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5261 return 0;
5262 }
Douglas Gregor9a022bb2012-10-15 16:45:32 +00005263 Target->setTargetOpts(Opts);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005264
Daniel Dunbareac7c532009-12-18 18:42:37 +00005265 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005266 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5267 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbareac7c532009-12-18 18:42:37 +00005268 return 0;
5269 }
5270
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005271 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005272 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5273 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005274 return 0;
5275 }
5276
Charles Davis98b7c5c2010-06-11 01:06:47 +00005277 // Set the target C++ ABI.
Douglas Gregor49a87542012-11-16 04:24:59 +00005278 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5279 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis98b7c5c2010-06-11 01:06:47 +00005280 return 0;
5281 }
5282
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005283 // Compute the default target features, we need the target to handle this
5284 // because features may have dependencies on one another.
5285 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00005286 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005287
5288 // Apply the user specified deltas.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005289 // First the enables.
Douglas Gregor57016dd2012-10-16 23:40:58 +00005290 for (std::vector<std::string>::const_iterator
Douglas Gregor49a87542012-11-16 04:24:59 +00005291 it = Opts->FeaturesAsWritten.begin(),
5292 ie = Opts->FeaturesAsWritten.end();
Douglas Gregor57016dd2012-10-16 23:40:58 +00005293 it != ie; ++it) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005294 const char *Name = it->c_str();
5295
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005296 if (Name[0] != '+')
5297 continue;
5298
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005299 // Apply the feature via the target.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005300 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
5301 Diags.Report(diag::err_target_invalid_feature) << Name;
5302 return 0;
5303 }
5304 }
5305
5306 // Then the disables.
Douglas Gregor57016dd2012-10-16 23:40:58 +00005307 for (std::vector<std::string>::const_iterator
Douglas Gregor49a87542012-11-16 04:24:59 +00005308 it = Opts->FeaturesAsWritten.begin(),
5309 ie = Opts->FeaturesAsWritten.end();
Douglas Gregor57016dd2012-10-16 23:40:58 +00005310 it != ie; ++it) {
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005311 const char *Name = it->c_str();
5312
5313 if (Name[0] == '+')
5314 continue;
5315
5316 // Apply the feature via the target.
5317 if (Name[0] != '-' ||
5318 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005319 Diags.Report(diag::err_target_invalid_feature) << Name;
5320 return 0;
5321 }
5322 }
5323
5324 // Add the features to the compile options.
5325 //
5326 // FIXME: If we are completely confident that we have the right set, we only
5327 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00005328 Opts->Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005329 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5330 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00005331 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
5332 Target->HandleTargetFeatures(Opts->Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005333
5334 return Target.take();
5335}