blob: d1485287491a7f690ad237e5a92d25d80a09b260 [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikova7c47172009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenekbbced582007-12-12 18:05:32 +000011// target triple.
Reid Spencer5f016e22007-07-11 17:01:13 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer5f016e22007-07-11 17:01:13 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattner8fc4dfb2008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth103b71c2010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman25531262008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar29a790b2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar77659342009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar29a790b2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner4c28b1c2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chandler Carruth3b844ba2013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner797c3c42009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie9fe8c742011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Benjamin Kramer48725082010-01-09 18:20:57 +000031#include <algorithm>
Reid Spencer5f016e22007-07-11 17:01:13 +000032using namespace clang;
33
Reid Spencer5f016e22007-07-11 17:01:13 +000034//===----------------------------------------------------------------------===//
35// Common code shared among targets.
36//===----------------------------------------------------------------------===//
37
Chris Lattnerca45cff2009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner5f9e2722011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattnerca45cff2009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000044
Chris Lattnerca45cff2009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramera9992772010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000049
Chris Lattnerca45cff2009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramera9992772010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000052
Chris Lattnerca45cff2009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramera9992772010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerca45cff2009-03-20 16:06:38 +000055}
56
Benjamin Kramer448f68d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattnerd29b6302008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner797c3c42009-08-10 19:03:04 +000068
Torok Edwin5f6c1942009-06-30 17:10:35 +000069namespace {
Douglas Gregora3844922009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwin5f6c1942009-06-30 17:10:35 +000072protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwin5f6c1942009-06-30 17:10:35 +000075public:
Douglas Gregora3844922009-07-01 15:12:53 +000076 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwin5f6c1942009-06-30 17:10:35 +000077 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +000078 MacroBuilder &Builder) const {
79 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwinb0a5b242009-06-30 17:00:25 +000081 }
Torok Edwin5f6c1942009-06-30 17:10:35 +000082
83};
Chris Lattner4c28b1c2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwinb0a5b242009-06-30 17:00:25 +000085
Chris Lattner797c3c42009-08-10 19:03:04 +000086
Daniel Dunbar21ae3192010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner5f9e2722011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Benjamin Kramera9992772010-01-09 17:55:51 +000091 Builder.defineMacro("__APPLE_CC__", "5621");
92 Builder.defineMacro("__APPLE__");
93 Builder.defineMacro("__MACH__");
94 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenko087c65f2012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Will Dietz4f45bc02013-01-18 11:30:38 +000097 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000098
John McCall098df7f2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCallf85e1932011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000102
John McCallf85e1932011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregore289d812011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCallf85e1932011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +0000108
John McCallf85e1932011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCallf85e1932011-06-15 23:02:42 +0000113 }
Eric Christopher7c9adf92011-07-07 22:55:26 +0000114
Eli Friedman2de4fee2009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +0000117 else
Benjamin Kramera9992772010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000122
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson48b68a02012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000128 } else {
Bob Wilson48b68a02012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000131 }
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000132
Sebastian Pop9ec60df2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopher895d4222011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierd9259f32011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000141 // Set the appropriate OS version define.
Bob Wilson48b68a02012-01-31 23:52:58 +0000142 if (Triple.getOS() == llvm::Triple::IOS) {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
152 } else {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000153 // Note that the Driver allows versions which aren't representable in the
154 // define (because we only get a single digit for the minor and micro
155 // revision numbers). So, we limit them to the maximum representable
156 // version.
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000157 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000159 char Str[5];
160 Str[0] = '0' + (Maj / 10);
161 Str[1] = '0' + (Maj % 10);
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000162 Str[2] = '0' + std::min(Min, 9U);
163 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000164 Str[4] = '\0';
165 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000166 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000167
168 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman618234a2008-08-20 02:34:37 +0000169}
Reid Spencer5f016e22007-07-11 17:01:13 +0000170
Chris Lattner797c3c42009-08-10 19:03:04 +0000171namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000172template<typename Target>
173class DarwinTargetInfo : public OSTargetInfo<Target> {
174protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000175 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000176 MacroBuilder &Builder) const {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000177 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000178 this->PlatformMinVersion);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000179 }
Mike Stump1eb44332009-09-09 15:08:12 +0000180
Torok Edwin5f6c1942009-06-30 17:10:35 +0000181public:
182 DarwinTargetInfo(const std::string& triple) :
183 OSTargetInfo<Target>(triple) {
Eric Christopheraa7333c2011-07-02 00:20:22 +0000184 llvm::Triple T = llvm::Triple(triple);
185 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000186 this->MCountName = "\01mcount";
Torok Edwin5f6c1942009-06-30 17:10:35 +0000187 }
188
Chris Lattner5f9e2722011-07-23 10:55:15 +0000189 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000190 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000191 StringRef Segment, Section;
Chris Lattner797c3c42009-08-10 19:03:04 +0000192 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000193 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000194 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000195 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000196 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000197
Anders Carlsson18af3682010-06-08 22:47:50 +0000198 virtual const char *getStaticInitSectionSpecifier() const {
199 // FIXME: We should return 0 when building kexts.
200 return "__TEXT,__StaticInit,regular,pure_instructions";
201 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000202
John McCall41887602012-01-29 01:20:30 +0000203 /// Darwin does not support protected visibility. Darwin's "default"
204 /// is very similar to ELF's "protected"; Darwin requires a "weak"
205 /// attribute on declarations that can be dynamically replaced.
206 virtual bool hasProtectedVisibility() const {
207 return false;
208 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000209};
210
Chris Lattner797c3c42009-08-10 19:03:04 +0000211
Torok Edwin5f6c1942009-06-30 17:10:35 +0000212// DragonFlyBSD Target
213template<typename Target>
214class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
215protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000216 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000217 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000218 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000219 Builder.defineMacro("__DragonFly__");
220 Builder.defineMacro("__DragonFly_cc_version", "100001");
221 Builder.defineMacro("__ELF__");
222 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
223 Builder.defineMacro("__tune_i386__");
224 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000225 }
226public:
Mike Stump1eb44332009-09-09 15:08:12 +0000227 DragonFlyBSDTargetInfo(const std::string &triple)
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000228 : OSTargetInfo<Target>(triple) {
229 this->UserLabelPrefix = "";
230
231 llvm::Triple Triple(triple);
232 switch (Triple.getArch()) {
233 default:
234 case llvm::Triple::x86:
235 case llvm::Triple::x86_64:
236 this->MCountName = ".mcount";
237 break;
238 }
239 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000240};
241
242// FreeBSD Target
243template<typename Target>
244class FreeBSDTargetInfo : public OSTargetInfo<Target> {
245protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000246 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000247 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000248 // FreeBSD defines; list based off of gcc output
249
Benjamin Kramer474202f2011-10-18 10:10:08 +0000250 unsigned Release = Triple.getOSMajorVersion();
251 if (Release == 0U)
252 Release = 8;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000253
Benjamin Kramer474202f2011-10-18 10:10:08 +0000254 Builder.defineMacro("__FreeBSD__", Twine(Release));
255 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramera9992772010-01-09 17:55:51 +0000256 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257 DefineStd(Builder, "unix", Opts);
258 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000259 }
260public:
Mike Stump1eb44332009-09-09 15:08:12 +0000261 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000262 : OSTargetInfo<Target>(triple) {
263 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000264
265 llvm::Triple Triple(triple);
266 switch (Triple.getArch()) {
267 default:
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
271 break;
272 case llvm::Triple::mips:
273 case llvm::Triple::mipsel:
274 case llvm::Triple::ppc:
275 case llvm::Triple::ppc64:
276 this->MCountName = "_mcount";
277 break;
278 case llvm::Triple::arm:
279 this->MCountName = "__mcount";
280 break;
281 }
282
Duncan Sands1e90faf2009-07-08 13:55:08 +0000283 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000284};
285
Chris Lattner38e317d2010-07-07 16:01:42 +0000286// Minix Target
287template<typename Target>
288class MinixTargetInfo : public OSTargetInfo<Target> {
289protected:
290 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
291 MacroBuilder &Builder) const {
292 // Minix defines
293
294 Builder.defineMacro("__minix", "3");
295 Builder.defineMacro("_EM_WSIZE", "4");
296 Builder.defineMacro("_EM_PSIZE", "4");
297 Builder.defineMacro("_EM_SSIZE", "2");
298 Builder.defineMacro("_EM_LSIZE", "4");
299 Builder.defineMacro("_EM_FSIZE", "4");
300 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000301 Builder.defineMacro("__ELF__");
Chris Lattner38e317d2010-07-07 16:01:42 +0000302 DefineStd(Builder, "unix", Opts);
303 }
304public:
305 MinixTargetInfo(const std::string &triple)
306 : OSTargetInfo<Target>(triple) {
307 this->UserLabelPrefix = "";
308 }
309};
310
Torok Edwin5f6c1942009-06-30 17:10:35 +0000311// Linux target
312template<typename Target>
313class LinuxTargetInfo : public OSTargetInfo<Target> {
314protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000315 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000316 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000317 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000318 DefineStd(Builder, "unix", Opts);
319 DefineStd(Builder, "linux", Opts);
320 Builder.defineMacro("__gnu_linux__");
321 Builder.defineMacro("__ELF__");
Logan Chien94a71422012-09-02 09:30:11 +0000322 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov32064032012-04-26 12:08:09 +0000323 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000324 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000325 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000326 if (Opts.CPlusPlus)
327 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000328 }
329public:
Mike Stump1eb44332009-09-09 15:08:12 +0000330 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000331 : OSTargetInfo<Target>(triple) {
332 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000333 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000334 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000335
336 virtual const char *getStaticInitSectionSpecifier() const {
337 return ".text.startup";
338 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000339};
340
Chris Lattnerb62bb282009-07-13 20:29:08 +0000341// NetBSD Target
342template<typename Target>
343class NetBSDTargetInfo : public OSTargetInfo<Target> {
344protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000345 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000346 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000347 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000348 Builder.defineMacro("__NetBSD__");
349 Builder.defineMacro("__unix__");
350 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000351 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000352 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000353 }
354public:
Mike Stump1eb44332009-09-09 15:08:12 +0000355 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000356 : OSTargetInfo<Target>(triple) {
357 this->UserLabelPrefix = "";
358 }
359};
360
Torok Edwin5f6c1942009-06-30 17:10:35 +0000361// OpenBSD Target
362template<typename Target>
363class OpenBSDTargetInfo : public OSTargetInfo<Target> {
364protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000365 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000366 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000367 // OpenBSD defines; list based off of gcc output
368
Benjamin Kramera9992772010-01-09 17:55:51 +0000369 Builder.defineMacro("__OpenBSD__");
370 DefineStd(Builder, "unix", Opts);
371 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000372 if (Opts.POSIXThreads)
Chris Lattner4ddcf3b2012-04-25 06:12:24 +0000373 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000374 }
375public:
Mike Stump1eb44332009-09-09 15:08:12 +0000376 OpenBSDTargetInfo(const std::string &triple)
Eli Friedman62d829a2011-12-15 02:15:56 +0000377 : OSTargetInfo<Target>(triple) {
378 this->UserLabelPrefix = "";
Hans Wennborge48667f2012-08-01 18:53:19 +0000379 this->TLSSupported = false;
Eli Friedman62d829a2011-12-15 02:15:56 +0000380
381 llvm::Triple Triple(triple);
382 switch (Triple.getArch()) {
383 default:
384 case llvm::Triple::x86:
385 case llvm::Triple::x86_64:
386 case llvm::Triple::arm:
Eric Christopher825d3862012-11-14 22:08:59 +0000387 case llvm::Triple::sparc:
Eli Friedman62d829a2011-12-15 02:15:56 +0000388 this->MCountName = "__mcount";
389 break;
390 case llvm::Triple::mips64:
391 case llvm::Triple::mips64el:
392 case llvm::Triple::ppc:
Eric Christopher825d3862012-11-14 22:08:59 +0000393 case llvm::Triple::sparcv9:
Eli Friedman62d829a2011-12-15 02:15:56 +0000394 this->MCountName = "_mcount";
395 break;
396 }
397 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000398};
399
Eli Friedman42f74f22012-08-08 23:57:20 +0000400// Bitrig Target
401template<typename Target>
402class BitrigTargetInfo : public OSTargetInfo<Target> {
403protected:
404 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
405 MacroBuilder &Builder) const {
406 // Bitrig defines; list based off of gcc output
407
408 Builder.defineMacro("__Bitrig__");
409 DefineStd(Builder, "unix", Opts);
410 Builder.defineMacro("__ELF__");
411 if (Opts.POSIXThreads)
412 Builder.defineMacro("_REENTRANT");
413 }
414public:
415 BitrigTargetInfo(const std::string &triple)
416 : OSTargetInfo<Target>(triple) {
417 this->UserLabelPrefix = "";
418 this->TLSSupported = false;
419 this->MCountName = "__mcount";
420 }
421};
422
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000423// PSP Target
424template<typename Target>
425class PSPTargetInfo : public OSTargetInfo<Target> {
426protected:
427 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000428 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000429 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000430 Builder.defineMacro("PSP");
431 Builder.defineMacro("_PSP");
432 Builder.defineMacro("__psp__");
433 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000434 }
435public:
436 PSPTargetInfo(const std::string& triple)
437 : OSTargetInfo<Target>(triple) {
438 this->UserLabelPrefix = "";
439 }
440};
441
John Thompson3f6918a2009-11-19 17:18:50 +0000442// PS3 PPU Target
443template<typename Target>
444class PS3PPUTargetInfo : public OSTargetInfo<Target> {
445protected:
446 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000447 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000448 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000449 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000450 Builder.defineMacro("__PPU__");
451 Builder.defineMacro("__CELLOS_LV2__");
452 Builder.defineMacro("__ELF__");
453 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000454 Builder.defineMacro("_ARCH_PPC64");
455 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000456 }
457public:
458 PS3PPUTargetInfo(const std::string& triple)
459 : OSTargetInfo<Target>(triple) {
460 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000461 this->LongWidth = this->LongAlign = 32;
462 this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000463 this->IntMaxType = TargetInfo::SignedLongLong;
464 this->UIntMaxType = TargetInfo::UnsignedLongLong;
465 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000466 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000467 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Nick Lewycky99520702011-12-16 22:32:39 +0000468 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000469 }
470};
471
472// FIXME: Need a real SPU target.
473// PS3 SPU Target
474template<typename Target>
475class PS3SPUTargetInfo : public OSTargetInfo<Target> {
476protected:
477 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000478 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000479 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000480 Builder.defineMacro("__SPU__");
481 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000482 }
483public:
484 PS3SPUTargetInfo(const std::string& triple)
485 : OSTargetInfo<Target>(triple) {
486 this->UserLabelPrefix = "";
487 }
488};
489
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000490// AuroraUX target
491template<typename Target>
492class AuroraUXTargetInfo : public OSTargetInfo<Target> {
493protected:
494 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000495 MacroBuilder &Builder) const {
496 DefineStd(Builder, "sun", Opts);
497 DefineStd(Builder, "unix", Opts);
498 Builder.defineMacro("__ELF__");
499 Builder.defineMacro("__svr4__");
500 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000501 }
502public:
503 AuroraUXTargetInfo(const std::string& triple)
504 : OSTargetInfo<Target>(triple) {
505 this->UserLabelPrefix = "";
506 this->WCharType = this->SignedLong;
507 // FIXME: WIntType should be SignedLong
508 }
509};
510
Torok Edwin5f6c1942009-06-30 17:10:35 +0000511// Solaris target
512template<typename Target>
513class SolarisTargetInfo : public OSTargetInfo<Target> {
514protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000515 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000516 MacroBuilder &Builder) const {
517 DefineStd(Builder, "sun", Opts);
518 DefineStd(Builder, "unix", Opts);
519 Builder.defineMacro("__ELF__");
520 Builder.defineMacro("__svr4__");
521 Builder.defineMacro("__SVR4");
David Chisnall165329c2012-02-28 17:10:04 +0000522 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
523 // newer, but to 500 for everything else. feature_test.h has a check to
524 // ensure that you are not using C99 with an old version of X/Open or C89
525 // with a new version.
526 if (Opts.C99 || Opts.C11)
527 Builder.defineMacro("_XOPEN_SOURCE", "600");
528 else
529 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnallb4f0bd62012-03-02 10:49:52 +0000530 if (Opts.CPlusPlus)
David Chisnall165329c2012-02-28 17:10:04 +0000531 Builder.defineMacro("__C99FEATURES__");
David Chisnall48fad492012-02-17 18:35:11 +0000532 Builder.defineMacro("_LARGEFILE_SOURCE");
533 Builder.defineMacro("_LARGEFILE64_SOURCE");
534 Builder.defineMacro("__EXTENSIONS__");
David Chisnall165329c2012-02-28 17:10:04 +0000535 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000536 }
537public:
Mike Stump1eb44332009-09-09 15:08:12 +0000538 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000539 : OSTargetInfo<Target>(triple) {
540 this->UserLabelPrefix = "";
David Chisnallfb027842012-03-28 18:04:14 +0000541 this->WCharType = this->SignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000542 // FIXME: WIntType should be SignedLong
543 }
544};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000545
546// Windows target
547template<typename Target>
548class WindowsTargetInfo : public OSTargetInfo<Target> {
549protected:
550 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
551 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000552 Builder.defineMacro("_WIN32");
553 }
554 void getVisualStudioDefines(const LangOptions &Opts,
555 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000556 if (Opts.CPlusPlus) {
557 if (Opts.RTTI)
558 Builder.defineMacro("_CPPRTTI");
559
560 if (Opts.Exceptions)
561 Builder.defineMacro("_CPPUNWIND");
562 }
563
564 if (!Opts.CharIsSigned)
565 Builder.defineMacro("_CHAR_UNSIGNED");
566
567 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
568 // but it works for now.
569 if (Opts.POSIXThreads)
570 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000571
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000572 if (Opts.MSCVersion != 0)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000573 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000574
Francois Pichet62ec1f22011-09-17 17:15:52 +0000575 if (Opts.MicrosoftExt) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000576 Builder.defineMacro("_MSC_EXTENSIONS");
577
Richard Smith80ad52f2013-01-02 11:42:31 +0000578 if (Opts.CPlusPlus11) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000579 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
580 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
581 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
582 }
583 }
584
585 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000586 }
587
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000588public:
589 WindowsTargetInfo(const std::string &triple)
590 : OSTargetInfo<Target>(triple) {}
591};
592
Derek Schuff7da46f92012-10-11 16:55:58 +0000593template <typename Target>
594class NaClTargetInfo : public OSTargetInfo<Target> {
595 protected:
596 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
597 MacroBuilder &Builder) const {
598 if (Opts.POSIXThreads)
599 Builder.defineMacro("_REENTRANT");
600 if (Opts.CPlusPlus)
601 Builder.defineMacro("_GNU_SOURCE");
602
603 DefineStd(Builder, "unix", Opts);
604 Builder.defineMacro("__ELF__");
605 Builder.defineMacro("__native_client__");
606 }
607 public:
608 NaClTargetInfo(const std::string &triple)
609 : OSTargetInfo<Target>(triple) {
610 this->UserLabelPrefix = "";
611 this->LongAlign = 32;
612 this->LongWidth = 32;
613 this->PointerAlign = 32;
614 this->PointerWidth = 32;
615 this->IntMaxType = TargetInfo::SignedLongLong;
616 this->UIntMaxType = TargetInfo::UnsignedLongLong;
617 this->Int64Type = TargetInfo::SignedLongLong;
618 this->DoubleAlign = 64;
619 this->LongDoubleWidth = 64;
620 this->LongDoubleAlign = 64;
621 this->SizeType = TargetInfo::UnsignedInt;
622 this->PtrDiffType = TargetInfo::SignedInt;
623 this->IntPtrType = TargetInfo::SignedInt;
624 this->RegParmMax = 2;
625 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
626 this->DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
627 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
628 }
Derek Schuff263366f2012-10-16 22:30:41 +0000629 virtual typename Target::CallingConvCheckResult checkCallingConvention(
630 CallingConv CC) const {
631 return CC == CC_PnaclCall ? Target::CCCR_OK :
632 Target::checkCallingConvention(CC);
633 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000634};
Mike Stump1eb44332009-09-09 15:08:12 +0000635} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000636
Chris Lattnerd29b6302008-10-05 21:50:58 +0000637//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000638// Specific target implementations.
639//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000640
Eli Friedmane4277982008-08-20 23:11:40 +0000641namespace {
642// PPC abstract base class
643class PPCTargetInfo : public TargetInfo {
644 static const Builtin::Info BuiltinInfo[];
645 static const char * const GCCRegNames[];
646 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel02a84272012-06-11 22:35:19 +0000647 std::string CPU;
Eli Friedmane4277982008-08-20 23:11:40 +0000648public:
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000649 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
650 LongDoubleWidth = LongDoubleAlign = 128;
651 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
652 }
Eli Friedman15b91762009-06-05 07:05:05 +0000653
Hal Finkel39d5fa12012-07-03 16:51:04 +0000654 /// \brief Flags for architecture specific defines.
655 typedef enum {
656 ArchDefineNone = 0,
657 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
658 ArchDefinePpcgr = 1 << 1,
659 ArchDefinePpcsq = 1 << 2,
660 ArchDefine440 = 1 << 3,
661 ArchDefine603 = 1 << 4,
662 ArchDefine604 = 1 << 5,
663 ArchDefinePwr4 = 1 << 6,
Bill Schmidt2821e182013-02-01 20:23:10 +0000664 ArchDefinePwr5 = 1 << 7,
665 ArchDefinePwr5x = 1 << 8,
666 ArchDefinePwr6 = 1 << 9,
667 ArchDefinePwr6x = 1 << 10,
668 ArchDefinePwr7 = 1 << 11,
669 ArchDefineA2 = 1 << 12,
670 ArchDefineA2q = 1 << 13
Hal Finkel39d5fa12012-07-03 16:51:04 +0000671 } ArchDefineTypes;
672
Bill Schmidt2821e182013-02-01 20:23:10 +0000673 // Note: GCC recognizes the following additional cpus:
674 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
675 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
676 // titan, rs64.
Hal Finkel02a84272012-06-11 22:35:19 +0000677 virtual bool setCPU(const std::string &Name) {
678 bool CPUKnown = llvm::StringSwitch<bool>(Name)
679 .Case("generic", true)
680 .Case("440", true)
681 .Case("450", true)
682 .Case("601", true)
683 .Case("602", true)
684 .Case("603", true)
685 .Case("603e", true)
686 .Case("603ev", true)
687 .Case("604", true)
688 .Case("604e", true)
689 .Case("620", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000690 .Case("630", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000691 .Case("g3", true)
692 .Case("7400", true)
693 .Case("g4", true)
694 .Case("7450", true)
695 .Case("g4+", true)
696 .Case("750", true)
697 .Case("970", true)
698 .Case("g5", true)
699 .Case("a2", true)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000700 .Case("a2q", true)
Hal Finkel7de32962012-09-18 22:25:03 +0000701 .Case("e500mc", true)
702 .Case("e5500", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000703 .Case("power3", true)
704 .Case("pwr3", true)
705 .Case("power4", true)
706 .Case("pwr4", true)
707 .Case("power5", true)
708 .Case("pwr5", true)
709 .Case("power5x", true)
710 .Case("pwr5x", true)
711 .Case("power6", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000712 .Case("pwr6", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000713 .Case("power6x", true)
714 .Case("pwr6x", true)
715 .Case("power7", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000716 .Case("pwr7", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000717 .Case("powerpc", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000718 .Case("ppc", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000719 .Case("powerpc64", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000720 .Case("ppc64", true)
721 .Default(false);
722
723 if (CPUKnown)
724 CPU = Name;
725
726 return CPUKnown;
727 }
728
Eli Friedmane4277982008-08-20 23:11:40 +0000729 virtual void getTargetBuiltins(const Builtin::Info *&Records,
730 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000731 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000732 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000733 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000734
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000735 virtual bool isCLZForZeroUndef() const { return false; }
736
Chris Lattner33328642009-03-20 15:52:06 +0000737 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000738 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000739
Bill Schmidt199402b2013-02-01 02:14:03 +0000740 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
741
742 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
743 StringRef Name,
744 bool Enabled) const;
745
Douglas Gregore727d212012-01-30 06:38:25 +0000746 virtual bool hasFeature(StringRef Feature) const;
747
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000748 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000749 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000750 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000751 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000752 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000753 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000754 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000755 default: return false;
756 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000757 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000758 case 'b': // Base register
759 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000760 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000761 break;
762 // FIXME: The following are added to allow parsing.
763 // I just took a guess at what the actions should be.
764 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000765 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000766 case 'v': // Altivec vector register
767 Info.setAllowsRegister();
768 break;
769 case 'w':
770 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000771 case 'd':// VSX vector register to hold vector double data
772 case 'f':// VSX vector register to hold vector float data
773 case 's':// VSX vector register to hold scalar float data
774 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000775 break;
776 default:
777 return false;
778 }
779 Info.setAllowsRegister();
780 Name++; // Skip over 'w'.
781 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000782 case 'h': // `MQ', `CTR', or `LINK' register
783 case 'q': // `MQ' register
784 case 'c': // `CTR' register
785 case 'l': // `LINK' register
786 case 'x': // `CR' register (condition register) number 0
787 case 'y': // `CR' register (condition register)
788 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000789 Info.setAllowsRegister();
790 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000791 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000792 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000793 // (use `L' instead for SImode constants)
794 case 'K': // Unsigned 16-bit constant
795 case 'L': // Signed 16-bit constant shifted left 16 bits
796 case 'M': // Constant larger than 31
797 case 'N': // Exact power of 2
798 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000799 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000800 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000801 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000802 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000803 break;
804 case 'm': // Memory operand. Note that on PowerPC targets, m can
805 // include addresses that update the base register. It
806 // is therefore only safe to use `m' in an asm statement
807 // if that asm statement accesses the operand exactly once.
808 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000809 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000810 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000811 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000812 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000813 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
814 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000815 // register to be updated.
816 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000817 if (Name[1] != 's')
818 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000819 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000820 // include any automodification of the base register. Unlike
821 // `m', this constraint can be used in asm statements that
822 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000823 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000824 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000825 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000826 break;
827 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000828 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000829 case 'Z': // Memory operand that is an indexed or indirect from a
830 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000831 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000832 Info.setAllowsMemory();
833 Info.setAllowsRegister();
834 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000835 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000836 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000837 // register (`p' is preferable for asm statements)
838 case 'S': // Constant suitable as a 64-bit mask operand
839 case 'T': // Constant suitable as a 32-bit mask operand
840 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000841 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000842 // instructions
843 case 'W': // Vector constant that does not require memory
844 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000845 break;
846 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000847 }
John Thompson8e6065a2010-06-24 22:44:13 +0000848 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000849 }
Eli Friedmane4277982008-08-20 23:11:40 +0000850 virtual const char *getClobbers() const {
851 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000852 }
Adhemerval Zanellab0fc94c2013-01-22 20:02:45 +0000853 int getEHDataRegisterNumber(unsigned RegNo) const {
854 if (RegNo == 0) return 3;
855 if (RegNo == 1) return 4;
856 return -1;
857 }
Eli Friedmane4277982008-08-20 23:11:40 +0000858};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000859
Eli Friedmane4277982008-08-20 23:11:40 +0000860const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000861#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000862#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000863 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000864#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000865};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000866
867
Chris Lattnerc0f59212009-03-02 22:27:17 +0000868/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
869/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000870void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000871 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000872 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000873 Builder.defineMacro("__ppc__");
874 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000875 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000876 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000877 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000878 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnere03ae302010-02-16 18:14:57 +0000879 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000880 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000881 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000882 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000883 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000884
Chris Lattnerc0f59212009-03-02 22:27:17 +0000885 // Target properties.
Hans Wennborg5e601dc2012-08-02 13:45:48 +0000886 if (getTriple().getOS() != llvm::Triple::NetBSD &&
887 getTriple().getOS() != llvm::Triple::OpenBSD)
Joerg Sonnenberger7cd1de52011-07-05 14:56:12 +0000888 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramera9992772010-01-09 17:55:51 +0000889 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000890
Chris Lattnerc0f59212009-03-02 22:27:17 +0000891 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000892 Builder.defineMacro("__NATURAL_ALIGNMENT__");
893 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000894
Chris Lattnerc0f59212009-03-02 22:27:17 +0000895 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000896 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000897
John Thompson3f6918a2009-11-19 17:18:50 +0000898 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000899 Builder.defineMacro("__VEC__", "10206");
900 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000901 }
Hal Finkel02a84272012-06-11 22:35:19 +0000902
903 // CPU identification.
Hal Finkel39d5fa12012-07-03 16:51:04 +0000904 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
905 .Case("440", ArchDefineName)
906 .Case("450", ArchDefineName | ArchDefine440)
907 .Case("601", ArchDefineName)
908 .Case("602", ArchDefineName | ArchDefinePpcgr)
909 .Case("603", ArchDefineName | ArchDefinePpcgr)
910 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
911 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
912 .Case("604", ArchDefineName | ArchDefinePpcgr)
913 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
914 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt2821e182013-02-01 20:23:10 +0000915 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000916 .Case("7400", ArchDefineName | ArchDefinePpcgr)
917 .Case("7450", ArchDefineName | ArchDefinePpcgr)
918 .Case("750", ArchDefineName | ArchDefinePpcgr)
919 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
920 | ArchDefinePpcsq)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000921 .Case("a2", ArchDefineA2)
922 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt2821e182013-02-01 20:23:10 +0000923 .Case("pwr3", ArchDefinePpcgr)
924 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
925 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
926 | ArchDefinePpcsq)
927 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
928 | ArchDefinePpcgr | ArchDefinePpcsq)
929 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
930 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
931 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
932 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
933 | ArchDefinePpcsq)
934 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
935 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
936 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
937 .Case("power3", ArchDefinePpcgr)
938 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
939 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
940 | ArchDefinePpcsq)
941 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
942 | ArchDefinePpcgr | ArchDefinePpcsq)
943 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
944 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
945 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
946 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
947 | ArchDefinePpcsq)
948 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
949 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
950 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000951 .Default(ArchDefineNone);
952
953 if (defs & ArchDefineName)
954 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
955 if (defs & ArchDefinePpcgr)
956 Builder.defineMacro("_ARCH_PPCGR");
957 if (defs & ArchDefinePpcsq)
958 Builder.defineMacro("_ARCH_PPCSQ");
959 if (defs & ArchDefine440)
Hal Finkel02a84272012-06-11 22:35:19 +0000960 Builder.defineMacro("_ARCH_440");
Hal Finkel39d5fa12012-07-03 16:51:04 +0000961 if (defs & ArchDefine603)
962 Builder.defineMacro("_ARCH_603");
963 if (defs & ArchDefine604)
964 Builder.defineMacro("_ARCH_604");
Bill Schmidt2821e182013-02-01 20:23:10 +0000965 if (defs & ArchDefinePwr4)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000966 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt2821e182013-02-01 20:23:10 +0000967 if (defs & ArchDefinePwr5)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000968 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt2821e182013-02-01 20:23:10 +0000969 if (defs & ArchDefinePwr5x)
970 Builder.defineMacro("_ARCH_PWR5X");
971 if (defs & ArchDefinePwr6)
Hal Finkel02a84272012-06-11 22:35:19 +0000972 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt2821e182013-02-01 20:23:10 +0000973 if (defs & ArchDefinePwr6x)
974 Builder.defineMacro("_ARCH_PWR6X");
975 if (defs & ArchDefinePwr7)
976 Builder.defineMacro("_ARCH_PWR7");
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000977 if (defs & ArchDefineA2)
978 Builder.defineMacro("_ARCH_A2");
979 if (defs & ArchDefineA2q) {
980 Builder.defineMacro("_ARCH_A2Q");
981 Builder.defineMacro("_ARCH_QP");
982 }
983
984 if (getTriple().getVendor() == llvm::Triple::BGQ) {
985 Builder.defineMacro("__bg__");
986 Builder.defineMacro("__THW_BLUEGENE__");
987 Builder.defineMacro("__bgq__");
988 Builder.defineMacro("__TOS_BGQ__");
989 }
Bill Schmidt2821e182013-02-01 20:23:10 +0000990
991 // FIXME: The following are not yet generated here by Clang, but are
992 // generated by GCC:
993 //
994 // _SOFT_FLOAT_
995 // __RECIP_PRECISION__
996 // __APPLE_ALTIVEC__
997 // __VSX__
998 // __RECIP__
999 // __RECIPF__
1000 // __RSQRTE__
1001 // __RSQRTEF__
1002 // _SOFT_DOUBLE_
1003 // __NO_LWSYNC__
1004 // __HAVE_BSWAP__
1005 // __LONGDOUBLE128
1006 // __CMODEL_MEDIUM__
1007 // __CMODEL_LARGE__
1008 // _CALL_SYSV
1009 // _CALL_DARWIN
1010 // __NO_FPRS__
Bill Schmidt199402b2013-02-01 02:14:03 +00001011}
1012
1013void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1014 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1015 .Case("7400", true)
1016 .Case("g4", true)
1017 .Case("7450", true)
1018 .Case("g4+", true)
1019 .Case("970", true)
1020 .Case("g5", true)
1021 .Case("pwr6", true)
1022 .Case("pwr7", true)
1023 .Case("ppc64", true)
1024 .Default(false);
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001025
1026 Features["qpx"] = (CPU == "a2q");
Bill Schmidt199402b2013-02-01 02:14:03 +00001027}
1028
1029bool PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1030 StringRef Name,
1031 bool Enabled) const {
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001032 if (Name == "altivec" || Name == "qpx") {
Bill Schmidt199402b2013-02-01 02:14:03 +00001033 Features[Name] = Enabled;
1034 return true;
Hal Finkel02a84272012-06-11 22:35:19 +00001035 }
Bill Schmidt199402b2013-02-01 02:14:03 +00001036
1037 return false;
Chris Lattnerc0f59212009-03-02 22:27:17 +00001038}
1039
Douglas Gregore727d212012-01-30 06:38:25 +00001040bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1041 return Feature == "powerpc";
1042}
Chris Lattner393ff042008-04-21 18:56:49 +00001043
Douglas Gregore727d212012-01-30 06:38:25 +00001044
Eli Friedmane4277982008-08-20 23:11:40 +00001045const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +00001046 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1047 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1048 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1049 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1050 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1051 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1052 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1053 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +00001054 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +00001055 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +00001056 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +00001057 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1058 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1059 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1060 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +00001061 "vrsave", "vscr",
1062 "spe_acc", "spefscr",
1063 "sfp"
1064};
Reid Spencer5f016e22007-07-11 17:01:13 +00001065
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001066void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +00001067 unsigned &NumNames) const {
1068 Names = GCCRegNames;
1069 NumNames = llvm::array_lengthof(GCCRegNames);
1070}
Reid Spencer5f016e22007-07-11 17:01:13 +00001071
Eli Friedmane4277982008-08-20 23:11:40 +00001072const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1073 // While some of these aliases do map to different registers
1074 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001075 { { "0" }, "r0" },
1076 { { "1"}, "r1" },
1077 { { "2" }, "r2" },
1078 { { "3" }, "r3" },
1079 { { "4" }, "r4" },
1080 { { "5" }, "r5" },
1081 { { "6" }, "r6" },
1082 { { "7" }, "r7" },
1083 { { "8" }, "r8" },
1084 { { "9" }, "r9" },
1085 { { "10" }, "r10" },
1086 { { "11" }, "r11" },
1087 { { "12" }, "r12" },
1088 { { "13" }, "r13" },
1089 { { "14" }, "r14" },
1090 { { "15" }, "r15" },
1091 { { "16" }, "r16" },
1092 { { "17" }, "r17" },
1093 { { "18" }, "r18" },
1094 { { "19" }, "r19" },
1095 { { "20" }, "r20" },
1096 { { "21" }, "r21" },
1097 { { "22" }, "r22" },
1098 { { "23" }, "r23" },
1099 { { "24" }, "r24" },
1100 { { "25" }, "r25" },
1101 { { "26" }, "r26" },
1102 { { "27" }, "r27" },
1103 { { "28" }, "r28" },
1104 { { "29" }, "r29" },
1105 { { "30" }, "r30" },
1106 { { "31" }, "r31" },
1107 { { "fr0" }, "f0" },
1108 { { "fr1" }, "f1" },
1109 { { "fr2" }, "f2" },
1110 { { "fr3" }, "f3" },
1111 { { "fr4" }, "f4" },
1112 { { "fr5" }, "f5" },
1113 { { "fr6" }, "f6" },
1114 { { "fr7" }, "f7" },
1115 { { "fr8" }, "f8" },
1116 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +00001117 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001118 { { "fr11" }, "f11" },
1119 { { "fr12" }, "f12" },
1120 { { "fr13" }, "f13" },
1121 { { "fr14" }, "f14" },
1122 { { "fr15" }, "f15" },
1123 { { "fr16" }, "f16" },
1124 { { "fr17" }, "f17" },
1125 { { "fr18" }, "f18" },
1126 { { "fr19" }, "f19" },
1127 { { "fr20" }, "f20" },
1128 { { "fr21" }, "f21" },
1129 { { "fr22" }, "f22" },
1130 { { "fr23" }, "f23" },
1131 { { "fr24" }, "f24" },
1132 { { "fr25" }, "f25" },
1133 { { "fr26" }, "f26" },
1134 { { "fr27" }, "f27" },
1135 { { "fr28" }, "f28" },
1136 { { "fr29" }, "f29" },
1137 { { "fr30" }, "f30" },
1138 { { "fr31" }, "f31" },
1139 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +00001140};
1141
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001142void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +00001143 unsigned &NumAliases) const {
1144 Aliases = GCCRegAliases;
1145 NumAliases = llvm::array_lengthof(GCCRegAliases);
1146}
1147} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00001148
1149namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001150class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001151public:
Chris Lattnere03ae302010-02-16 18:14:57 +00001152 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001153 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001154 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +00001155
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001156 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +00001157 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001158 case llvm::Triple::FreeBSD:
1159 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001160 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +00001161 PtrDiffType = SignedInt;
1162 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001163 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +00001164 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001165 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001166 }
Roman Divackye3d175d2012-03-13 16:53:54 +00001167
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001168 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1169 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001170 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001171 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001172
1173 // PPC32 supports atomics up to 4 bytes.
1174 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001175 }
1176
Meador Ingec5613b22012-06-16 03:34:49 +00001177 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001178 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Ingec5613b22012-06-16 03:34:49 +00001179 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001180 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001181};
1182} // end anonymous namespace.
1183
1184namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001185class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001186public:
Eli Friedmane4277982008-08-20 23:11:40 +00001187 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001188 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001189 IntMaxType = SignedLong;
1190 UIntMaxType = UnsignedLong;
1191 Int64Type = SignedLong;
Roman Divackye3d175d2012-03-13 16:53:54 +00001192
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001193 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1194 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001195 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001196 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1197 "i64:64:64-f32:32:32-f64:64:64-f128:64:64-"
1198 "v128:128:128-n32:64";
1199 } else
1200 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1201 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
1202 "v128:128:128-n32:64";
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001203
1204 // PPC64 supports atomics up to 8 bytes.
1205 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerf291b102008-05-09 06:17:04 +00001206 }
Meador Ingec5613b22012-06-16 03:34:49 +00001207 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1208 return TargetInfo::CharPtrBuiltinVaList;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001209 }
Eli Friedmane4277982008-08-20 23:11:40 +00001210};
1211} // end anonymous namespace.
1212
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001213
1214namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001215class DarwinPPC32TargetInfo :
1216 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001217public:
Roman Divackyc81f2a22011-01-06 08:27:10 +00001218 DarwinPPC32TargetInfo(const std::string& triple)
1219 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001220 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001221 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001222 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001223 SuitableAlign = 128;
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001224 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1225 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +00001226 }
Meador Ingec5613b22012-06-16 03:34:49 +00001227 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1228 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001229 }
1230};
1231
1232class DarwinPPC64TargetInfo :
1233 public DarwinTargetInfo<PPC64TargetInfo> {
1234public:
1235 DarwinPPC64TargetInfo(const std::string& triple)
1236 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
1237 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001238 SuitableAlign = 128;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001239 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1240 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001241 }
1242};
1243} // end anonymous namespace.
1244
Reid Spencer5f016e22007-07-11 17:01:13 +00001245namespace {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001246 static const unsigned NVPTXAddrSpaceMap[] = {
1247 1, // opencl_global
1248 3, // opencl_local
1249 4, // opencl_constant
1250 1, // cuda_device
1251 4, // cuda_constant
1252 3, // cuda_shared
1253 };
1254 class NVPTXTargetInfo : public TargetInfo {
1255 static const char * const GCCRegNames[];
Justin Holewinski2c585b92012-05-24 17:43:12 +00001256 static const Builtin::Info BuiltinInfo[];
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00001257 std::vector<StringRef> AvailableFeatures;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001258 public:
1259 NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
1260 BigEndian = false;
1261 TLSSupported = false;
1262 LongWidth = LongAlign = 64;
1263 AddrSpaceMap = &NVPTXAddrSpaceMap;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001264 // Define available target features
1265 // These must be defined in sorted order!
Justin Holewinski9903e942012-07-11 15:34:55 +00001266 NoAsmVariants = true;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001267 }
1268 virtual void getTargetDefines(const LangOptions &Opts,
1269 MacroBuilder &Builder) const {
1270 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001271 Builder.defineMacro("__NVPTX__");
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001272 }
1273 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1274 unsigned &NumRecords) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001275 Records = BuiltinInfo;
1276 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001277 }
1278 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001279 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001280 }
1281
1282 virtual void getGCCRegNames(const char * const *&Names,
1283 unsigned &NumNames) const;
1284 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1285 unsigned &NumAliases) const {
1286 // No aliases.
1287 Aliases = 0;
1288 NumAliases = 0;
1289 }
1290 virtual bool validateAsmConstraint(const char *&Name,
1291 TargetInfo::ConstraintInfo &info) const {
1292 // FIXME: implement
1293 return true;
1294 }
1295 virtual const char *getClobbers() const {
1296 // FIXME: Is this really right?
1297 return "";
1298 }
Meador Ingec5613b22012-06-16 03:34:49 +00001299 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001300 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00001301 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001302 }
1303 virtual bool setCPU(const std::string &Name) {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001304 return Name == "sm_10" || Name == "sm_13" || Name == "sm_20";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001305 }
Justin Holewinski2c585b92012-05-24 17:43:12 +00001306 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1307 StringRef Name,
1308 bool Enabled) const;
1309 };
1310
1311 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1312#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1313#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1314 ALL_LANGUAGES },
1315#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001316 };
1317
1318 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1319 "r0"
1320 };
1321
1322 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1323 unsigned &NumNames) const {
1324 Names = GCCRegNames;
1325 NumNames = llvm::array_lengthof(GCCRegNames);
1326 }
1327
Justin Holewinski2c585b92012-05-24 17:43:12 +00001328 bool NVPTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1329 StringRef Name,
1330 bool Enabled) const {
1331 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1332 Name)) {
1333 Features[Name] = Enabled;
1334 return true;
1335 } else {
1336 return false;
1337 }
1338 }
1339
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001340 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1341 public:
Justin Holewinski2c585b92012-05-24 17:43:12 +00001342 NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001343 PointerWidth = PointerAlign = 32;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001344 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001345 DescriptionString
1346 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1347 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1348 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001349 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001350 };
1351
1352 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1353 public:
Justin Holewinski2c585b92012-05-24 17:43:12 +00001354 NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001355 PointerWidth = PointerAlign = 64;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001356 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001357 DescriptionString
1358 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1359 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1360 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001361 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001362 };
1363}
1364
1365namespace {
Eli Friedman6505a292012-10-12 23:32:00 +00001366
1367static const unsigned R600AddrSpaceMap[] = {
1368 1, // opencl_global
1369 3, // opencl_local
1370 2, // opencl_constant
1371 1, // cuda_device
1372 2, // cuda_constant
1373 3 // cuda_shared
1374};
1375
Tom Stellardfd075912013-03-04 17:40:53 +00001376static const char *DescriptionStringR600 =
1377 "e"
1378 "-p:32:32:32"
1379 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32"
1380 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1381 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1382 "-n32:64";
1383
1384static const char *DescriptionStringR600DoubleOps =
1385 "e"
1386 "-p:32:32:32"
1387 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1388 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1389 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1390 "-n32:64";
1391
1392static const char *DescriptionStringSI =
1393 "e"
1394 "-p:64:64:64"
1395 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1396 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1397 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1398 "-n32:64";
1399
Eli Friedman6505a292012-10-12 23:32:00 +00001400class R600TargetInfo : public TargetInfo {
Tom Stellardfd075912013-03-04 17:40:53 +00001401 /// \brief The GPU profiles supported by the R600 target.
1402 enum GPUKind {
1403 GK_NONE,
1404 GK_R600,
1405 GK_R600_DOUBLE_OPS,
1406 GK_R700,
1407 GK_R700_DOUBLE_OPS,
1408 GK_EVERGREEN,
1409 GK_EVERGREEN_DOUBLE_OPS,
1410 GK_NORTHERN_ISLANDS,
1411 GK_CAYMAN,
1412 GK_SOUTHERN_ISLANDS
1413 } GPU;
1414
Eli Friedman6505a292012-10-12 23:32:00 +00001415public:
Tom Stellardfd075912013-03-04 17:40:53 +00001416 R600TargetInfo(const std::string& triple)
1417 : TargetInfo(triple),
1418 GPU(GK_R600) {
1419 DescriptionString = DescriptionStringR600;
Eli Friedman6505a292012-10-12 23:32:00 +00001420 AddrSpaceMap = &R600AddrSpaceMap;
1421 }
1422
1423 virtual const char * getClobbers() const {
1424 return "";
1425 }
1426
1427 virtual void getGCCRegNames(const char * const *&Names,
1428 unsigned &numNames) const {
1429 Names = NULL;
1430 numNames = 0;
1431 }
1432
1433 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1434 unsigned &NumAliases) const {
1435 Aliases = NULL;
1436 NumAliases = 0;
1437 }
1438
1439 virtual bool validateAsmConstraint(const char *&Name,
1440 TargetInfo::ConstraintInfo &info) const {
1441 return true;
1442 }
1443
1444 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1445 unsigned &NumRecords) const {
1446 Records = NULL;
1447 NumRecords = 0;
1448 }
1449
1450
1451 virtual void getTargetDefines(const LangOptions &Opts,
1452 MacroBuilder &Builder) const {
1453 Builder.defineMacro("__R600__");
1454 }
1455
1456 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1457 return TargetInfo::CharPtrBuiltinVaList;
1458 }
1459
Tom Stellardfd075912013-03-04 17:40:53 +00001460 virtual bool setCPU(const std::string &Name) {
1461 GPU = llvm::StringSwitch<GPUKind>(Name)
1462 .Case("r600" , GK_R600)
1463 .Case("rv610", GK_R600)
1464 .Case("rv620", GK_R600)
1465 .Case("rv630", GK_R600)
1466 .Case("rv635", GK_R600)
1467 .Case("rs780", GK_R600)
1468 .Case("rs880", GK_R600)
1469 .Case("rv670", GK_R600_DOUBLE_OPS)
1470 .Case("rv710", GK_R700)
1471 .Case("rv730", GK_R700)
1472 .Case("rv740", GK_R700_DOUBLE_OPS)
1473 .Case("rv770", GK_R700_DOUBLE_OPS)
1474 .Case("palm", GK_EVERGREEN)
1475 .Case("cedar", GK_EVERGREEN)
1476 .Case("sumo", GK_EVERGREEN)
1477 .Case("sumo2", GK_EVERGREEN)
1478 .Case("redwood", GK_EVERGREEN)
1479 .Case("juniper", GK_EVERGREEN)
1480 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1481 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1482 .Case("barts", GK_NORTHERN_ISLANDS)
1483 .Case("turks", GK_NORTHERN_ISLANDS)
1484 .Case("caicos", GK_NORTHERN_ISLANDS)
1485 .Case("cayman", GK_CAYMAN)
1486 .Case("aruba", GK_CAYMAN)
1487 .Case("SI", GK_SOUTHERN_ISLANDS)
1488 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1489 .Case("verde", GK_SOUTHERN_ISLANDS)
1490 .Case("oland", GK_SOUTHERN_ISLANDS)
1491 .Default(GK_NONE);
1492
1493 if (GPU == GK_NONE) {
1494 return false;
1495 }
1496
1497 // Set the correct data layout
1498 switch (GPU) {
1499 case GK_NONE:
1500 case GK_R600:
1501 case GK_R700:
1502 case GK_EVERGREEN:
1503 case GK_NORTHERN_ISLANDS:
1504 DescriptionString = DescriptionStringR600;
1505 break;
1506 case GK_R600_DOUBLE_OPS:
1507 case GK_R700_DOUBLE_OPS:
1508 case GK_EVERGREEN_DOUBLE_OPS:
1509 case GK_CAYMAN:
1510 DescriptionString = DescriptionStringR600DoubleOps;
1511 break;
1512 case GK_SOUTHERN_ISLANDS:
1513 DescriptionString = DescriptionStringSI;
1514 break;
1515 }
1516
1517 return true;
1518 }
Eli Friedman6505a292012-10-12 23:32:00 +00001519};
1520
1521} // end anonymous namespace
1522
1523namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +00001524// MBlaze abstract base class
1525class MBlazeTargetInfo : public TargetInfo {
1526 static const char * const GCCRegNames[];
1527 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1528
1529public:
1530 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +00001531 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +00001532 }
1533
1534 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1535 unsigned &NumRecords) const {
1536 // FIXME: Implement.
1537 Records = 0;
1538 NumRecords = 0;
1539 }
1540
1541 virtual void getTargetDefines(const LangOptions &Opts,
1542 MacroBuilder &Builder) const;
1543
Douglas Gregore727d212012-01-30 06:38:25 +00001544 virtual bool hasFeature(StringRef Feature) const {
1545 return Feature == "mblaze";
1546 }
1547
Meador Ingec5613b22012-06-16 03:34:49 +00001548 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1549 return TargetInfo::CharPtrBuiltinVaList;
Chris Lattner9cbeb632010-03-06 21:21:27 +00001550 }
1551 virtual const char *getTargetPrefix() const {
1552 return "mblaze";
1553 }
1554 virtual void getGCCRegNames(const char * const *&Names,
1555 unsigned &NumNames) const;
1556 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1557 unsigned &NumAliases) const;
1558 virtual bool validateAsmConstraint(const char *&Name,
1559 TargetInfo::ConstraintInfo &Info) const {
1560 switch (*Name) {
1561 default: return false;
1562 case 'O': // Zero
1563 return true;
1564 case 'b': // Base register
1565 case 'f': // Floating point register
1566 Info.setAllowsRegister();
1567 return true;
1568 }
1569 }
1570 virtual const char *getClobbers() const {
1571 return "";
1572 }
1573};
1574
1575/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1576/// #defines that are not tied to a specific subtarget.
1577void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1578 MacroBuilder &Builder) const {
1579 // Target identification.
1580 Builder.defineMacro("__microblaze__");
1581 Builder.defineMacro("_ARCH_MICROBLAZE");
1582 Builder.defineMacro("__MICROBLAZE__");
1583
1584 // Target properties.
1585 Builder.defineMacro("_BIG_ENDIAN");
1586 Builder.defineMacro("__BIG_ENDIAN__");
1587
1588 // Subtarget options.
1589 Builder.defineMacro("__REGISTER_PREFIX__", "");
1590}
1591
1592
1593const char * const MBlazeTargetInfo::GCCRegNames[] = {
1594 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1595 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1596 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1597 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1598 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1599 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1600 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1601 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1602 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1603 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1604};
1605
1606void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1607 unsigned &NumNames) const {
1608 Names = GCCRegNames;
1609 NumNames = llvm::array_lengthof(GCCRegNames);
1610}
1611
1612const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1613 { {"f0"}, "r0" },
1614 { {"f1"}, "r1" },
1615 { {"f2"}, "r2" },
1616 { {"f3"}, "r3" },
1617 { {"f4"}, "r4" },
1618 { {"f5"}, "r5" },
1619 { {"f6"}, "r6" },
1620 { {"f7"}, "r7" },
1621 { {"f8"}, "r8" },
1622 { {"f9"}, "r9" },
1623 { {"f10"}, "r10" },
1624 { {"f11"}, "r11" },
1625 { {"f12"}, "r12" },
1626 { {"f13"}, "r13" },
1627 { {"f14"}, "r14" },
1628 { {"f15"}, "r15" },
1629 { {"f16"}, "r16" },
1630 { {"f17"}, "r17" },
1631 { {"f18"}, "r18" },
1632 { {"f19"}, "r19" },
1633 { {"f20"}, "r20" },
1634 { {"f21"}, "r21" },
1635 { {"f22"}, "r22" },
1636 { {"f23"}, "r23" },
1637 { {"f24"}, "r24" },
1638 { {"f25"}, "r25" },
1639 { {"f26"}, "r26" },
1640 { {"f27"}, "r27" },
1641 { {"f28"}, "r28" },
1642 { {"f29"}, "r29" },
1643 { {"f30"}, "r30" },
1644 { {"f31"}, "r31" },
1645};
1646
1647void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1648 unsigned &NumAliases) const {
1649 Aliases = GCCRegAliases;
1650 NumAliases = llvm::array_lengthof(GCCRegAliases);
1651}
1652} // end anonymous namespace.
1653
1654namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001655// Namespace for x86 abstract base class
1656const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001657#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001658#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001659 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001660#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001661};
Eli Friedman61538a72008-05-20 14:21:01 +00001662
Nuno Lopes2550d702009-12-23 17:49:57 +00001663static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001664 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1665 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001666 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001667 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1668 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1669 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001670 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001671 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1672 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001673};
1674
Eric Christophercfd323d2011-06-21 00:05:20 +00001675const TargetInfo::AddlRegName AddlRegNames[] = {
1676 { { "al", "ah", "eax", "rax" }, 0 },
1677 { { "bl", "bh", "ebx", "rbx" }, 3 },
1678 { { "cl", "ch", "ecx", "rcx" }, 2 },
1679 { { "dl", "dh", "edx", "rdx" }, 1 },
1680 { { "esi", "rsi" }, 4 },
1681 { { "edi", "rdi" }, 5 },
1682 { { "esp", "rsp" }, 7 },
1683 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001684};
1685
1686// X86 target abstract base class; x86-32 and x86-64 are very close, so
1687// most of the implementation can be shared.
1688class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001689 enum X86SSEEnum {
Craig Topper05fe4b52012-01-09 09:19:09 +00001690 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner84f0ea82009-03-02 22:40:39 +00001691 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001692 enum MMX3DNowEnum {
1693 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1694 } MMX3DNowLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001695
Eric Christophereea12d12010-04-02 23:50:19 +00001696 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001697 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001698 bool HasLZCNT;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001699 bool HasRDRND;
Craig Topper31ceea02011-12-25 05:06:45 +00001700 bool HasBMI;
1701 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001702 bool HasPOPCNT;
Michael Liao463eb892012-11-10 05:17:46 +00001703 bool HasRTM;
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00001704 bool HasSSE4a;
Craig Topper6a511e12011-12-30 07:33:42 +00001705 bool HasFMA4;
Craig Topper2ae95072012-06-03 21:46:30 +00001706 bool HasFMA;
Craig Topperb6af69e2012-06-09 22:24:14 +00001707 bool HasXOP;
Manman Ren146e5a42012-10-11 00:59:55 +00001708 bool HasF16C;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001709
Chandler Carruth499d9722011-09-28 08:55:34 +00001710 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1711 ///
1712 /// Each enumeration represents a particular CPU supported by Clang. These
1713 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1714 enum CPUKind {
1715 CK_Generic,
1716
1717 /// \name i386
1718 /// i386-generation processors.
1719 //@{
1720 CK_i386,
1721 //@}
1722
1723 /// \name i486
1724 /// i486-generation processors.
1725 //@{
1726 CK_i486,
1727 CK_WinChipC6,
1728 CK_WinChip2,
1729 CK_C3,
1730 //@}
1731
1732 /// \name i586
1733 /// i586-generation processors, P5 microarchitecture based.
1734 //@{
1735 CK_i586,
1736 CK_Pentium,
1737 CK_PentiumMMX,
1738 //@}
1739
1740 /// \name i686
1741 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1742 //@{
1743 CK_i686,
1744 CK_PentiumPro,
1745 CK_Pentium2,
1746 CK_Pentium3,
1747 CK_Pentium3M,
1748 CK_PentiumM,
1749 CK_C3_2,
1750
1751 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1752 /// Clang however has some logic to suport this.
1753 // FIXME: Warn, deprecate, and potentially remove this.
1754 CK_Yonah,
1755 //@}
1756
1757 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001758 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001759 //@{
1760 CK_Pentium4,
1761 CK_Pentium4M,
1762 CK_Prescott,
1763 CK_Nocona,
1764 //@}
1765
1766 /// \name Core
1767 /// Core microarchitecture based processors.
1768 //@{
1769 CK_Core2,
1770
1771 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1772 /// codename which GCC no longer accepts as an option to -march, but Clang
1773 /// has some logic for recognizing it.
1774 // FIXME: Warn, deprecate, and potentially remove this.
1775 CK_Penryn,
1776 //@}
1777
1778 /// \name Atom
1779 /// Atom processors
1780 //@{
1781 CK_Atom,
1782 //@}
1783
1784 /// \name Nehalem
1785 /// Nehalem microarchitecture based processors.
1786 //@{
1787 CK_Corei7,
1788 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001789 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001790 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001791 //@}
1792
1793 /// \name K6
1794 /// K6 architecture processors.
1795 //@{
1796 CK_K6,
1797 CK_K6_2,
1798 CK_K6_3,
1799 //@}
1800
1801 /// \name K7
1802 /// K7 architecture processors.
1803 //@{
1804 CK_Athlon,
1805 CK_AthlonThunderbird,
1806 CK_Athlon4,
1807 CK_AthlonXP,
1808 CK_AthlonMP,
1809 //@}
1810
1811 /// \name K8
1812 /// K8 architecture processors.
1813 //@{
1814 CK_Athlon64,
1815 CK_Athlon64SSE3,
1816 CK_AthlonFX,
1817 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001818 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001819 CK_Opteron,
1820 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001821 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001822 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001823
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001824 /// \name Bobcat
1825 /// Bobcat architecture processors.
1826 //@{
1827 CK_BTVER1,
1828 //@}
1829
1830 /// \name Bulldozer
1831 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001832 //@{
1833 CK_BDVER1,
1834 CK_BDVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001835 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001836
Chandler Carruth499d9722011-09-28 08:55:34 +00001837 /// This specification is deprecated and will be removed in the future.
1838 /// Users should prefer \see CK_K8.
1839 // FIXME: Warn on this when the CPU is set to it.
1840 CK_x86_64,
1841 //@}
1842
1843 /// \name Geode
1844 /// Geode processors.
1845 //@{
1846 CK_Geode
1847 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001848 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001849
Eli Friedman618234a2008-08-20 02:34:37 +00001850public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001851 X86TargetInfo(const std::string& triple)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001852 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Benjamin Kramer84f30802012-07-07 09:39:18 +00001853 HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false),
Michael Liao463eb892012-11-10 05:17:46 +00001854 HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasRTM(false),
1855 HasSSE4a(false), HasFMA4(false), HasFMA(false), HasXOP(false),
1856 HasF16C(false), CPU(CK_Generic) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001857 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001858 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001859 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001860 virtual unsigned getFloatEvalMethod() const {
1861 // X87 evaluates with 80 bits "long double" precision.
1862 return SSELevel == NoSSE ? 2 : 0;
1863 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001864 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1865 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001866 Records = BuiltinInfo;
1867 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001868 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001869 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001870 unsigned &NumNames) const {
1871 Names = GCCRegNames;
1872 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001873 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001874 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001875 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001876 Aliases = 0;
1877 NumAliases = 0;
1878 }
1879 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopher825d3862012-11-14 22:08:59 +00001880 unsigned &NumNames) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001881 Names = AddlRegNames;
1882 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001883 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001884 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001885 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001886 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001887 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001888 return "~{dirflag},~{fpsr},~{flags}";
1889 }
Chris Lattner33328642009-03-20 15:52:06 +00001890 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001891 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001892 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00001893 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001894 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001895 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregore727d212012-01-30 06:38:25 +00001896 virtual bool hasFeature(StringRef Feature) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001897 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001898 virtual const char* getABI() const {
Derek Schuffbabaf312012-10-11 15:52:22 +00001899 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001900 return "avx";
Derek Schuffbabaf312012-10-11 15:52:22 +00001901 else if (getTriple().getArch() == llvm::Triple::x86 &&
1902 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001903 return "no-mmx";
1904 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001905 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001906 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001907 CPU = llvm::StringSwitch<CPUKind>(Name)
1908 .Case("i386", CK_i386)
1909 .Case("i486", CK_i486)
1910 .Case("winchip-c6", CK_WinChipC6)
1911 .Case("winchip2", CK_WinChip2)
1912 .Case("c3", CK_C3)
1913 .Case("i586", CK_i586)
1914 .Case("pentium", CK_Pentium)
1915 .Case("pentium-mmx", CK_PentiumMMX)
1916 .Case("i686", CK_i686)
1917 .Case("pentiumpro", CK_PentiumPro)
1918 .Case("pentium2", CK_Pentium2)
1919 .Case("pentium3", CK_Pentium3)
1920 .Case("pentium3m", CK_Pentium3M)
1921 .Case("pentium-m", CK_PentiumM)
1922 .Case("c3-2", CK_C3_2)
1923 .Case("yonah", CK_Yonah)
1924 .Case("pentium4", CK_Pentium4)
1925 .Case("pentium4m", CK_Pentium4M)
1926 .Case("prescott", CK_Prescott)
1927 .Case("nocona", CK_Nocona)
1928 .Case("core2", CK_Core2)
1929 .Case("penryn", CK_Penryn)
1930 .Case("atom", CK_Atom)
1931 .Case("corei7", CK_Corei7)
1932 .Case("corei7-avx", CK_Corei7AVX)
1933 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001934 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001935 .Case("k6", CK_K6)
1936 .Case("k6-2", CK_K6_2)
1937 .Case("k6-3", CK_K6_3)
1938 .Case("athlon", CK_Athlon)
1939 .Case("athlon-tbird", CK_AthlonThunderbird)
1940 .Case("athlon-4", CK_Athlon4)
1941 .Case("athlon-xp", CK_AthlonXP)
1942 .Case("athlon-mp", CK_AthlonMP)
1943 .Case("athlon64", CK_Athlon64)
1944 .Case("athlon64-sse3", CK_Athlon64SSE3)
1945 .Case("athlon-fx", CK_AthlonFX)
1946 .Case("k8", CK_K8)
1947 .Case("k8-sse3", CK_K8SSE3)
1948 .Case("opteron", CK_Opteron)
1949 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001950 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001951 .Case("btver1", CK_BTVER1)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001952 .Case("bdver1", CK_BDVER1)
1953 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001954 .Case("x86-64", CK_x86_64)
1955 .Case("geode", CK_Geode)
1956 .Default(CK_Generic);
1957
Chandler Carruth26a39142011-09-28 09:45:08 +00001958 // Perform any per-CPU checks necessary to determine if this CPU is
1959 // acceptable.
1960 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1961 // invalid without explaining *why*.
1962 switch (CPU) {
1963 case CK_Generic:
1964 // No processor selected!
1965 return false;
1966
1967 case CK_i386:
1968 case CK_i486:
1969 case CK_WinChipC6:
1970 case CK_WinChip2:
1971 case CK_C3:
1972 case CK_i586:
1973 case CK_Pentium:
1974 case CK_PentiumMMX:
1975 case CK_i686:
1976 case CK_PentiumPro:
1977 case CK_Pentium2:
1978 case CK_Pentium3:
1979 case CK_Pentium3M:
1980 case CK_PentiumM:
1981 case CK_Yonah:
1982 case CK_C3_2:
1983 case CK_Pentium4:
1984 case CK_Pentium4M:
1985 case CK_Prescott:
1986 case CK_K6:
1987 case CK_K6_2:
1988 case CK_K6_3:
1989 case CK_Athlon:
1990 case CK_AthlonThunderbird:
1991 case CK_Athlon4:
1992 case CK_AthlonXP:
1993 case CK_AthlonMP:
1994 case CK_Geode:
1995 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffbabaf312012-10-11 15:52:22 +00001996 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth26a39142011-09-28 09:45:08 +00001997 return false;
1998
1999 // Fallthrough
2000 case CK_Nocona:
2001 case CK_Core2:
2002 case CK_Penryn:
2003 case CK_Atom:
2004 case CK_Corei7:
2005 case CK_Corei7AVX:
2006 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002007 case CK_CoreAVX2:
Chandler Carruth26a39142011-09-28 09:45:08 +00002008 case CK_Athlon64:
2009 case CK_Athlon64SSE3:
2010 case CK_AthlonFX:
2011 case CK_K8:
2012 case CK_K8SSE3:
2013 case CK_Opteron:
2014 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00002015 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002016 case CK_BTVER1:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002017 case CK_BDVER1:
2018 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00002019 case CK_x86_64:
2020 return true;
2021 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00002022 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002023 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00002024
2025 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
2026 // We accept all non-ARM calling conventions
2027 return (CC == CC_X86ThisCall ||
2028 CC == CC_X86FastCall ||
Peter Collingbourne7728cdd2013-02-23 00:06:18 +00002029 CC == CC_X86StdCall ||
2030 CC == CC_C ||
Guy Benyei38980082012-12-25 08:53:55 +00002031 CC == CC_X86Pascal ||
2032 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002033 }
2034
Aaron Ballmanfff32482012-12-09 17:45:41 +00002035 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
2036 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002037 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002038};
Chris Lattner3daed522009-03-02 22:20:04 +00002039
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002040void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002041 // FIXME: This should not be here.
2042 Features["3dnow"] = false;
2043 Features["3dnowa"] = false;
2044 Features["mmx"] = false;
2045 Features["sse"] = false;
2046 Features["sse2"] = false;
2047 Features["sse3"] = false;
2048 Features["ssse3"] = false;
2049 Features["sse41"] = false;
2050 Features["sse42"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00002051 Features["sse4a"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00002052 Features["aes"] = false;
Craig Topper3c0bc152012-05-31 05:18:48 +00002053 Features["pclmul"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00002054 Features["avx"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00002055 Features["avx2"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002056 Features["lzcnt"] = false;
Benjamin Kramer84f30802012-07-07 09:39:18 +00002057 Features["rdrand"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002058 Features["bmi"] = false;
2059 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00002060 Features["popcnt"] = false;
Michael Liao463eb892012-11-10 05:17:46 +00002061 Features["rtm"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00002062 Features["fma4"] = false;
Craig Topper2ae95072012-06-03 21:46:30 +00002063 Features["fma"] = false;
Craig Topperb6af69e2012-06-09 22:24:14 +00002064 Features["xop"] = false;
Manman Ren146e5a42012-10-11 00:59:55 +00002065 Features["f16c"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002066
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002067 // FIXME: This *really* should not be here.
2068
2069 // X86_64 always has SSE2.
Derek Schuffbabaf312012-10-11 15:52:22 +00002070 if (getTriple().getArch() == llvm::Triple::x86_64)
Eli Friedman612db2a2012-11-17 01:16:19 +00002071 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002072
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002073 switch (CPU) {
2074 case CK_Generic:
2075 case CK_i386:
2076 case CK_i486:
2077 case CK_i586:
2078 case CK_Pentium:
2079 case CK_i686:
2080 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002081 break;
2082 case CK_PentiumMMX:
2083 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002084 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002085 break;
2086 case CK_Pentium3:
2087 case CK_Pentium3M:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002088 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002089 break;
2090 case CK_PentiumM:
2091 case CK_Pentium4:
2092 case CK_Pentium4M:
2093 case CK_x86_64:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002094 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002095 break;
2096 case CK_Yonah:
2097 case CK_Prescott:
2098 case CK_Nocona:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002099 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002100 break;
2101 case CK_Core2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002102 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002103 break;
2104 case CK_Penryn:
Benjamin Kramerb3453a82012-01-04 14:36:57 +00002105 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002106 break;
2107 case CK_Atom:
Chandler Carruth49defe62011-09-28 10:36:46 +00002108 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002109 break;
2110 case CK_Corei7:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002111 setFeatureEnabled(Features, "sse4", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002112 break;
2113 case CK_Corei7AVX:
Benjamin Kramer84f30802012-07-07 09:39:18 +00002114 setFeatureEnabled(Features, "avx", true);
2115 setFeatureEnabled(Features, "aes", true);
2116 setFeatureEnabled(Features, "pclmul", true);
2117 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002118 case CK_CoreAVXi:
Craig Topperfd936302012-04-26 07:31:30 +00002119 setFeatureEnabled(Features, "avx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00002120 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002121 setFeatureEnabled(Features, "pclmul", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002122 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002123 setFeatureEnabled(Features, "f16c", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002124 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00002125 case CK_CoreAVX2:
Craig Topperfd936302012-04-26 07:31:30 +00002126 setFeatureEnabled(Features, "avx2", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002127 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002128 setFeatureEnabled(Features, "pclmul", true);
Craig Topper31ceea02011-12-25 05:06:45 +00002129 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002130 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002131 setFeatureEnabled(Features, "f16c", true);
Craig Topper31ceea02011-12-25 05:06:45 +00002132 setFeatureEnabled(Features, "bmi", true);
2133 setFeatureEnabled(Features, "bmi2", true);
Michael Liao463eb892012-11-10 05:17:46 +00002134 setFeatureEnabled(Features, "rtm", true);
Craig Topper2ae95072012-06-03 21:46:30 +00002135 setFeatureEnabled(Features, "fma", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002136 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002137 case CK_K6:
2138 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002139 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002140 break;
2141 case CK_K6_2:
2142 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002143 case CK_WinChip2:
2144 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002145 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002146 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00002147 case CK_Athlon:
2148 case CK_AthlonThunderbird:
2149 case CK_Geode:
2150 setFeatureEnabled(Features, "3dnowa", true);
2151 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002152 case CK_Athlon4:
2153 case CK_AthlonXP:
2154 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002155 setFeatureEnabled(Features, "sse", true);
2156 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002157 break;
2158 case CK_K8:
2159 case CK_Opteron:
2160 case CK_Athlon64:
2161 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00002162 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002163 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002164 break;
2165 case CK_K8SSE3:
2166 case CK_OpteronSSE3:
2167 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00002168 setFeatureEnabled(Features, "sse3", true);
2169 setFeatureEnabled(Features, "3dnowa", true);
2170 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002171 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00002172 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00002173 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00002174 setFeatureEnabled(Features, "3dnowa", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002175 setFeatureEnabled(Features, "lzcnt", true);
2176 setFeatureEnabled(Features, "popcnt", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002177 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002178 case CK_BTVER1:
2179 setFeatureEnabled(Features, "ssse3", true);
2180 setFeatureEnabled(Features, "sse4a", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002181 setFeatureEnabled(Features, "lzcnt", true);
2182 setFeatureEnabled(Features, "popcnt", true);
Craig Topper90ea0362012-05-30 05:54:54 +00002183 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002184 case CK_BDVER1:
Craig Topperb6af69e2012-06-09 22:24:14 +00002185 setFeatureEnabled(Features, "xop", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002186 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002187 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002188 setFeatureEnabled(Features, "pclmul", true);
Eli Friedmanf5824992012-11-26 21:57:28 +00002189 break;
Eli Friedmanfaf35382012-11-17 01:43:10 +00002190 case CK_BDVER2:
2191 setFeatureEnabled(Features, "xop", true);
2192 setFeatureEnabled(Features, "lzcnt", true);
2193 setFeatureEnabled(Features, "aes", true);
2194 setFeatureEnabled(Features, "pclmul", true);
2195 setFeatureEnabled(Features, "bmi", true);
2196 setFeatureEnabled(Features, "fma", true);
2197 setFeatureEnabled(Features, "f16c", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002198 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002199 case CK_C3_2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002200 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002201 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002202 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002203}
2204
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002205bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00002206 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002207 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00002208 // FIXME: This *really* should not be here. We need some way of translating
2209 // options into llvm subtarget features.
2210 if (!Features.count(Name) &&
Benjamin Kramer84f30802012-07-07 09:39:18 +00002211 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1" &&
2212 Name != "rdrnd"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002213 return false;
2214
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002215 // FIXME: this should probably use a switch with fall through.
2216
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002217 if (Enabled) {
2218 if (Name == "mmx")
2219 Features["mmx"] = true;
2220 else if (Name == "sse")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002221 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002222 else if (Name == "sse2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002223 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002224 else if (Name == "sse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002225 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2226 true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002227 else if (Name == "ssse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002228 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002229 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00002230 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002231 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00002232 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2233 Features["popcnt"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00002234 else if (Name == "sse4.1")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002235 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00002236 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002237 else if (Name == "3dnow")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002238 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002239 else if (Name == "3dnowa")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002240 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00002241 else if (Name == "aes")
Craig Toppera7463c32012-06-03 21:56:22 +00002242 Features["sse"] = Features["sse2"] = Features["aes"] = true;
Craig Topper3c0bc152012-05-31 05:18:48 +00002243 else if (Name == "pclmul")
Craig Toppera7463c32012-06-03 21:56:22 +00002244 Features["sse"] = Features["sse2"] = Features["pclmul"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00002245 else if (Name == "avx")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002246 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2247 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00002248 Features["popcnt"] = Features["avx"] = true;
Craig Topper2b03bb02011-12-17 19:55:21 +00002249 else if (Name == "avx2")
2250 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2251 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00002252 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topper2ae95072012-06-03 21:46:30 +00002253 else if (Name == "fma")
2254 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2255 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2256 Features["popcnt"] = Features["avx"] = Features["fma"] = true;
Craig Topper6a511e12011-12-30 07:33:42 +00002257 else if (Name == "fma4")
Eli Friedman612db2a2012-11-17 01:16:19 +00002258 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00002259 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper90ea0362012-05-30 05:54:54 +00002260 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
2261 Features["fma4"] = true;
Craig Topperb6af69e2012-06-09 22:24:14 +00002262 else if (Name == "xop")
Eli Friedman612db2a2012-11-17 01:16:19 +00002263 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002264 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2265 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
2266 Features["fma4"] = Features["xop"] = true;
Roman Divacky80b32b82011-10-30 13:47:56 +00002267 else if (Name == "sse4a")
Craig Topper6a511e12011-12-30 07:33:42 +00002268 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper90ea0362012-05-30 05:54:54 +00002269 Features["sse4a"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00002270 else if (Name == "lzcnt")
2271 Features["lzcnt"] = true;
Benjamin Kramer84f30802012-07-07 09:39:18 +00002272 else if (Name == "rdrnd")
2273 Features["rdrand"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00002274 else if (Name == "bmi")
2275 Features["bmi"] = true;
2276 else if (Name == "bmi2")
2277 Features["bmi2"] = true;
Craig Toppere14e08b2011-12-29 16:10:46 +00002278 else if (Name == "popcnt")
2279 Features["popcnt"] = true;
Manman Ren146e5a42012-10-11 00:59:55 +00002280 else if (Name == "f16c")
2281 Features["f16c"] = true;
Michael Liao463eb892012-11-10 05:17:46 +00002282 else if (Name == "rtm")
2283 Features["rtm"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002284 } else {
2285 if (Name == "mmx")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002286 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002287 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00002288 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00002289 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper31380fb2012-06-03 22:23:42 +00002290 Features["sse4a"] = Features["avx"] = Features["avx2"] =
2291 Features["fma"] = Features["fma4"] = Features["aes"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002292 Features["pclmul"] = Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002293 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00002294 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Toppera7463c32012-06-03 21:56:22 +00002295 Features["sse41"] = Features["sse42"] = Features["sse4a"] =
Craig Topper31380fb2012-06-03 22:23:42 +00002296 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002297 Features["fma4"] = Features["aes"] = Features["pclmul"] =
2298 Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002299 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00002300 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topper31380fb2012-06-03 22:23:42 +00002301 Features["sse42"] = Features["sse4a"] = Features["avx"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002302 Features["avx2"] = Features["fma"] = Features["fma4"] =
2303 Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002304 else if (Name == "ssse3")
Craig Topper31380fb2012-06-03 22:23:42 +00002305 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2306 Features["avx"] = Features["avx2"] = Features["fma"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00002307 else if (Name == "sse4" || Name == "sse4.1")
Craig Topper31380fb2012-06-03 22:23:42 +00002308 Features["sse41"] = Features["sse42"] = Features["avx"] =
2309 Features["avx2"] = Features["fma"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00002310 else if (Name == "sse4.2")
Craig Topper31380fb2012-06-03 22:23:42 +00002311 Features["sse42"] = Features["avx"] = Features["avx2"] =
2312 Features["fma"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002313 else if (Name == "3dnow")
2314 Features["3dnow"] = Features["3dnowa"] = false;
2315 else if (Name == "3dnowa")
2316 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00002317 else if (Name == "aes")
2318 Features["aes"] = false;
Craig Topper3c0bc152012-05-31 05:18:48 +00002319 else if (Name == "pclmul")
2320 Features["pclmul"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00002321 else if (Name == "avx")
Craig Topper2ae95072012-06-03 21:46:30 +00002322 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002323 Features["fma4"] = Features["xop"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00002324 else if (Name == "avx2")
2325 Features["avx2"] = false;
Craig Topper2ae95072012-06-03 21:46:30 +00002326 else if (Name == "fma")
2327 Features["fma"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00002328 else if (Name == "sse4a")
Craig Topperb6af69e2012-06-09 22:24:14 +00002329 Features["sse4a"] = Features["fma4"] = Features["xop"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002330 else if (Name == "lzcnt")
2331 Features["lzcnt"] = false;
Benjamin Kramer84f30802012-07-07 09:39:18 +00002332 else if (Name == "rdrnd")
2333 Features["rdrand"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002334 else if (Name == "bmi")
2335 Features["bmi"] = false;
2336 else if (Name == "bmi2")
2337 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00002338 else if (Name == "popcnt")
2339 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00002340 else if (Name == "fma4")
Craig Topperb6af69e2012-06-09 22:24:14 +00002341 Features["fma4"] = Features["xop"] = false;
2342 else if (Name == "xop")
2343 Features["xop"] = false;
Manman Ren146e5a42012-10-11 00:59:55 +00002344 else if (Name == "f16c")
2345 Features["f16c"] = false;
Michael Liao463eb892012-11-10 05:17:46 +00002346 else if (Name == "rtm")
2347 Features["rtm"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002348 }
2349
2350 return true;
2351}
2352
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002353/// HandleTargetOptions - Perform initialization based on the user
2354/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002355void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002356 // Remember the maximum enabled sselevel.
2357 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2358 // Ignore disabled features.
2359 if (Features[i][0] == '-')
2360 continue;
2361
Benjamin Kramer713575a2012-03-05 15:10:44 +00002362 StringRef Feature = StringRef(Features[i]).substr(1);
2363
2364 if (Feature == "aes") {
Eric Christophereea12d12010-04-02 23:50:19 +00002365 HasAES = true;
2366 continue;
2367 }
2368
Craig Topper3c0bc152012-05-31 05:18:48 +00002369 if (Feature == "pclmul") {
2370 HasPCLMUL = true;
2371 continue;
2372 }
2373
Benjamin Kramer713575a2012-03-05 15:10:44 +00002374 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00002375 HasLZCNT = true;
2376 continue;
2377 }
2378
Benjamin Kramer84f30802012-07-07 09:39:18 +00002379 if (Feature == "rdrand") {
2380 HasRDRND = true;
2381 continue;
2382 }
2383
Benjamin Kramer713575a2012-03-05 15:10:44 +00002384 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00002385 HasBMI = true;
2386 continue;
2387 }
2388
Benjamin Kramer713575a2012-03-05 15:10:44 +00002389 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00002390 HasBMI2 = true;
2391 continue;
2392 }
2393
Benjamin Kramer713575a2012-03-05 15:10:44 +00002394 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00002395 HasPOPCNT = true;
2396 continue;
2397 }
2398
Michael Liao463eb892012-11-10 05:17:46 +00002399 if (Feature == "rtm") {
2400 HasRTM = true;
2401 continue;
2402 }
2403
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002404 if (Feature == "sse4a") {
2405 HasSSE4a = true;
2406 continue;
2407 }
2408
Benjamin Kramer713575a2012-03-05 15:10:44 +00002409 if (Feature == "fma4") {
Craig Topper6a511e12011-12-30 07:33:42 +00002410 HasFMA4 = true;
2411 continue;
2412 }
2413
Craig Topper2ae95072012-06-03 21:46:30 +00002414 if (Feature == "fma") {
2415 HasFMA = true;
2416 continue;
2417 }
2418
Craig Topperb6af69e2012-06-09 22:24:14 +00002419 if (Feature == "xop") {
2420 HasXOP = true;
2421 continue;
2422 }
2423
Manman Ren146e5a42012-10-11 00:59:55 +00002424 if (Feature == "f16c") {
2425 HasF16C = true;
2426 continue;
2427 }
2428
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002429 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00002430 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper05fe4b52012-01-09 09:19:09 +00002431 .Case("avx2", AVX2)
2432 .Case("avx", AVX)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002433 .Case("sse42", SSE42)
2434 .Case("sse41", SSE41)
2435 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00002436 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002437 .Case("sse2", SSE2)
2438 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002439 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002440 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002441
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002442 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00002443 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002444 .Case("3dnowa", AMD3DNowAthlon)
2445 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002446 .Case("mmx", MMX)
2447 .Default(NoMMX3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002448
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002449 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002450 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002451
2452 // Don't tell the backend if we're turning off mmx; it will end up disabling
2453 // SSE, which we don't want.
2454 std::vector<std::string>::iterator it;
2455 it = std::find(Features.begin(), Features.end(), "-mmx");
2456 if (it != Features.end())
2457 Features.erase(it);
Chris Lattner3daed522009-03-02 22:20:04 +00002458}
Chris Lattnerc0f59212009-03-02 22:27:17 +00002459
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002460/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2461/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00002462void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002463 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002464 // Target identification.
Derek Schuffbabaf312012-10-11 15:52:22 +00002465 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002466 Builder.defineMacro("__amd64__");
2467 Builder.defineMacro("__amd64");
2468 Builder.defineMacro("__x86_64");
2469 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00002470 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00002471 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00002472 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002473
Chris Lattnerc0f59212009-03-02 22:27:17 +00002474 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002475 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2476 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002477 switch (CPU) {
2478 case CK_Generic:
2479 break;
2480 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002481 // The rest are coming from the i386 define above.
2482 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002483 break;
2484 case CK_i486:
2485 case CK_WinChipC6:
2486 case CK_WinChip2:
2487 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002488 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002489 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002490 case CK_PentiumMMX:
2491 Builder.defineMacro("__pentium_mmx__");
2492 Builder.defineMacro("__tune_pentium_mmx__");
2493 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002494 case CK_i586:
2495 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002496 defineCPUMacros(Builder, "i586");
2497 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002498 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002499 case CK_Pentium3:
2500 case CK_Pentium3M:
2501 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002502 Builder.defineMacro("__tune_pentium3__");
2503 // Fallthrough
2504 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002505 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002506 Builder.defineMacro("__tune_pentium2__");
2507 // Fallthrough
2508 case CK_PentiumPro:
2509 Builder.defineMacro("__tune_i686__");
2510 Builder.defineMacro("__tune_pentiumpro__");
2511 // Fallthrough
2512 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002513 Builder.defineMacro("__i686");
2514 Builder.defineMacro("__i686__");
2515 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2516 Builder.defineMacro("__pentiumpro");
2517 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002518 break;
2519 case CK_Pentium4:
2520 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002521 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002522 break;
2523 case CK_Yonah:
2524 case CK_Prescott:
2525 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002526 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002527 break;
2528 case CK_Core2:
2529 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002530 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002531 break;
2532 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002533 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002534 break;
2535 case CK_Corei7:
2536 case CK_Corei7AVX:
2537 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002538 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002539 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002540 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002541 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002542 Builder.defineMacro("__k6_2__");
2543 Builder.defineMacro("__tune_k6_2__");
2544 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002545 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002546 if (CPU != CK_K6_2) { // In case of fallthrough
2547 // FIXME: GCC may be enabling these in cases where some other k6
2548 // architecture is specified but -m3dnow is explicitly provided. The
2549 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002550 Builder.defineMacro("__k6_3__");
2551 Builder.defineMacro("__tune_k6_3__");
2552 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00002553 // Fallthrough
2554 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002555 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002556 break;
2557 case CK_Athlon:
2558 case CK_AthlonThunderbird:
2559 case CK_Athlon4:
2560 case CK_AthlonXP:
2561 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002562 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002563 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002564 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002565 Builder.defineMacro("__tune_athlon_sse__");
2566 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002567 break;
2568 case CK_K8:
2569 case CK_K8SSE3:
2570 case CK_x86_64:
2571 case CK_Opteron:
2572 case CK_OpteronSSE3:
2573 case CK_Athlon64:
2574 case CK_Athlon64SSE3:
2575 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002576 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002577 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002578 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002579 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00002580 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002581 case CK_BTVER1:
2582 defineCPUMacros(Builder, "btver1");
2583 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002584 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002585 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002586 break;
2587 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002588 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002589 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002590 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002591 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002592 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002593 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00002594
Chandler Carruth88c75b02011-09-28 09:54:07 +00002595 // Target properties.
2596 Builder.defineMacro("__LITTLE_ENDIAN__");
2597 Builder.defineMacro("__REGISTER_PREFIX__", "");
2598
Chris Lattner54175442009-04-19 17:32:33 +00002599 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2600 // functions in glibc header files that use FP Stack inline asm which the
2601 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00002602 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002603
Chandler Carruth88c75b02011-09-28 09:54:07 +00002604 if (HasAES)
2605 Builder.defineMacro("__AES__");
2606
Craig Topper3c0bc152012-05-31 05:18:48 +00002607 if (HasPCLMUL)
2608 Builder.defineMacro("__PCLMUL__");
2609
Craig Topper31ceea02011-12-25 05:06:45 +00002610 if (HasLZCNT)
2611 Builder.defineMacro("__LZCNT__");
2612
Benjamin Kramer84f30802012-07-07 09:39:18 +00002613 if (HasRDRND)
2614 Builder.defineMacro("__RDRND__");
2615
Craig Topper31ceea02011-12-25 05:06:45 +00002616 if (HasBMI)
2617 Builder.defineMacro("__BMI__");
2618
2619 if (HasBMI2)
2620 Builder.defineMacro("__BMI2__");
2621
Craig Toppere14e08b2011-12-29 16:10:46 +00002622 if (HasPOPCNT)
2623 Builder.defineMacro("__POPCNT__");
2624
Michael Liao463eb892012-11-10 05:17:46 +00002625 if (HasRTM)
2626 Builder.defineMacro("__RTM__");
2627
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002628 if (HasSSE4a)
2629 Builder.defineMacro("__SSE4A__");
2630
Craig Topper6a511e12011-12-30 07:33:42 +00002631 if (HasFMA4)
2632 Builder.defineMacro("__FMA4__");
2633
Craig Topper2ae95072012-06-03 21:46:30 +00002634 if (HasFMA)
2635 Builder.defineMacro("__FMA__");
2636
Craig Topperb6af69e2012-06-09 22:24:14 +00002637 if (HasXOP)
2638 Builder.defineMacro("__XOP__");
2639
Manman Ren146e5a42012-10-11 00:59:55 +00002640 if (HasF16C)
2641 Builder.defineMacro("__F16C__");
2642
Chris Lattner84f0ea82009-03-02 22:40:39 +00002643 // Each case falls through to the previous one here.
2644 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002645 case AVX2:
2646 Builder.defineMacro("__AVX2__");
2647 case AVX:
2648 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002649 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00002650 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002651 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002652 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002653 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002654 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002655 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002656 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002657 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002658 Builder.defineMacro("__SSE2__");
2659 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002660 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002661 Builder.defineMacro("__SSE__");
2662 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002663 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002664 break;
2665 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002666
Derek Schuffbabaf312012-10-11 15:52:22 +00002667 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002668 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002669 case AVX2:
2670 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002671 case SSE42:
2672 case SSE41:
2673 case SSSE3:
2674 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002675 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002676 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002677 break;
2678 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002679 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002680 break;
2681 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002682 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002683 }
2684 }
2685
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002686 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002687 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002688 case AMD3DNowAthlon:
2689 Builder.defineMacro("__3dNOW_A__");
2690 case AMD3DNow:
2691 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002692 case MMX:
2693 Builder.defineMacro("__MMX__");
2694 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002695 break;
2696 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00002697}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002698
Douglas Gregore727d212012-01-30 06:38:25 +00002699bool X86TargetInfo::hasFeature(StringRef Feature) const {
2700 return llvm::StringSwitch<bool>(Feature)
2701 .Case("aes", HasAES)
2702 .Case("avx", SSELevel >= AVX)
2703 .Case("avx2", SSELevel >= AVX2)
2704 .Case("bmi", HasBMI)
2705 .Case("bmi2", HasBMI2)
Craig Topper2ae95072012-06-03 21:46:30 +00002706 .Case("fma", HasFMA)
Douglas Gregore727d212012-01-30 06:38:25 +00002707 .Case("fma4", HasFMA4)
2708 .Case("lzcnt", HasLZCNT)
Benjamin Kramer84f30802012-07-07 09:39:18 +00002709 .Case("rdrnd", HasRDRND)
Douglas Gregore727d212012-01-30 06:38:25 +00002710 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2711 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2712 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00002713 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00002714 .Case("popcnt", HasPOPCNT)
Michael Liao463eb892012-11-10 05:17:46 +00002715 .Case("rtm", HasRTM)
Douglas Gregore727d212012-01-30 06:38:25 +00002716 .Case("sse", SSELevel >= SSE1)
2717 .Case("sse2", SSELevel >= SSE2)
2718 .Case("sse3", SSELevel >= SSE3)
2719 .Case("ssse3", SSELevel >= SSSE3)
2720 .Case("sse41", SSELevel >= SSE41)
2721 .Case("sse42", SSELevel >= SSE42)
Craig Topper3c0bc152012-05-31 05:18:48 +00002722 .Case("sse4a", HasSSE4a)
Douglas Gregore727d212012-01-30 06:38:25 +00002723 .Case("x86", true)
Derek Schuffbabaf312012-10-11 15:52:22 +00002724 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2725 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Craig Topperb6af69e2012-06-09 22:24:14 +00002726 .Case("xop", HasXOP)
Manman Ren146e5a42012-10-11 00:59:55 +00002727 .Case("f16c", HasF16C)
Douglas Gregore727d212012-01-30 06:38:25 +00002728 .Default(false);
2729}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002730
Eli Friedman618234a2008-08-20 02:34:37 +00002731bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002732X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002733 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002734 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002735 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002736 case 'Y': // first letter of a pair:
2737 switch (*(Name+1)) {
2738 default: return false;
2739 case '0': // First SSE register.
2740 case 't': // Any SSE register, when SSE2 is enabled.
2741 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2742 case 'm': // any MMX register, when inter-unit moves enabled.
2743 break; // falls through to setAllowsRegister.
2744 }
Eli Friedman618234a2008-08-20 02:34:37 +00002745 case 'a': // eax.
2746 case 'b': // ebx.
2747 case 'c': // ecx.
2748 case 'd': // edx.
2749 case 'S': // esi.
2750 case 'D': // edi.
2751 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002752 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002753 case 't': // top of floating point stack.
2754 case 'u': // second from top of floating point stack.
2755 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002756 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002757 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002758 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002759 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2760 case 'l': // "Index" registers: any general register that can be used as an
2761 // index in a base+index memory access.
2762 Info.setAllowsRegister();
2763 return true;
2764 case 'C': // SSE floating point constant.
2765 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002766 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002767 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002768 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002769 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002770 return true;
2771 }
2772}
2773
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002774
Eli Friedman618234a2008-08-20 02:34:37 +00002775std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002776X86TargetInfo::convertConstraint(const char *&Constraint) const {
2777 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002778 case 'a': return std::string("{ax}");
2779 case 'b': return std::string("{bx}");
2780 case 'c': return std::string("{cx}");
2781 case 'd': return std::string("{dx}");
2782 case 'S': return std::string("{si}");
2783 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002784 case 'p': // address
2785 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002786 case 't': // top of floating point stack.
2787 return std::string("{st}");
2788 case 'u': // second from top of floating point stack.
2789 return std::string("{st(1)}"); // second from top of floating point stack.
2790 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002791 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002792 }
2793}
Eli Friedman618234a2008-08-20 02:34:37 +00002794} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002795
2796namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002797// X86-32 generic target
2798class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002799public:
Eli Friedman618234a2008-08-20 02:34:37 +00002800 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2801 DoubleAlign = LongLongAlign = 32;
2802 LongDoubleWidth = 96;
2803 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002804 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002805 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2806 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002807 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002808 SizeType = UnsignedInt;
2809 PtrDiffType = SignedInt;
2810 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002811 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002812
2813 // Use fpret for all types.
2814 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2815 (1 << TargetInfo::Double) |
2816 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002817
2818 // x86-32 has atomics up to 8 bytes
2819 // FIXME: Check that we actually have cmpxchg8b before setting
2820 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2821 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002822 }
Meador Ingec5613b22012-06-16 03:34:49 +00002823 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2824 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman618234a2008-08-20 02:34:37 +00002825 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002826
Chris Lattner21fb98e2009-09-23 06:06:36 +00002827 int getEHDataRegisterNumber(unsigned RegNo) const {
2828 if (RegNo == 0) return 0;
2829 if (RegNo == 1) return 2;
2830 return -1;
2831 }
Bill Wendling68fd6082012-11-12 06:42:51 +00002832 virtual bool validateInputSize(StringRef Constraint,
2833 unsigned Size) const {
2834 switch (Constraint[0]) {
2835 default: break;
2836 case 'a':
2837 case 'b':
2838 case 'c':
2839 case 'd':
Bill Wendlingf634bdf2012-11-12 18:52:32 +00002840 return Size <= 32;
Bill Wendling68fd6082012-11-12 06:42:51 +00002841 }
2842
2843 return true;
2844 }
Eli Friedman618234a2008-08-20 02:34:37 +00002845};
2846} // end anonymous namespace
2847
2848namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002849class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2850public:
2851 NetBSDI386TargetInfo(const std::string &triple) :
2852 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2853 }
2854
2855 virtual unsigned getFloatEvalMethod() const {
2856 // NetBSD defaults to "double" rounding
2857 return 1;
2858 }
2859};
2860} // end anonymous namespace
2861
2862namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002863class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2864public:
2865 OpenBSDI386TargetInfo(const std::string& triple) :
2866 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2867 SizeType = UnsignedLong;
2868 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002869 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002870 }
2871};
2872} // end anonymous namespace
2873
2874namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00002875class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
2876public:
2877 BitrigI386TargetInfo(const std::string& triple) :
2878 BitrigTargetInfo<X86_32TargetInfo>(triple) {
2879 SizeType = UnsignedLong;
2880 IntPtrType = SignedLong;
2881 PtrDiffType = SignedLong;
2882 }
2883};
2884} // end anonymous namespace
2885
2886namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002887class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002888public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002889 DarwinI386TargetInfo(const std::string& triple) :
2890 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002891 LongDoubleWidth = 128;
2892 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002893 SuitableAlign = 128;
Chad Rosierf9e9af72012-07-13 23:57:43 +00002894 MaxVectorAlign = 256;
Eli Friedman1afabd92009-03-29 20:31:09 +00002895 SizeType = UnsignedLong;
2896 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002897 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2898 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002899 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002900 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002901 }
2902
Eli Friedman618234a2008-08-20 02:34:37 +00002903};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002904} // end anonymous namespace
2905
2906namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002907// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002908class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002909public:
2910 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002911 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002912 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002913 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002914 DoubleAlign = LongLongAlign = 64;
2915 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 +00002916 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002917 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002918 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002919 virtual void getTargetDefines(const LangOptions &Opts,
2920 MacroBuilder &Builder) const {
2921 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2922 }
2923};
2924} // end anonymous namespace
2925
2926namespace {
2927
2928// x86-32 Windows Visual Studio target
2929class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2930public:
2931 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2932 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002933 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002934 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2935 }
2936 virtual void getTargetDefines(const LangOptions &Opts,
2937 MacroBuilder &Builder) const {
2938 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2939 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2940 // The value of the following reflects processor type.
2941 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2942 // We lost the original triple, so we use the default.
2943 Builder.defineMacro("_M_IX86", "600");
2944 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002945};
2946} // end anonymous namespace
2947
2948namespace {
2949// x86-32 MinGW target
2950class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2951public:
2952 MinGWX86_32TargetInfo(const std::string& triple)
2953 : WindowsX86_32TargetInfo(triple) {
2954 }
2955 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002956 MacroBuilder &Builder) const {
2957 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002958 DefineStd(Builder, "WIN32", Opts);
2959 DefineStd(Builder, "WINNT", Opts);
2960 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002961 Builder.defineMacro("__MSVCRT__");
2962 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002963
2964 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2965 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002966 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002967 // Provide "as-is" __declspec.
2968 Builder.defineMacro("__declspec", "__declspec");
2969 else
2970 // Provide alias of __attribute__ like mingw32-gcc.
2971 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002972 }
2973};
2974} // end anonymous namespace
2975
2976namespace {
2977// x86-32 Cygwin target
2978class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2979public:
2980 CygwinX86_32TargetInfo(const std::string& triple)
2981 : X86_32TargetInfo(triple) {
2982 TLSSupported = false;
2983 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002984 DoubleAlign = LongLongAlign = 64;
2985 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2986 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002987 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002988 }
2989 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002990 MacroBuilder &Builder) const {
2991 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumie72f4d92012-12-14 10:17:26 +00002992 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002993 Builder.defineMacro("__CYGWIN__");
2994 Builder.defineMacro("__CYGWIN32__");
2995 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00002996 if (Opts.CPlusPlus)
2997 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00002998 }
Eli Friedman29a30502008-08-21 01:40:19 +00002999};
3000} // end anonymous namespace
3001
3002namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00003003// x86-32 Haiku target
3004class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3005public:
3006 HaikuX86_32TargetInfo(const std::string& triple)
3007 : X86_32TargetInfo(triple) {
3008 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00003009 IntPtrType = SignedLong;
3010 PtrDiffType = SignedLong;
Eli Friedman6902e412012-11-27 02:58:24 +00003011 ProcessIDType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00003012 this->UserLabelPrefix = "";
Benjamin Krameref7bcea2012-11-08 12:59:15 +00003013 this->TLSSupported = false;
Eli Friedmana7e68452010-08-22 01:00:03 +00003014 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00003015 virtual void getTargetDefines(const LangOptions &Opts,
3016 MacroBuilder &Builder) const {
3017 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3018 Builder.defineMacro("__INTEL__");
3019 Builder.defineMacro("__HAIKU__");
3020 }
3021};
3022} // end anonymous namespace
3023
Douglas Gregordca52262011-07-01 22:41:14 +00003024// RTEMS Target
3025template<typename Target>
3026class RTEMSTargetInfo : public OSTargetInfo<Target> {
3027protected:
3028 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3029 MacroBuilder &Builder) const {
3030 // RTEMS defines; list based off of gcc output
3031
Douglas Gregordca52262011-07-01 22:41:14 +00003032 Builder.defineMacro("__rtems__");
3033 Builder.defineMacro("__ELF__");
3034 }
3035public:
3036 RTEMSTargetInfo(const std::string &triple)
3037 : OSTargetInfo<Target>(triple) {
3038 this->UserLabelPrefix = "";
3039
3040 llvm::Triple Triple(triple);
3041 switch (Triple.getArch()) {
3042 default:
3043 case llvm::Triple::x86:
3044 // this->MCountName = ".mcount";
3045 break;
3046 case llvm::Triple::mips:
3047 case llvm::Triple::mipsel:
3048 case llvm::Triple::ppc:
3049 case llvm::Triple::ppc64:
3050 // this->MCountName = "_mcount";
3051 break;
3052 case llvm::Triple::arm:
3053 // this->MCountName = "__mcount";
3054 break;
3055 }
3056
3057 }
3058};
3059
3060namespace {
3061// x86-32 RTEMS target
3062class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3063public:
3064 RTEMSX86_32TargetInfo(const std::string& triple)
3065 : X86_32TargetInfo(triple) {
3066 SizeType = UnsignedLong;
3067 IntPtrType = SignedLong;
3068 PtrDiffType = SignedLong;
3069 this->UserLabelPrefix = "";
3070 }
3071 virtual void getTargetDefines(const LangOptions &Opts,
3072 MacroBuilder &Builder) const {
3073 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3074 Builder.defineMacro("__INTEL__");
3075 Builder.defineMacro("__rtems__");
3076 }
3077};
3078} // end anonymous namespace
3079
Chris Lattner86ed3a32010-04-11 19:29:39 +00003080namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00003081// x86-64 generic target
3082class X86_64TargetInfo : public X86TargetInfo {
3083public:
Chris Lattner33328642009-03-20 15:52:06 +00003084 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00003085 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00003086 LongDoubleWidth = 128;
3087 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00003088 LargeArrayMinWidth = 128;
3089 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003090 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00003091 IntMaxType = SignedLong;
3092 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003093 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00003094 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00003095
Eli Friedmaned855cb2008-08-21 00:13:15 +00003096 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3097 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003098 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00003099
3100 // Use fpret only for long double.
3101 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00003102
Anders Carlssoneea64802011-10-31 16:27:11 +00003103 // Use fp2ret for _Complex long double.
3104 ComplexLongDoubleUsesFP2Ret = true;
3105
Eli Friedman2be46072011-10-14 20:59:01 +00003106 // x86-64 has atomics up to 16 bytes.
3107 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3108 // on CPUs with cmpxchg16b
3109 MaxAtomicPromoteWidth = 128;
3110 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00003111 }
Meador Ingec5613b22012-06-16 03:34:49 +00003112 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3113 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson3346ae62007-11-24 23:38:12 +00003114 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00003115
Chris Lattner21fb98e2009-09-23 06:06:36 +00003116 int getEHDataRegisterNumber(unsigned RegNo) const {
3117 if (RegNo == 0) return 0;
3118 if (RegNo == 1) return 1;
3119 return -1;
3120 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003121
3122 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Peter Collingbourne7728cdd2013-02-23 00:06:18 +00003123 return (CC == CC_Default ||
3124 CC == CC_C ||
3125 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003126 }
3127
Aaron Ballmanfff32482012-12-09 17:45:41 +00003128 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3129 return CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003130 }
3131
Eli Friedman618234a2008-08-20 02:34:37 +00003132};
3133} // end anonymous namespace
3134
3135namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003136// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003137class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003138public:
3139 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003140 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003141 TLSSupported = false;
3142 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00003143 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00003144 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00003145 IntMaxType = SignedLongLong;
3146 UIntMaxType = UnsignedLongLong;
3147 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00003148 SizeType = UnsignedLongLong;
3149 PtrDiffType = SignedLongLong;
3150 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00003151 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003152 }
3153 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003154 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003155 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003156 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00003157 }
Meador Ingec5613b22012-06-16 03:34:49 +00003158 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3159 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumi79521992011-01-17 22:56:23 +00003160 }
Michael J. Spencera764e832010-10-21 08:22:51 +00003161};
3162} // end anonymous namespace
3163
3164namespace {
3165// x86-64 Windows Visual Studio target
3166class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3167public:
3168 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
3169 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003170 LongDoubleWidth = LongDoubleAlign = 64;
3171 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00003172 }
3173 virtual void getTargetDefines(const LangOptions &Opts,
3174 MacroBuilder &Builder) const {
3175 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3176 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00003177 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003178 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003179 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003180};
3181} // end anonymous namespace
3182
3183namespace {
3184// x86-64 MinGW target
3185class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3186public:
3187 MinGWX86_64TargetInfo(const std::string& triple)
3188 : WindowsX86_64TargetInfo(triple) {
3189 }
3190 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003191 MacroBuilder &Builder) const {
3192 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00003193 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00003194 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00003195 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00003196 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003197
3198 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3199 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00003200 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003201 // Provide "as-is" __declspec.
3202 Builder.defineMacro("__declspec", "__declspec");
3203 else
3204 // Provide alias of __attribute__ like mingw32-gcc.
3205 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003206 }
3207};
3208} // end anonymous namespace
3209
3210namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003211class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3212public:
Mike Stump1eb44332009-09-09 15:08:12 +00003213 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003214 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
3215 Int64Type = SignedLongLong;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003216 MaxVectorAlign = 256;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003217 }
3218};
3219} // end anonymous namespace
3220
3221namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00003222class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3223public:
Mike Stump1eb44332009-09-09 15:08:12 +00003224 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00003225 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
3226 IntMaxType = SignedLongLong;
3227 UIntMaxType = UnsignedLongLong;
3228 Int64Type = SignedLongLong;
3229 }
3230};
3231} // end anonymous namespace
3232
3233namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003234class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3235public:
3236 BitrigX86_64TargetInfo(const std::string& triple)
3237 : BitrigTargetInfo<X86_64TargetInfo>(triple) {
3238 IntMaxType = SignedLongLong;
3239 UIntMaxType = UnsignedLongLong;
3240 Int64Type = SignedLongLong;
3241 }
3242};
Tim Northoverc264e162013-01-31 12:13:10 +00003243}
3244
3245namespace {
3246class AArch64TargetInfo : public TargetInfo {
3247 static const char * const GCCRegNames[];
3248 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3249public:
3250 AArch64TargetInfo(const std::string& triple) : TargetInfo(triple) {
3251 BigEndian = false;
3252 LongWidth = LongAlign = 64;
3253 LongDoubleWidth = LongDoubleAlign = 128;
3254 PointerWidth = PointerAlign = 64;
3255 SuitableAlign = 128;
3256 DescriptionString = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3257 "i64:64:64-i128:128:128-f32:32:32-f64:64:64-"
3258 "f128:128:128-n32:64-S128";
3259
3260 WCharType = UnsignedInt;
3261 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3262
Tim Northover6a93c862013-02-18 12:11:32 +00003263 // AArch64 backend supports 64-bit operations at the moment. In principle
3264 // 128-bit is possible if register-pairs are used.
3265 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3266
Tim Northoverc264e162013-01-31 12:13:10 +00003267 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3268 }
3269 virtual void getTargetDefines(const LangOptions &Opts,
3270 MacroBuilder &Builder) const {
3271 // GCC defines theses currently
3272 Builder.defineMacro("__aarch64__");
3273 Builder.defineMacro("__AARCH64EL__");
3274
3275 // ACLE predefines. Many can only have one possible value on v8 AArch64.
3276
3277 // FIXME: these were written based on an unreleased version of a 32-bit ACLE
3278 // which was intended to be compatible with a 64-bit implementation. They
3279 // will need updating when a real 64-bit ACLE exists. Particularly pressing
3280 // instances are: __AARCH_ISA_A32, __AARCH_ISA_T32, __ARCH_PCS.
3281 Builder.defineMacro("__AARCH_ACLE", "101");
3282 Builder.defineMacro("__AARCH", "8");
3283 Builder.defineMacro("__AARCH_PROFILE", "'A'");
3284
3285 Builder.defineMacro("__AARCH_FEATURE_UNALIGNED");
3286 Builder.defineMacro("__AARCH_FEATURE_CLZ");
3287 Builder.defineMacro("__AARCH_FEATURE_FMA");
3288
3289 // FIXME: ACLE 1.1 reserves bit 4. Will almost certainly come to mean
3290 // 128-bit LDXP present, at which point this becomes 0x1f.
3291 Builder.defineMacro("__AARCH_FEATURE_LDREX", "0xf");
3292
3293 // 0xe implies support for half, single and double precision operations.
3294 Builder.defineMacro("__AARCH_FP", "0xe");
3295
3296 // PCS specifies this for SysV variants, which is all we support. Other ABIs
3297 // may choose __AARCH_FP16_FORMAT_ALTERNATIVE.
3298 Builder.defineMacro("__AARCH_FP16_FORMAT_IEEE");
3299
3300 if (Opts.FastMath || Opts.FiniteMathOnly)
3301 Builder.defineMacro("__AARCH_FP_FAST");
3302
3303 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
3304 Builder.defineMacro("__AARCH_FP_FENV_ROUNDING");
3305
3306 Builder.defineMacro("__AARCH_SIZEOF_WCHAR_T",
3307 Opts.ShortWChar ? "2" : "4");
3308
3309 Builder.defineMacro("__AARCH_SIZEOF_MINIMAL_ENUM",
3310 Opts.ShortEnums ? "1" : "4");
3311
3312 if (BigEndian)
3313 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3314 }
3315 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3316 unsigned &NumRecords) const {
3317 Records = 0;
3318 NumRecords = 0;
3319 }
3320 virtual bool hasFeature(StringRef Feature) const {
3321 return Feature == "aarch64";
3322 }
3323 virtual void getGCCRegNames(const char * const *&Names,
3324 unsigned &NumNames) const;
3325 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3326 unsigned &NumAliases) const;
3327
3328 virtual bool isCLZForZeroUndef() const { return false; }
3329
3330 virtual bool validateAsmConstraint(const char *&Name,
3331 TargetInfo::ConstraintInfo &Info) const {
3332 switch (*Name) {
3333 default: return false;
3334 case 'w': // An FP/SIMD vector register
3335 Info.setAllowsRegister();
3336 return true;
3337 case 'I': // Constant that can be used with an ADD instruction
3338 case 'J': // Constant that can be used with a SUB instruction
3339 case 'K': // Constant that can be used with a 32-bit logical instruction
3340 case 'L': // Constant that can be used with a 64-bit logical instruction
3341 case 'M': // Constant that can be used as a 32-bit MOV immediate
3342 case 'N': // Constant that can be used as a 64-bit MOV immediate
3343 case 'Y': // Floating point constant zero
3344 case 'Z': // Integer constant zero
3345 return true;
3346 case 'Q': // A memory reference with base register and no offset
3347 Info.setAllowsMemory();
3348 return true;
3349 case 'S': // A symbolic address
3350 Info.setAllowsRegister();
3351 return true;
3352 case 'U':
3353 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3354 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3355 // Usa: An absolute symbolic address
3356 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3357 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3358 }
3359 }
3360
3361 virtual const char *getClobbers() const {
3362 // There are no AArch64 clobbers shared by all asm statements.
3363 return "";
3364 }
3365
3366 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3367 return TargetInfo::AArch64ABIBuiltinVaList;
3368 }
3369};
3370
3371const char * const AArch64TargetInfo::GCCRegNames[] = {
3372 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3373 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3374 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3375 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3376
3377 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3378 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3379 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3380 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3381
3382 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3383 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3384 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3385 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3386
3387 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3388 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3389 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3390 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3391
3392 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3393 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3394 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3395 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3396
3397 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3398 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3399 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3400 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3401
3402 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3403 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3404 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3405 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3406};
3407
3408void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3409 unsigned &NumNames) const {
3410 Names = GCCRegNames;
3411 NumNames = llvm::array_lengthof(GCCRegNames);
3412}
3413
3414const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3415 { { "x16" }, "ip0"},
3416 { { "x17" }, "ip1"},
3417 { { "x29" }, "fp" },
3418 { { "x30" }, "lr" }
3419};
3420
3421void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3422 unsigned &NumAliases) const {
3423 Aliases = GCCRegAliases;
3424 NumAliases = llvm::array_lengthof(GCCRegAliases);
3425
3426}
Eli Friedman42f74f22012-08-08 23:57:20 +00003427} // end anonymous namespace
3428
3429namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00003430class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003431 // Possible FPU choices.
3432 enum FPUMode {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003433 VFP2FPU = (1 << 0),
3434 VFP3FPU = (1 << 1),
3435 VFP4FPU = (1 << 2),
3436 NeonFPU = (1 << 3)
Daniel Dunbara91320b2009-12-21 23:28:17 +00003437 };
3438
3439 static bool FPUModeIsVFP(FPUMode Mode) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003440 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU);
Daniel Dunbara91320b2009-12-21 23:28:17 +00003441 }
3442
3443 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3444 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003445
Daniel Dunbareac7c532009-12-18 18:42:37 +00003446 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003447
Bob Wilsoncfaab002012-09-29 23:52:52 +00003448 unsigned FPU : 4;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003449
Logan Chieneae5a8202012-10-10 06:56:20 +00003450 unsigned IsAAPCS : 1;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003451 unsigned IsThumb : 1;
3452
3453 // Initialized via features.
3454 unsigned SoftFloat : 1;
3455 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003456
Chris Lattner2752c012010-03-03 19:03:45 +00003457 static const Builtin::Info BuiltinInfo[];
3458
Chris Lattner393ff042008-04-21 18:56:49 +00003459public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003460 ARMTargetInfo(const std::string &TripleStr)
Logan Chieneae5a8202012-10-10 06:56:20 +00003461 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s"), IsAAPCS(true)
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003462 {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003463 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003464 SizeType = UnsignedInt;
3465 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00003466 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3467 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003468
Chris Lattner9bffb072010-04-23 16:29:58 +00003469 // {} in inline assembly are neon specifiers, not assembly variant
3470 // specifiers.
3471 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00003472
Daniel Dunbareac7c532009-12-18 18:42:37 +00003473 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00003474 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003475 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003476 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3477 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003478 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
3479 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003480 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003481 } else {
3482 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3483 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003484 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003485 }
John McCallee79a4c2010-08-21 22:46:04 +00003486
3487 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00003488 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00003489
3490 // ARM has atomics up to 8 bytes
3491 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
3492 MaxAtomicPromoteWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00003493
3494 // Do force alignment of members that follow zero length bitfields. If
3495 // the alignment of the zero-length bitfield is greater than the member
3496 // that follows it, `bar', `bar' will be aligned as the type of the
3497 // zero length bitfield.
3498 UseZeroLengthBitfieldAlignment = true;
Eli Friedman61538a72008-05-20 14:21:01 +00003499 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003500 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00003501 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003502 ABI = Name;
3503
Daniel Dunbara2a41612009-09-14 00:02:24 +00003504 // The defaults (above) are for AAPCS, check if we need to change them.
3505 //
3506 // FIXME: We need support for -meabi... we could just mangle it into the
3507 // name.
3508 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003509 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindola27fa2362012-12-13 04:17:14 +00003510 // size_t is unsigned int on FreeBSD.
3511 if (getTriple().getOS() != llvm::Triple::FreeBSD)
3512 SizeType = UnsignedLong;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003513
James Molloya6d81f92011-11-23 13:35:08 +00003514 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3515 WCharType = SignedInt;
3516
Daniel Dunbar684de632010-04-22 16:14:54 +00003517 // Do not respect the alignment of bit-field types when laying out
3518 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3519 UseBitFieldTypeAlignment = false;
3520
Chad Rosier61a62212011-08-04 01:21:14 +00003521 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00003522 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3523 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00003524 ZeroLengthBitfieldBoundary = 32;
3525
Logan Chieneae5a8202012-10-10 06:56:20 +00003526 IsAAPCS = false;
3527
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003528 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003529 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3530 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003531 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 +00003532 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003533 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003534 } else {
3535 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 +00003536 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003537 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003538 }
3539
Chad Rosier9f1210c2011-07-26 07:03:04 +00003540 // FIXME: Override "preferred align" for double and long long.
David Tweedb16abb12012-10-25 13:33:01 +00003541 } else if (Name == "aapcs" || Name == "aapcs-vfp") {
Logan Chieneae5a8202012-10-10 06:56:20 +00003542 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003543 // FIXME: Enumerated types are variable width in straight AAPCS.
3544 } else if (Name == "aapcs-linux") {
Logan Chieneae5a8202012-10-10 06:56:20 +00003545 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003546 } else
3547 return false;
3548
3549 return true;
3550 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003551
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003552 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003553 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3554 Features["vfp2"] = true;
Bob Wilsoncfaab002012-09-29 23:52:52 +00003555 else if (CPU == "cortex-a8" || CPU == "cortex-a15" ||
3556 CPU == "cortex-a9" || CPU == "cortex-a9-mp")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003557 Features["neon"] = true;
Bob Wilsonfc553452013-03-04 22:37:46 +00003558 else if (CPU == "swift" || CPU == "cortex-a7") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003559 Features["vfp4"] = true;
3560 Features["neon"] = true;
3561 }
Daniel Dunbara91320b2009-12-21 23:28:17 +00003562 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00003563
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003564 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00003565 StringRef Name,
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003566 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00003567 if (Name == "soft-float" || Name == "soft-float-abi" ||
Bob Wilsoncfaab002012-09-29 23:52:52 +00003568 Name == "vfp2" || Name == "vfp3" || Name == "vfp4" || Name == "neon" ||
3569 Name == "d16" || Name == "neonfp") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003570 Features[Name] = Enabled;
3571 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003572 return false;
3573
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003574 return true;
3575 }
3576
3577 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003578 FPU = 0;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003579 SoftFloat = SoftFloatABI = false;
3580 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3581 if (Features[i] == "+soft-float")
3582 SoftFloat = true;
3583 else if (Features[i] == "+soft-float-abi")
3584 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003585 else if (Features[i] == "+vfp2")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003586 FPU |= VFP2FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003587 else if (Features[i] == "+vfp3")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003588 FPU |= VFP3FPU;
3589 else if (Features[i] == "+vfp4")
3590 FPU |= VFP4FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003591 else if (Features[i] == "+neon")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003592 FPU |= NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003593 }
3594
3595 // Remove front-end specific options which the backend handles differently.
3596 std::vector<std::string>::iterator it;
3597 it = std::find(Features.begin(), Features.end(), "+soft-float");
3598 if (it != Features.end())
3599 Features.erase(it);
3600 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3601 if (it != Features.end())
3602 Features.erase(it);
3603 }
3604
Douglas Gregore727d212012-01-30 06:38:25 +00003605 virtual bool hasFeature(StringRef Feature) const {
3606 return llvm::StringSwitch<bool>(Feature)
3607 .Case("arm", true)
3608 .Case("softfloat", SoftFloat)
3609 .Case("thumb", IsThumb)
3610 .Case("neon", FPU == NeonFPU && !SoftFloat &&
3611 StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
3612 .Default(false);
3613 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003614 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00003615 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00003616 return llvm::StringSwitch<const char*>(Name)
3617 .Cases("arm8", "arm810", "4")
3618 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3619 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3620 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3621 .Case("ep9312", "4T")
3622 .Cases("arm10tdmi", "arm1020t", "5T")
3623 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3624 .Case("arm926ej-s", "5TEJ")
3625 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3626 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003627 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003628 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003629 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003630 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonfc553452013-03-04 22:37:46 +00003631 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
3632 .Cases("cortex-a9", "cortex-a15", "7A")
Quentin Colombetab137512012-12-21 17:57:47 +00003633 .Case("cortex-r5", "7R")
Bob Wilson336bfa32012-09-29 23:52:50 +00003634 .Case("cortex-a9-mp", "7F")
3635 .Case("swift", "7S")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003636 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00003637 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003638 .Default(0);
3639 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003640 static const char *getCPUProfile(StringRef Name) {
3641 return llvm::StringSwitch<const char*>(Name)
3642 .Cases("cortex-a8", "cortex-a9", "A")
3643 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Quentin Colombetab137512012-12-21 17:57:47 +00003644 .Case("cortex-r5", "R")
Anton Korobeynikov8b0703d2012-09-08 08:22:13 +00003645 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003646 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003647 virtual bool setCPU(const std::string &Name) {
3648 if (!getCPUDefineSuffix(Name))
3649 return false;
3650
3651 CPU = Name;
3652 return true;
3653 }
Chris Lattner33328642009-03-20 15:52:06 +00003654 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003655 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00003656 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00003657 Builder.defineMacro("__arm");
3658 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003659
Chris Lattnerc0f59212009-03-02 22:27:17 +00003660 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00003661 Builder.defineMacro("__ARMEL__");
3662 Builder.defineMacro("__LITTLE_ENDIAN__");
3663 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003664
Chris Lattner5f9e2722011-07-23 10:55:15 +00003665 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00003666 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003667 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3668 StringRef CPUProfile = getCPUProfile(CPU);
3669 if (!CPUProfile.empty())
3670 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3671
Mike Stump437bb4b2009-04-08 02:07:04 +00003672 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003673
Daniel Dunbareac7c532009-12-18 18:42:37 +00003674 // FIXME: It's more complicated than this and we don't really support
3675 // interworking.
3676 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00003677 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003678
David Tweedb16abb12012-10-25 13:33:01 +00003679 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Daniel Dunbar849289e2012-10-22 18:51:13 +00003680 // M-class CPUs on Darwin follow AAPCS, but not EABI.
Daniel Dunbar4d3ee9b2012-10-22 18:56:43 +00003681 if (!(getTriple().isOSDarwin() && CPUProfile == "M"))
Daniel Dunbar849289e2012-10-22 18:51:13 +00003682 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003683 Builder.defineMacro("__ARM_PCS", "1");
3684
David Tweedb16abb12012-10-25 13:33:01 +00003685 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003686 Builder.defineMacro("__ARM_PCS_VFP", "1");
3687 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003688
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003689 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00003690 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003691
3692 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00003693 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003694
Bob Wilson84f95cf2011-05-13 18:56:03 +00003695 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003696 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003697 Builder.defineMacro("__THUMBEL__");
3698 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00003699 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003700 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003701 }
3702
3703 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00003704 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00003705
Bob Wilsoncfaab002012-09-29 23:52:52 +00003706 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003707 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00003708 if (FPU & VFP2FPU)
3709 Builder.defineMacro("__ARM_VFPV2__");
3710 if (FPU & VFP3FPU)
3711 Builder.defineMacro("__ARM_VFPV3__");
3712 if (FPU & VFP4FPU)
3713 Builder.defineMacro("__ARM_VFPV4__");
3714 }
3715
Daniel Dunbara91320b2009-12-21 23:28:17 +00003716 // This only gets set when Neon instructions are actually available, unlike
3717 // the VFP define, hence the soft float and arch check. This is subtly
3718 // different from gcc, we follow the intent which was that it should be set
3719 // when Neon instructions are actually available.
Bob Wilsoncfaab002012-09-29 23:52:52 +00003720 if ((FPU & NeonFPU) && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003721 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00003722 }
3723 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3724 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00003725 Records = BuiltinInfo;
3726 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00003727 }
Bob Wilson8b30a932012-01-26 22:14:27 +00003728 virtual bool isCLZForZeroUndef() const { return false; }
Meador Ingec5613b22012-06-16 03:34:49 +00003729 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chieneae5a8202012-10-10 06:56:20 +00003730 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner393ff042008-04-21 18:56:49 +00003731 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003732 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003733 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003734 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003735 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003736 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00003737 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003738 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00003739 default: break;
Nate Begemanad487f42008-04-22 05:03:19 +00003740 case 'l': // r0-r7
3741 case 'h': // r8-r15
3742 case 'w': // VFP Floating point register single precision
3743 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00003744 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00003745 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00003746 case 'Q': // A memory address that is a single base register.
3747 Info.setAllowsMemory();
3748 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00003749 case 'U': // a memory reference...
3750 switch (Name[1]) {
3751 case 'q': // ...ARMV4 ldrsb
3752 case 'v': // ...VFP load/store (reg+constant offset)
3753 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00003754 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00003755 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00003756 case 'n': // valid address for Neon doubleword vector load/store
3757 case 'm': // valid address for Neon element and structure load/store
3758 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00003759 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00003760 Info.setAllowsMemory();
3761 Name++;
3762 return true;
3763 }
Nate Begemanad487f42008-04-22 05:03:19 +00003764 }
Chris Lattner393ff042008-04-21 18:56:49 +00003765 return false;
3766 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00003767 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00003768 std::string R;
3769 switch (*Constraint) {
3770 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00003771 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00003772 Constraint++;
3773 break;
Eric Christopher283f4472011-06-17 00:40:18 +00003774 case 'p': // 'p' should be translated to 'r' by default.
3775 R = std::string("r");
3776 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00003777 default:
3778 return std::string(1, *Constraint);
3779 }
3780 return R;
3781 }
Bill Wendling50d46ca2012-10-25 23:28:48 +00003782 virtual bool validateConstraintModifier(StringRef Constraint,
3783 const char Modifier,
3784 unsigned Size) const {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00003785 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00003786 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00003787
Bill Wendling50d46ca2012-10-25 23:28:48 +00003788 // Strip off constraint modifiers.
3789 while (Constraint[0] == '=' ||
3790 Constraint[0] == '+' ||
3791 Constraint[0] == '&')
3792 Constraint = Constraint.substr(1);
3793
3794 switch (Constraint[0]) {
3795 default: break;
3796 case 'r': {
3797 switch (Modifier) {
3798 default:
Bill Wendling6e6330c2012-11-30 23:46:56 +00003799 return isInOut || (isOutput && Size >= 32) ||
3800 (!isOutput && !isInOut && Size <= 32);
Bill Wendling50d46ca2012-10-25 23:28:48 +00003801 case 'q':
3802 // A register of size 32 cannot fit a vector type.
3803 return false;
3804 }
3805 }
3806 }
3807
3808 return true;
3809 }
Chris Lattner393ff042008-04-21 18:56:49 +00003810 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00003811 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00003812 return "";
3813 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003814
3815 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3816 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
3817 }
Logan Chiena8f7a972013-02-23 04:24:36 +00003818
3819 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
3820 if (RegNo == 0) return 0;
3821 if (RegNo == 1) return 1;
3822 return -1;
3823 }
Chris Lattner393ff042008-04-21 18:56:49 +00003824};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003825
3826const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003827 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003828 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003829 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
3830
3831 // Float registers
3832 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3833 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3834 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003835 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003836
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003837 // Double registers
3838 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3839 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00003840 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3841 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003842
3843 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00003844 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3845 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003846};
3847
3848void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003849 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003850 Names = GCCRegNames;
3851 NumNames = llvm::array_lengthof(GCCRegNames);
3852}
3853
3854const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003855 { { "a1" }, "r0" },
3856 { { "a2" }, "r1" },
3857 { { "a3" }, "r2" },
3858 { { "a4" }, "r3" },
3859 { { "v1" }, "r4" },
3860 { { "v2" }, "r5" },
3861 { { "v3" }, "r6" },
3862 { { "v4" }, "r7" },
3863 { { "v5" }, "r8" },
3864 { { "v6", "rfp" }, "r9" },
3865 { { "sl" }, "r10" },
3866 { { "fp" }, "r11" },
3867 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003868 { { "r13" }, "sp" },
3869 { { "r14" }, "lr" },
3870 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003871 // The S, D and Q registers overlap, but aren't really aliases; we
3872 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003873};
3874
3875void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3876 unsigned &NumAliases) const {
3877 Aliases = GCCRegAliases;
3878 NumAliases = llvm::array_lengthof(GCCRegAliases);
3879}
Chris Lattner2752c012010-03-03 19:03:45 +00003880
3881const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00003882#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00003883#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00003884 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00003885#include "clang/Basic/BuiltinsARM.def"
3886};
Chris Lattner393ff042008-04-21 18:56:49 +00003887} // end anonymous namespace.
3888
Eli Friedmana9f54962008-08-20 07:44:10 +00003889namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00003890class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003891 public DarwinTargetInfo<ARMTargetInfo> {
3892protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00003893 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00003894 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00003895 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00003896 }
Eli Friedmana9f54962008-08-20 07:44:10 +00003897
Torok Edwin5f6c1942009-06-30 17:10:35 +00003898public:
Mike Stump1eb44332009-09-09 15:08:12 +00003899 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00003900 : DarwinTargetInfo<ARMTargetInfo>(triple) {
3901 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00003902 // iOS always has 64-bit atomic instructions.
3903 // FIXME: This should be based off of the target features in ARMTargetInfo.
3904 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00003905
3906 // Darwin on iOS uses a variant of the ARM C++ ABI.
3907 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar350b9f32010-05-27 07:00:26 +00003908 }
Eli Friedmana9f54962008-08-20 07:44:10 +00003909};
3910} // end anonymous namespace.
3911
Tony Linthicum96319392011-12-12 21:14:55 +00003912
3913namespace {
3914// Hexagon abstract base class
3915class HexagonTargetInfo : public TargetInfo {
3916 static const Builtin::Info BuiltinInfo[];
3917 static const char * const GCCRegNames[];
3918 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3919 std::string CPU;
3920public:
3921 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003922 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00003923 DescriptionString = ("e-p:32:32:32-"
Anshuman Dasgupta1a090f12013-01-02 21:25:57 +00003924 "i64:64:64-i32:32:32-i16:16:16-i1:32:32-"
Sirish Pande5f9688b2012-05-10 20:19:54 +00003925 "f64:64:64-f32:32:32-a0:0-n32");
Tony Linthicum96319392011-12-12 21:14:55 +00003926
3927 // {} in inline assembly are packet specifiers, not assembly variant
3928 // specifiers.
3929 NoAsmVariants = true;
3930 }
3931
3932 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3933 unsigned &NumRecords) const {
3934 Records = BuiltinInfo;
3935 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3936 }
3937
3938 virtual bool validateAsmConstraint(const char *&Name,
3939 TargetInfo::ConstraintInfo &Info) const {
3940 return true;
3941 }
3942
3943 virtual void getTargetDefines(const LangOptions &Opts,
3944 MacroBuilder &Builder) const;
3945
Douglas Gregore727d212012-01-30 06:38:25 +00003946 virtual bool hasFeature(StringRef Feature) const {
3947 return Feature == "hexagon";
3948 }
3949
Meador Ingec5613b22012-06-16 03:34:49 +00003950 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3951 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00003952 }
3953 virtual void getGCCRegNames(const char * const *&Names,
3954 unsigned &NumNames) const;
3955 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3956 unsigned &NumAliases) const;
3957 virtual const char *getClobbers() const {
3958 return "";
3959 }
Sebastian Pop43115d42012-01-13 20:37:10 +00003960
3961 static const char *getHexagonCPUSuffix(StringRef Name) {
3962 return llvm::StringSwitch<const char*>(Name)
3963 .Case("hexagonv2", "2")
3964 .Case("hexagonv3", "3")
3965 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00003966 .Case("hexagonv5", "5")
Sebastian Pop43115d42012-01-13 20:37:10 +00003967 .Default(0);
3968 }
3969
Tony Linthicum96319392011-12-12 21:14:55 +00003970 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00003971 if (!getHexagonCPUSuffix(Name))
3972 return false;
3973
Tony Linthicum96319392011-12-12 21:14:55 +00003974 CPU = Name;
3975 return true;
3976 }
3977};
3978
3979void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
3980 MacroBuilder &Builder) const {
3981 Builder.defineMacro("qdsp6");
3982 Builder.defineMacro("__qdsp6", "1");
3983 Builder.defineMacro("__qdsp6__", "1");
3984
3985 Builder.defineMacro("hexagon");
3986 Builder.defineMacro("__hexagon", "1");
3987 Builder.defineMacro("__hexagon__", "1");
3988
3989 if(CPU == "hexagonv1") {
3990 Builder.defineMacro("__HEXAGON_V1__");
3991 Builder.defineMacro("__HEXAGON_ARCH__", "1");
3992 if(Opts.HexagonQdsp6Compat) {
3993 Builder.defineMacro("__QDSP6_V1__");
3994 Builder.defineMacro("__QDSP6_ARCH__", "1");
3995 }
3996 }
3997 else if(CPU == "hexagonv2") {
3998 Builder.defineMacro("__HEXAGON_V2__");
3999 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4000 if(Opts.HexagonQdsp6Compat) {
4001 Builder.defineMacro("__QDSP6_V2__");
4002 Builder.defineMacro("__QDSP6_ARCH__", "2");
4003 }
4004 }
4005 else if(CPU == "hexagonv3") {
4006 Builder.defineMacro("__HEXAGON_V3__");
4007 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4008 if(Opts.HexagonQdsp6Compat) {
4009 Builder.defineMacro("__QDSP6_V3__");
4010 Builder.defineMacro("__QDSP6_ARCH__", "3");
4011 }
4012 }
4013 else if(CPU == "hexagonv4") {
4014 Builder.defineMacro("__HEXAGON_V4__");
4015 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4016 if(Opts.HexagonQdsp6Compat) {
4017 Builder.defineMacro("__QDSP6_V4__");
4018 Builder.defineMacro("__QDSP6_ARCH__", "4");
4019 }
4020 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00004021 else if(CPU == "hexagonv5") {
4022 Builder.defineMacro("__HEXAGON_V5__");
4023 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4024 if(Opts.HexagonQdsp6Compat) {
4025 Builder.defineMacro("__QDSP6_V5__");
4026 Builder.defineMacro("__QDSP6_ARCH__", "5");
4027 }
4028 }
Tony Linthicum96319392011-12-12 21:14:55 +00004029}
4030
4031const char * const HexagonTargetInfo::GCCRegNames[] = {
4032 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4033 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4034 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4035 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4036 "p0", "p1", "p2", "p3",
4037 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4038};
4039
4040void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4041 unsigned &NumNames) const {
4042 Names = GCCRegNames;
4043 NumNames = llvm::array_lengthof(GCCRegNames);
4044}
4045
4046
4047const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4048 { { "sp" }, "r29" },
4049 { { "fp" }, "r30" },
4050 { { "lr" }, "r31" },
4051 };
4052
4053void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4054 unsigned &NumAliases) const {
4055 Aliases = GCCRegAliases;
4056 NumAliases = llvm::array_lengthof(GCCRegAliases);
4057}
4058
4059
4060const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4061#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4062#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4063 ALL_LANGUAGES },
4064#include "clang/Basic/BuiltinsHexagon.def"
4065};
4066}
4067
4068
Reid Spencer5f016e22007-07-11 17:01:13 +00004069namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00004070class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00004071 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4072 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004073 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00004074public:
Eli Friedman01b86682008-08-20 07:28:14 +00004075 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
4076 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00004077 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 +00004078 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00004079 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004080 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00004081 StringRef Name,
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004082 bool Enabled) const {
4083 if (Name == "soft-float")
4084 Features[Name] = Enabled;
4085 else
4086 return false;
4087
4088 return true;
4089 }
4090 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
4091 SoftFloat = false;
4092 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4093 if (Features[i] == "+soft-float")
4094 SoftFloat = true;
4095 }
Chris Lattner33328642009-03-20 15:52:06 +00004096 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004097 MacroBuilder &Builder) const {
4098 DefineStd(Builder, "sparc", Opts);
4099 Builder.defineMacro("__sparcv8");
4100 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004101
4102 if (SoftFloat)
4103 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00004104 }
Douglas Gregore727d212012-01-30 06:38:25 +00004105
4106 virtual bool hasFeature(StringRef Feature) const {
4107 return llvm::StringSwitch<bool>(Feature)
4108 .Case("softfloat", SoftFloat)
4109 .Case("sparc", true)
4110 .Default(false);
4111 }
4112
Gabor Greif26658672008-02-21 16:29:08 +00004113 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4114 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004115 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00004116 }
Meador Ingec5613b22012-06-16 03:34:49 +00004117 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4118 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif26658672008-02-21 16:29:08 +00004119 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004120 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00004121 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004122 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00004123 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00004124 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00004125 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004126 // FIXME: Implement!
4127 return false;
Gabor Greif26658672008-02-21 16:29:08 +00004128 }
4129 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00004130 // FIXME: Implement!
4131 return "";
Gabor Greif26658672008-02-21 16:29:08 +00004132 }
4133};
4134
Chris Lattnere957f532009-01-27 01:58:38 +00004135const char * const SparcV8TargetInfo::GCCRegNames[] = {
4136 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4137 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4138 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4139 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4140};
4141
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004142void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00004143 unsigned &NumNames) const {
4144 Names = GCCRegNames;
4145 NumNames = llvm::array_lengthof(GCCRegNames);
4146}
4147
4148const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004149 { { "g0" }, "r0" },
4150 { { "g1" }, "r1" },
4151 { { "g2" }, "r2" },
4152 { { "g3" }, "r3" },
4153 { { "g4" }, "r4" },
4154 { { "g5" }, "r5" },
4155 { { "g6" }, "r6" },
4156 { { "g7" }, "r7" },
4157 { { "o0" }, "r8" },
4158 { { "o1" }, "r9" },
4159 { { "o2" }, "r10" },
4160 { { "o3" }, "r11" },
4161 { { "o4" }, "r12" },
4162 { { "o5" }, "r13" },
4163 { { "o6", "sp" }, "r14" },
4164 { { "o7" }, "r15" },
4165 { { "l0" }, "r16" },
4166 { { "l1" }, "r17" },
4167 { { "l2" }, "r18" },
4168 { { "l3" }, "r19" },
4169 { { "l4" }, "r20" },
4170 { { "l5" }, "r21" },
4171 { { "l6" }, "r22" },
4172 { { "l7" }, "r23" },
4173 { { "i0" }, "r24" },
4174 { { "i1" }, "r25" },
4175 { { "i2" }, "r26" },
4176 { { "i3" }, "r27" },
4177 { { "i4" }, "r28" },
4178 { { "i5" }, "r29" },
4179 { { "i6", "fp" }, "r30" },
4180 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00004181};
4182
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004183void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00004184 unsigned &NumAliases) const {
4185 Aliases = GCCRegAliases;
4186 NumAliases = llvm::array_lengthof(GCCRegAliases);
4187}
Gabor Greif26658672008-02-21 16:29:08 +00004188} // end anonymous namespace.
4189
Eli Friedman01b86682008-08-20 07:28:14 +00004190namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004191class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4192public:
4193 AuroraUXSparcV8TargetInfo(const std::string& triple) :
4194 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
4195 SizeType = UnsignedInt;
4196 PtrDiffType = SignedInt;
4197 }
4198};
Torok Edwin5f6c1942009-06-30 17:10:35 +00004199class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00004200public:
4201 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00004202 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00004203 SizeType = UnsignedInt;
4204 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00004205 }
4206};
4207} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00004208
Chris Lattner2621fd12008-05-08 05:58:21 +00004209namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004210 class MSP430TargetInfo : public TargetInfo {
4211 static const char * const GCCRegNames[];
4212 public:
4213 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004214 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004215 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00004216 IntWidth = 16; IntAlign = 16;
4217 LongWidth = 32; LongLongWidth = 64;
4218 LongAlign = LongLongAlign = 16;
4219 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004220 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004221 SizeType = UnsignedInt;
4222 IntMaxType = SignedLong;
4223 UIntMaxType = UnsignedLong;
4224 IntPtrType = SignedShort;
4225 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00004226 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00004227 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004228 }
4229 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004230 MacroBuilder &Builder) const {
4231 Builder.defineMacro("MSP430");
4232 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004233 // FIXME: defines for different 'flavours' of MCU
4234 }
4235 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4236 unsigned &NumRecords) const {
4237 // FIXME: Implement.
4238 Records = 0;
4239 NumRecords = 0;
4240 }
Douglas Gregore727d212012-01-30 06:38:25 +00004241 virtual bool hasFeature(StringRef Feature) const {
4242 return Feature == "msp430";
4243 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004244 virtual void getGCCRegNames(const char * const *&Names,
4245 unsigned &NumNames) const;
4246 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4247 unsigned &NumAliases) const {
4248 // No aliases.
4249 Aliases = 0;
4250 NumAliases = 0;
4251 }
4252 virtual bool validateAsmConstraint(const char *&Name,
4253 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00004254 // No target constraints for now.
4255 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004256 }
4257 virtual const char *getClobbers() const {
4258 // FIXME: Is this really right?
4259 return "";
4260 }
Meador Ingec5613b22012-06-16 03:34:49 +00004261 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004262 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00004263 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004264 }
4265 };
4266
4267 const char * const MSP430TargetInfo::GCCRegNames[] = {
4268 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4269 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4270 };
4271
4272 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4273 unsigned &NumNames) const {
4274 Names = GCCRegNames;
4275 NumNames = llvm::array_lengthof(GCCRegNames);
4276 }
4277}
4278
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00004279namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00004280
Mike Stump1eb44332009-09-09 15:08:12 +00004281 // LLVM and Clang cannot be used directly to output native binaries for
4282 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00004283 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00004284 //
4285 // TCE uses the llvm bitcode as input and uses it for generating customized
4286 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00004287 // publicly available in http://tce.cs.tut.fi
4288
Eli Friedman209f5bb2011-10-07 19:51:42 +00004289 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4290 3, // opencl_global
4291 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00004292 5, // opencl_constant
4293 0, // cuda_device
4294 0, // cuda_constant
4295 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00004296 };
4297
Eli Friedmanb63decf2009-08-19 20:47:07 +00004298 class TCETargetInfo : public TargetInfo{
4299 public:
4300 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
4301 TLSSupported = false;
4302 IntWidth = 32;
4303 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004304 PointerWidth = 32;
4305 IntAlign = 32;
4306 LongAlign = LongLongAlign = 32;
4307 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004308 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004309 SizeType = UnsignedInt;
4310 IntMaxType = SignedLong;
4311 UIntMaxType = UnsignedLong;
4312 IntPtrType = SignedInt;
4313 PtrDiffType = SignedInt;
4314 FloatWidth = 32;
4315 FloatAlign = 32;
4316 DoubleWidth = 32;
4317 DoubleAlign = 32;
4318 LongDoubleWidth = 32;
4319 LongDoubleAlign = 32;
4320 FloatFormat = &llvm::APFloat::IEEEsingle;
4321 DoubleFormat = &llvm::APFloat::IEEEsingle;
4322 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00004323 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
4324 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00004325 "f32:32:32-f64:32:32-v64:32:32-"
4326 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00004327 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004328 }
4329
4330 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004331 MacroBuilder &Builder) const {
4332 DefineStd(Builder, "tce", Opts);
4333 Builder.defineMacro("__TCE__");
4334 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00004335 }
Douglas Gregore727d212012-01-30 06:38:25 +00004336 virtual bool hasFeature(StringRef Feature) const {
4337 return Feature == "tce";
4338 }
4339
Eli Friedmanb63decf2009-08-19 20:47:07 +00004340 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4341 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00004342 virtual const char *getClobbers() const {
4343 return "";
4344 }
Meador Ingec5613b22012-06-16 03:34:49 +00004345 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4346 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004347 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00004348 virtual void getGCCRegNames(const char * const *&Names,
4349 unsigned &NumNames) const {}
4350 virtual bool validateAsmConstraint(const char *&Name,
4351 TargetInfo::ConstraintInfo &info) const {
4352 return true;
4353 }
4354 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4355 unsigned &NumAliases) const {}
4356 };
4357}
4358
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004359namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004360class MipsTargetInfoBase : public TargetInfo {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004361 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004362 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004363 bool IsMips16;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004364 enum MipsFloatABI {
4365 HardFloat, SingleFloat, SoftFloat
4366 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004367 enum DspRevEnum {
4368 NoDSP, DSP1, DSP2
4369 } DspRev;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004370
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004371protected:
4372 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004373
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004374public:
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004375 MipsTargetInfoBase(const std::string& triple,
4376 const std::string& ABIStr,
4377 const std::string& CPUStr)
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004378 : TargetInfo(triple),
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004379 CPU(CPUStr),
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004380 IsMips16(false),
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004381 FloatABI(HardFloat),
Simon Atanasyana1b62272012-07-05 20:16:22 +00004382 DspRev(NoDSP),
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004383 ABI(ABIStr)
4384 {}
4385
Eric Christophered734732010-03-02 02:41:08 +00004386 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004387 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00004388 virtual bool setCPU(const std::string &Name) {
4389 CPU = Name;
4390 return true;
4391 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004392 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00004393 Features[ABI] = true;
4394 Features[CPU] = true;
4395 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004396
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004397 virtual void getTargetDefines(const LangOptions &Opts,
4398 MacroBuilder &Builder) const {
Simon Atanasyand4935a02012-08-29 19:14:58 +00004399 DefineStd(Builder, "mips", Opts);
4400 Builder.defineMacro("_mips");
4401 Builder.defineMacro("__REGISTER_PREFIX__", "");
4402
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004403 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004404 case HardFloat:
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004405 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004406 break;
4407 case SingleFloat:
4408 Builder.defineMacro("__mips_hard_float", Twine(1));
4409 Builder.defineMacro("__mips_single_float", Twine(1));
4410 break;
4411 case SoftFloat:
4412 Builder.defineMacro("__mips_soft_float", Twine(1));
4413 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004414 }
Simon Atanasyan90913892012-04-05 19:28:31 +00004415
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004416 if (IsMips16)
4417 Builder.defineMacro("__mips16", Twine(1));
4418
Simon Atanasyana1b62272012-07-05 20:16:22 +00004419 switch (DspRev) {
4420 default:
4421 break;
4422 case DSP1:
4423 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4424 Builder.defineMacro("__mips_dsp", Twine(1));
4425 break;
4426 case DSP2:
4427 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4428 Builder.defineMacro("__mips_dspr2", Twine(1));
4429 Builder.defineMacro("__mips_dsp", Twine(1));
4430 break;
4431 }
4432
Simon Atanasyan90913892012-04-05 19:28:31 +00004433 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4434 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4435 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00004436
4437 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4438 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004439 }
4440
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004441 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4442 unsigned &NumRecords) const {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004443 Records = BuiltinInfo;
4444 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004445 }
Douglas Gregore727d212012-01-30 06:38:25 +00004446 virtual bool hasFeature(StringRef Feature) const {
4447 return Feature == "mips";
4448 }
Meador Ingec5613b22012-06-16 03:34:49 +00004449 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4450 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004451 }
4452 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004453 unsigned &NumNames) const {
4454 static const char * const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00004455 // CPU register names
4456 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004457 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4458 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4459 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004460 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4461 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004462 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4463 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4464 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4465 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004466 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004467 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
4468 "$fcc5","$fcc6","$fcc7"
4469 };
4470 Names = GCCRegNames;
4471 NumNames = llvm::array_lengthof(GCCRegNames);
4472 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004473 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004474 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004475 virtual bool validateAsmConstraint(const char *&Name,
4476 TargetInfo::ConstraintInfo &Info) const {
4477 switch (*Name) {
4478 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00004479 return false;
4480
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004481 case 'r': // CPU registers.
4482 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4483 case 'y': // Equivalent to "r", backwards compatibility only.
4484 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00004485 case 'c': // $25 for indirect jumps
4486 case 'l': // lo register
4487 case 'x': // hilo register pair
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004488 Info.setAllowsRegister();
4489 return true;
Jack Carter97102302013-03-05 19:10:54 +00004490 case 'R': // An address that can be used in a non-macro load or store
Jack Carterd2ab6d32013-03-04 21:36:11 +00004491 Info.setAllowsMemory();
4492 return true;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004493 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004494 }
4495
4496 virtual const char *getClobbers() const {
4497 // FIXME: Implement!
4498 return "";
4499 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004500
4501 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
4502 StringRef Name,
4503 bool Enabled) const {
Simon Atanasyan8b2a5d22012-04-18 12:00:11 +00004504 if (Name == "soft-float" || Name == "single-float" ||
4505 Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
4506 Name == "mips32" || Name == "mips32r2" ||
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00004507 Name == "mips64" || Name == "mips64r2" ||
Simon Atanasyand797a852012-07-05 19:23:00 +00004508 Name == "mips16" || Name == "dsp" || Name == "dspr2") {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004509 Features[Name] = Enabled;
4510 return true;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004511 } else if (Name == "32") {
4512 Features["o32"] = Enabled;
4513 return true;
4514 } else if (Name == "64") {
4515 Features["n64"] = Enabled;
4516 return true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004517 }
4518 return false;
4519 }
4520
4521 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004522 IsMips16 = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004523 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004524 DspRev = NoDSP;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004525
4526 for (std::vector<std::string>::iterator it = Features.begin(),
4527 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004528 if (*it == "+single-float")
4529 FloatABI = SingleFloat;
4530 else if (*it == "+soft-float")
4531 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004532 else if (*it == "+mips16")
4533 IsMips16 = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004534 else if (*it == "+dsp")
4535 DspRev = std::max(DspRev, DSP1);
4536 else if (*it == "+dspr2")
4537 DspRev = std::max(DspRev, DSP2);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004538 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004539
4540 // Remove front-end specific option.
4541 std::vector<std::string>::iterator it =
4542 std::find(Features.begin(), Features.end(), "+soft-float");
4543 if (it != Features.end())
4544 Features.erase(it);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004545 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004546
4547 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4548 if (RegNo == 0) return 4;
4549 if (RegNo == 1) return 5;
4550 return -1;
4551 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004552};
4553
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004554const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
4555#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4556#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4557 ALL_LANGUAGES },
4558#include "clang/Basic/BuiltinsMips.def"
4559};
4560
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004561class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004562public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004563 Mips32TargetInfoBase(const std::string& triple) :
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004564 MipsTargetInfoBase(triple, "o32", "mips32") {
Akira Hatanaka148735e2011-11-05 01:48:34 +00004565 SizeType = UnsignedInt;
4566 PtrDiffType = SignedInt;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004567 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka148735e2011-11-05 01:48:34 +00004568 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004569 virtual bool setABI(const std::string &Name) {
4570 if ((Name == "o32") || (Name == "eabi")) {
4571 ABI = Name;
4572 return true;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004573 } else if (Name == "32") {
4574 ABI = "o32";
4575 return true;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004576 } else
4577 return false;
4578 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004579 virtual void getTargetDefines(const LangOptions &Opts,
4580 MacroBuilder &Builder) const {
4581 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004582
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004583 if (ABI == "o32") {
4584 Builder.defineMacro("__mips_o32");
4585 Builder.defineMacro("_ABIO32", "1");
4586 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
4587 }
4588 else if (ABI == "eabi")
4589 Builder.defineMacro("__mips_eabi");
4590 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004591 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004592 }
4593 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4594 unsigned &NumAliases) const {
4595 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4596 { { "at" }, "$1" },
4597 { { "v0" }, "$2" },
4598 { { "v1" }, "$3" },
4599 { { "a0" }, "$4" },
4600 { { "a1" }, "$5" },
4601 { { "a2" }, "$6" },
4602 { { "a3" }, "$7" },
4603 { { "t0" }, "$8" },
4604 { { "t1" }, "$9" },
4605 { { "t2" }, "$10" },
4606 { { "t3" }, "$11" },
4607 { { "t4" }, "$12" },
4608 { { "t5" }, "$13" },
4609 { { "t6" }, "$14" },
4610 { { "t7" }, "$15" },
4611 { { "s0" }, "$16" },
4612 { { "s1" }, "$17" },
4613 { { "s2" }, "$18" },
4614 { { "s3" }, "$19" },
4615 { { "s4" }, "$20" },
4616 { { "s5" }, "$21" },
4617 { { "s6" }, "$22" },
4618 { { "s7" }, "$23" },
4619 { { "t8" }, "$24" },
4620 { { "t9" }, "$25" },
4621 { { "k0" }, "$26" },
4622 { { "k1" }, "$27" },
4623 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00004624 { { "sp","$sp" }, "$29" },
4625 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004626 { { "ra" }, "$31" }
4627 };
4628 Aliases = GCCRegAliases;
4629 NumAliases = llvm::array_lengthof(GCCRegAliases);
4630 }
4631};
4632
4633class Mips32EBTargetInfo : public Mips32TargetInfoBase {
4634public:
4635 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
4636 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 +00004637 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004638 }
4639 virtual void getTargetDefines(const LangOptions &Opts,
4640 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004641 DefineStd(Builder, "MIPSEB", Opts);
4642 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004643 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004644 }
4645};
4646
4647class Mips32ELTargetInfo : public Mips32TargetInfoBase {
4648public:
4649 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004650 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004651 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 +00004652 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004653 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004654 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004655 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004656 DefineStd(Builder, "MIPSEL", Opts);
4657 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004658 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004659 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004660};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004661
4662class Mips64TargetInfoBase : public MipsTargetInfoBase {
4663 virtual void SetDescriptionString(const std::string &Name) = 0;
4664public:
4665 Mips64TargetInfoBase(const std::string& triple) :
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004666 MipsTargetInfoBase(triple, "n64", "mips64") {
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004667 LongWidth = LongAlign = 64;
4668 PointerWidth = PointerAlign = 64;
4669 LongDoubleWidth = LongDoubleAlign = 128;
4670 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00004671 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
4672 LongDoubleWidth = LongDoubleAlign = 64;
4673 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4674 }
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004675 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004676 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004677 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004678 virtual bool setABI(const std::string &Name) {
4679 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004680 if (Name == "n32") {
4681 LongWidth = LongAlign = 32;
4682 PointerWidth = PointerAlign = 32;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004683 ABI = Name;
4684 return true;
4685 } else if (Name == "n64") {
4686 ABI = Name;
4687 return true;
4688 } else if (Name == "64") {
4689 ABI = "n64";
4690 return true;
4691 } else
4692 return false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004693 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004694 virtual void getTargetDefines(const LangOptions &Opts,
4695 MacroBuilder &Builder) const {
4696 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004697
Simon Atanasyan600a5132012-08-29 20:50:11 +00004698 Builder.defineMacro("__mips64");
4699 Builder.defineMacro("__mips64__");
4700
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004701 if (ABI == "n32") {
4702 Builder.defineMacro("__mips_n32");
4703 Builder.defineMacro("_ABIN32", "2");
4704 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
4705 }
4706 else if (ABI == "n64") {
4707 Builder.defineMacro("__mips_n64");
4708 Builder.defineMacro("_ABI64", "3");
4709 Builder.defineMacro("_MIPS_SIM", "_ABI64");
4710 }
4711 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004712 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004713 }
4714 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4715 unsigned &NumAliases) const {
4716 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4717 { { "at" }, "$1" },
4718 { { "v0" }, "$2" },
4719 { { "v1" }, "$3" },
4720 { { "a0" }, "$4" },
4721 { { "a1" }, "$5" },
4722 { { "a2" }, "$6" },
4723 { { "a3" }, "$7" },
4724 { { "a4" }, "$8" },
4725 { { "a5" }, "$9" },
4726 { { "a6" }, "$10" },
4727 { { "a7" }, "$11" },
4728 { { "t0" }, "$12" },
4729 { { "t1" }, "$13" },
4730 { { "t2" }, "$14" },
4731 { { "t3" }, "$15" },
4732 { { "s0" }, "$16" },
4733 { { "s1" }, "$17" },
4734 { { "s2" }, "$18" },
4735 { { "s3" }, "$19" },
4736 { { "s4" }, "$20" },
4737 { { "s5" }, "$21" },
4738 { { "s6" }, "$22" },
4739 { { "s7" }, "$23" },
4740 { { "t8" }, "$24" },
4741 { { "t9" }, "$25" },
4742 { { "k0" }, "$26" },
4743 { { "k1" }, "$27" },
4744 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00004745 { { "sp","$sp" }, "$29" },
4746 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004747 { { "ra" }, "$31" }
4748 };
4749 Aliases = GCCRegAliases;
4750 NumAliases = llvm::array_lengthof(GCCRegAliases);
4751 }
4752};
4753
4754class Mips64EBTargetInfo : public Mips64TargetInfoBase {
4755 virtual void SetDescriptionString(const std::string &Name) {
4756 // Change DescriptionString only if ABI is n32.
4757 if (Name == "n32")
4758 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 +00004759 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004760 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004761 }
4762public:
4763 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
4764 // Default ABI is n64.
4765 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 +00004766 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004767 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004768 }
4769 virtual void getTargetDefines(const LangOptions &Opts,
4770 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004771 DefineStd(Builder, "MIPSEB", Opts);
4772 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004773 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004774 }
4775};
4776
4777class Mips64ELTargetInfo : public Mips64TargetInfoBase {
4778 virtual void SetDescriptionString(const std::string &Name) {
4779 // Change DescriptionString only if ABI is n32.
4780 if (Name == "n32")
4781 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 +00004782 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004783 "-v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004784 }
4785public:
4786 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004787 // Default ABI is n64.
4788 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004789 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 +00004790 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004791 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004792 }
4793 virtual void getTargetDefines(const LangOptions &Opts,
4794 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004795 DefineStd(Builder, "MIPSEL", Opts);
4796 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004797 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004798 }
4799};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004800} // end anonymous namespace.
4801
Ivan Krasinef05abd2011-08-24 20:22:22 +00004802namespace {
4803class PNaClTargetInfo : public TargetInfo {
4804public:
4805 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004806 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00004807 this->UserLabelPrefix = "";
4808 this->LongAlign = 32;
4809 this->LongWidth = 32;
4810 this->PointerAlign = 32;
4811 this->PointerWidth = 32;
4812 this->IntMaxType = TargetInfo::SignedLongLong;
4813 this->UIntMaxType = TargetInfo::UnsignedLongLong;
4814 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00004815 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00004816 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00004817 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00004818 this->SizeType = TargetInfo::UnsignedInt;
4819 this->PtrDiffType = TargetInfo::SignedInt;
4820 this->IntPtrType = TargetInfo::SignedInt;
David Meyerdd4a8892011-10-11 03:12:01 +00004821 this->RegParmMax = 2;
Ivan Krasinef05abd2011-08-24 20:22:22 +00004822 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
4823 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
4824 }
4825
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004826 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00004827 }
4828 virtual void getArchDefines(const LangOptions &Opts,
4829 MacroBuilder &Builder) const {
4830 Builder.defineMacro("__le32__");
4831 Builder.defineMacro("__pnacl__");
4832 }
4833 virtual void getTargetDefines(const LangOptions &Opts,
4834 MacroBuilder &Builder) const {
Jan Wen Voungdde3bdb2012-03-29 00:05:59 +00004835 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasinef05abd2011-08-24 20:22:22 +00004836 getArchDefines(Opts, Builder);
4837 }
Douglas Gregore727d212012-01-30 06:38:25 +00004838 virtual bool hasFeature(StringRef Feature) const {
4839 return Feature == "pnacl";
4840 }
Ivan Krasinef05abd2011-08-24 20:22:22 +00004841 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4842 unsigned &NumRecords) const {
4843 }
Meador Ingec5613b22012-06-16 03:34:49 +00004844 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4845 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00004846 }
4847 virtual void getGCCRegNames(const char * const *&Names,
4848 unsigned &NumNames) const;
4849 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4850 unsigned &NumAliases) const;
4851 virtual bool validateAsmConstraint(const char *&Name,
4852 TargetInfo::ConstraintInfo &Info) const {
4853 return false;
4854 }
4855
4856 virtual const char *getClobbers() const {
4857 return "";
4858 }
4859};
4860
4861void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
4862 unsigned &NumNames) const {
4863 Names = NULL;
4864 NumNames = 0;
4865}
4866
4867void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4868 unsigned &NumAliases) const {
4869 Aliases = NULL;
4870 NumAliases = 0;
4871}
4872} // end anonymous namespace.
4873
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004874namespace {
4875 static const unsigned SPIRAddrSpaceMap[] = {
4876 1, // opencl_global
4877 3, // opencl_local
4878 2, // opencl_constant
4879 0, // cuda_device
4880 0, // cuda_constant
4881 0 // cuda_shared
4882 };
4883 class SPIRTargetInfo : public TargetInfo {
4884 static const char * const GCCRegNames[];
4885 static const Builtin::Info BuiltinInfo[];
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00004886 std::vector<StringRef> AvailableFeatures;
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004887 public:
4888 SPIRTargetInfo(const std::string& triple) : TargetInfo(triple) {
4889 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
4890 "SPIR target must use unknown OS");
4891 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
4892 "SPIR target must use unknown environment type");
4893 BigEndian = false;
4894 TLSSupported = false;
4895 LongWidth = LongAlign = 64;
4896 AddrSpaceMap = &SPIRAddrSpaceMap;
4897 // Define available target features
4898 // These must be defined in sorted order!
4899 NoAsmVariants = true;
4900 }
4901 virtual void getTargetDefines(const LangOptions &Opts,
4902 MacroBuilder &Builder) const {
4903 DefineStd(Builder, "SPIR", Opts);
4904 }
4905 virtual bool hasFeature(StringRef Feature) const {
4906 return Feature == "spir";
4907 }
4908
4909 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4910 unsigned &NumRecords) const {}
4911 virtual const char *getClobbers() const {
4912 return "";
4913 }
4914 virtual void getGCCRegNames(const char * const *&Names,
4915 unsigned &NumNames) const {}
4916 virtual bool validateAsmConstraint(const char *&Name,
4917 TargetInfo::ConstraintInfo &info) const {
4918 return true;
4919 }
4920 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4921 unsigned &NumAliases) const {}
4922 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4923 return TargetInfo::VoidPtrBuiltinVaList;
4924 }
4925 };
4926
4927
4928 class SPIR32TargetInfo : public SPIRTargetInfo {
4929 public:
4930 SPIR32TargetInfo(const std::string& triple) : SPIRTargetInfo(triple) {
4931 PointerWidth = PointerAlign = 32;
4932 SizeType = TargetInfo::UnsignedInt;
4933 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
4934 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00004935 = "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 +00004936 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
4937 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
4938 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00004939 }
4940 virtual void getTargetDefines(const LangOptions &Opts,
4941 MacroBuilder &Builder) const {
4942 DefineStd(Builder, "SPIR32", Opts);
4943 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004944 };
4945
4946 class SPIR64TargetInfo : public SPIRTargetInfo {
4947 public:
4948 SPIR64TargetInfo(const std::string& triple) : SPIRTargetInfo(triple) {
4949 PointerWidth = PointerAlign = 64;
4950 SizeType = TargetInfo::UnsignedLong;
4951 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
4952 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00004953 = "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 +00004954 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
4955 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
4956 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00004957 }
4958 virtual void getTargetDefines(const LangOptions &Opts,
4959 MacroBuilder &Builder) const {
4960 DefineStd(Builder, "SPIR64", Opts);
4961 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004962 };
4963}
4964
Ivan Krasinef05abd2011-08-24 20:22:22 +00004965
Reid Spencer5f016e22007-07-11 17:01:13 +00004966//===----------------------------------------------------------------------===//
4967// Driver code
4968//===----------------------------------------------------------------------===//
4969
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004970static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004971 llvm::Triple Triple(T);
4972 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00004973
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004974 switch (Triple.getArch()) {
4975 default:
4976 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00004977
Tony Linthicum96319392011-12-12 21:14:55 +00004978 case llvm::Triple::hexagon:
4979 return new HexagonTargetInfo(T);
4980
Tim Northoverc264e162013-01-31 12:13:10 +00004981 case llvm::Triple::aarch64:
4982 switch (os) {
4983 case llvm::Triple::Linux:
4984 return new LinuxTargetInfo<AArch64TargetInfo>(T);
4985 default:
4986 return new AArch64TargetInfo(T);
4987 }
4988
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004989 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00004990 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004991 if (Triple.isOSDarwin())
4992 return new DarwinARMTargetInfo(T);
4993
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004994 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00004995 case llvm::Triple::Linux:
4996 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004997 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00004998 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004999 case llvm::Triple::NetBSD:
5000 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005001 case llvm::Triple::OpenBSD:
5002 return new OpenBSDTargetInfo<ARMTargetInfo>(T);
Eli Friedman42f74f22012-08-08 23:57:20 +00005003 case llvm::Triple::Bitrig:
5004 return new BitrigTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00005005 case llvm::Triple::RTEMS:
5006 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005007 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00005008 return new NaClTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005009 default:
5010 return new ARMTargetInfo(T);
5011 }
Eli Friedman61538a72008-05-20 14:21:01 +00005012
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005013 case llvm::Triple::msp430:
5014 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00005015
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005016 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005017 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005018 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005019 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005020 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005021 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005022 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005023 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005024 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005025 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005026 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005027 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005028 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005029
5030 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005031 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005032 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005033 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005034 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005035 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005036 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005037 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005038 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005039 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005040 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005041 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005042 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005043
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005044 case llvm::Triple::mips64:
5045 switch (os) {
5046 case llvm::Triple::Linux:
5047 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
5048 case llvm::Triple::RTEMS:
5049 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
5050 case llvm::Triple::FreeBSD:
5051 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
5052 case llvm::Triple::NetBSD:
5053 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005054 case llvm::Triple::OpenBSD:
5055 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(T);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005056 default:
5057 return new Mips64EBTargetInfo(T);
5058 }
5059
5060 case llvm::Triple::mips64el:
5061 switch (os) {
5062 case llvm::Triple::Linux:
5063 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
5064 case llvm::Triple::RTEMS:
5065 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
5066 case llvm::Triple::FreeBSD:
5067 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
5068 case llvm::Triple::NetBSD:
5069 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005070 case llvm::Triple::OpenBSD:
5071 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(T);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005072 default:
5073 return new Mips64ELTargetInfo(T);
5074 }
5075
Ivan Krasinef05abd2011-08-24 20:22:22 +00005076 case llvm::Triple::le32:
5077 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00005078 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00005079 return new NaClTargetInfo<PNaClTargetInfo>(T);
Ivan Krasinef05abd2011-08-24 20:22:22 +00005080 default:
5081 return NULL;
5082 }
5083
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005084 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005085 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00005086 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005087 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005088 case llvm::Triple::Linux:
5089 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005090 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00005091 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005092 case llvm::Triple::NetBSD:
5093 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005094 case llvm::Triple::OpenBSD:
5095 return new OpenBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005096 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00005097 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005098 default:
5099 return new PPC32TargetInfo(T);
5100 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005101
5102 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005103 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00005104 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005105 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005106 case llvm::Triple::Linux:
5107 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005108 case llvm::Triple::Lv2:
John Thompson3f6918a2009-11-19 17:18:50 +00005109 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005110 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00005111 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005112 case llvm::Triple::NetBSD:
5113 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
5114 default:
5115 return new PPC64TargetInfo(T);
5116 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005117
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005118 case llvm::Triple::nvptx:
5119 return new NVPTX32TargetInfo(T);
5120 case llvm::Triple::nvptx64:
5121 return new NVPTX64TargetInfo(T);
5122
Chris Lattner9cbeb632010-03-06 21:21:27 +00005123 case llvm::Triple::mblaze:
5124 return new MBlazeTargetInfo(T);
5125
Eli Friedman6505a292012-10-12 23:32:00 +00005126 case llvm::Triple::r600:
5127 return new R600TargetInfo(T);
5128
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005129 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005130 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005131 case llvm::Triple::Linux:
5132 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005133 case llvm::Triple::AuroraUX:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005134 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005135 case llvm::Triple::Solaris:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005136 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005137 case llvm::Triple::NetBSD:
5138 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005139 case llvm::Triple::OpenBSD:
5140 return new OpenBSDTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005141 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00005142 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005143 default:
5144 return new SparcV8TargetInfo(T);
5145 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005146
Eli Friedmanb63decf2009-08-19 20:47:07 +00005147 case llvm::Triple::tce:
5148 return new TCETargetInfo(T);
5149
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005150 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005151 if (Triple.isOSDarwin())
5152 return new DarwinI386TargetInfo(T);
5153
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005154 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005155 case llvm::Triple::AuroraUX:
5156 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005157 case llvm::Triple::Linux:
5158 return new LinuxTargetInfo<X86_32TargetInfo>(T);
5159 case llvm::Triple::DragonFly:
5160 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
5161 case llvm::Triple::NetBSD:
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00005162 return new NetBSDI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005163 case llvm::Triple::OpenBSD:
5164 return new OpenBSDI386TargetInfo(T);
Eli Friedman42f74f22012-08-08 23:57:20 +00005165 case llvm::Triple::Bitrig:
5166 return new BitrigI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005167 case llvm::Triple::FreeBSD:
5168 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00005169 case llvm::Triple::Minix:
5170 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005171 case llvm::Triple::Solaris:
5172 return new SolarisTargetInfo<X86_32TargetInfo>(T);
5173 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005174 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005175 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005176 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005177 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00005178 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00005179 case llvm::Triple::Haiku:
5180 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00005181 case llvm::Triple::RTEMS:
5182 return new RTEMSX86_32TargetInfo(T);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005183 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00005184 return new NaClTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005185 default:
5186 return new X86_32TargetInfo(T);
5187 }
5188
5189 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005190 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
5191 return new DarwinX86_64TargetInfo(T);
5192
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005193 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005194 case llvm::Triple::AuroraUX:
5195 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005196 case llvm::Triple::Linux:
5197 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00005198 case llvm::Triple::DragonFly:
5199 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005200 case llvm::Triple::NetBSD:
5201 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
5202 case llvm::Triple::OpenBSD:
5203 return new OpenBSDX86_64TargetInfo(T);
Eli Friedman42f74f22012-08-08 23:57:20 +00005204 case llvm::Triple::Bitrig:
5205 return new BitrigX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005206 case llvm::Triple::FreeBSD:
5207 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
5208 case llvm::Triple::Solaris:
5209 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00005210 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005211 return new MinGWX86_64TargetInfo(T);
5212 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005213 return new VisualStudioWindowsX86_64TargetInfo(T);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005214 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00005215 return new NaClTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005216 default:
5217 return new X86_64TargetInfo(T);
5218 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005219
5220 case llvm::Triple::spir: {
5221 llvm::Triple Triple(T);
5222 if (Triple.getOS() != llvm::Triple::UnknownOS ||
5223 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
5224 return NULL;
5225 return new SPIR32TargetInfo(T);
5226 }
5227 case llvm::Triple::spir64: {
5228 llvm::Triple Triple(T);
5229 if (Triple.getOS() != llvm::Triple::UnknownOS ||
5230 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
5231 return NULL;
5232 return new SPIR64TargetInfo(T);
5233 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005234 }
Reid Spencer5f016e22007-07-11 17:01:13 +00005235}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005236
5237/// CreateTargetInfo - Return the target info object for the specified target
5238/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00005239TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregor49a87542012-11-16 04:24:59 +00005240 TargetOptions *Opts) {
5241 llvm::Triple Triple(Opts->Triple);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005242
5243 // Construct the target
Dylan Noblesmith6f42b622012-02-05 02:12:40 +00005244 OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005245 if (!Target) {
5246 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5247 return 0;
5248 }
Douglas Gregor9a022bb2012-10-15 16:45:32 +00005249 Target->setTargetOpts(Opts);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005250
Daniel Dunbareac7c532009-12-18 18:42:37 +00005251 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005252 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5253 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbareac7c532009-12-18 18:42:37 +00005254 return 0;
5255 }
5256
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005257 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005258 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5259 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005260 return 0;
5261 }
5262
Charles Davis98b7c5c2010-06-11 01:06:47 +00005263 // Set the target C++ ABI.
Douglas Gregor49a87542012-11-16 04:24:59 +00005264 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5265 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis98b7c5c2010-06-11 01:06:47 +00005266 return 0;
5267 }
5268
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005269 // Compute the default target features, we need the target to handle this
5270 // because features may have dependencies on one another.
5271 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00005272 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005273
5274 // Apply the user specified deltas.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005275 // First the enables.
Douglas Gregor57016dd2012-10-16 23:40:58 +00005276 for (std::vector<std::string>::const_iterator
Douglas Gregor49a87542012-11-16 04:24:59 +00005277 it = Opts->FeaturesAsWritten.begin(),
5278 ie = Opts->FeaturesAsWritten.end();
Douglas Gregor57016dd2012-10-16 23:40:58 +00005279 it != ie; ++it) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005280 const char *Name = it->c_str();
5281
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005282 if (Name[0] != '+')
5283 continue;
5284
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005285 // Apply the feature via the target.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005286 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
5287 Diags.Report(diag::err_target_invalid_feature) << Name;
5288 return 0;
5289 }
5290 }
5291
5292 // Then the disables.
Douglas Gregor57016dd2012-10-16 23:40:58 +00005293 for (std::vector<std::string>::const_iterator
Douglas Gregor49a87542012-11-16 04:24:59 +00005294 it = Opts->FeaturesAsWritten.begin(),
5295 ie = Opts->FeaturesAsWritten.end();
Douglas Gregor57016dd2012-10-16 23:40:58 +00005296 it != ie; ++it) {
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005297 const char *Name = it->c_str();
5298
5299 if (Name[0] == '+')
5300 continue;
5301
5302 // Apply the feature via the target.
5303 if (Name[0] != '-' ||
5304 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005305 Diags.Report(diag::err_target_invalid_feature) << Name;
5306 return 0;
5307 }
5308 }
5309
5310 // Add the features to the compile options.
5311 //
5312 // FIXME: If we are completely confident that we have the right set, we only
5313 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00005314 Opts->Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005315 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5316 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00005317 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
5318 Target->HandleTargetFeatures(Opts->Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005319
5320 return Target.take();
5321}