blob: 92dd54b9bb8db140ac3a99d2815741f164cbf64e [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"
Chris Lattner797c3c42009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie9fe8c742011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Dale Johannesen1e592cb2010-10-29 23:24:33 +000030#include "llvm/Type.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");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000095
John McCall098df7f2011-06-16 00:03:19 +000096 if (!Opts.ObjCAutoRefCount) {
John McCallf85e1932011-06-15 23:02:42 +000097 // __weak is always defined, for use in blocks and with objc pointers.
98 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000099
John McCallf85e1932011-06-15 23:02:42 +0000100 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregore289d812011-09-13 17:21:33 +0000101 if (Opts.getGC() != LangOptions::NonGC)
John McCallf85e1932011-06-15 23:02:42 +0000102 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
103 else
104 Builder.defineMacro("__strong", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +0000105
John McCallf85e1932011-06-15 23:02:42 +0000106 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
107 // allow this in C, since one might have block pointers in structs that
108 // are used in pure C code and in Objective-C ARC.
109 Builder.defineMacro("__unsafe_unretained", "");
John McCallf85e1932011-06-15 23:02:42 +0000110 }
Eric Christopher7c9adf92011-07-07 22:55:26 +0000111
Eli Friedman2de4fee2009-06-04 23:00:29 +0000112 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +0000113 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +0000114 else
Benjamin Kramera9992772010-01-09 17:55:51 +0000115 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000116
117 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000118 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000119
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000120 // Get the platform type and version number from the triple.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000121 unsigned Maj, Min, Rev;
Bob Wilson48b68a02012-01-31 23:52:58 +0000122 if (Triple.isMacOSX()) {
123 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000124 PlatformName = "macosx";
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000125 } else {
Bob Wilson48b68a02012-01-31 23:52:58 +0000126 Triple.getOSVersion(Maj, Min, Rev);
127 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000128 }
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000129
Sebastian Pop9ec60df2012-01-20 22:01:23 +0000130 // If -target arch-pc-win32-macho option specified, we're
Eric Christopher895d4222011-07-29 21:20:35 +0000131 // generating code for Win32 ABI. No need to emit
Chad Rosierd9259f32011-07-19 20:00:06 +0000132 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
133 if (PlatformName == "win32") {
134 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
135 return;
136 }
137
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000138 // Set the appropriate OS version define.
Bob Wilson48b68a02012-01-31 23:52:58 +0000139 if (Triple.getOS() == llvm::Triple::IOS) {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000140 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000141 char Str[6];
142 Str[0] = '0' + Maj;
143 Str[1] = '0' + (Min / 10);
144 Str[2] = '0' + (Min % 10);
145 Str[3] = '0' + (Rev / 10);
146 Str[4] = '0' + (Rev % 10);
147 Str[5] = '\0';
148 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
149 } else {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000150 // Note that the Driver allows versions which aren't representable in the
151 // define (because we only get a single digit for the minor and micro
152 // revision numbers). So, we limit them to the maximum representable
153 // version.
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000154 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000155 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000156 char Str[5];
157 Str[0] = '0' + (Maj / 10);
158 Str[1] = '0' + (Maj % 10);
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000159 Str[2] = '0' + std::min(Min, 9U);
160 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000161 Str[4] = '\0';
162 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000163 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000164
165 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman618234a2008-08-20 02:34:37 +0000166}
Reid Spencer5f016e22007-07-11 17:01:13 +0000167
Chris Lattner797c3c42009-08-10 19:03:04 +0000168namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000169template<typename Target>
170class DarwinTargetInfo : public OSTargetInfo<Target> {
171protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000172 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000173 MacroBuilder &Builder) const {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000174 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000175 this->PlatformMinVersion);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000176 }
Mike Stump1eb44332009-09-09 15:08:12 +0000177
Torok Edwin5f6c1942009-06-30 17:10:35 +0000178public:
179 DarwinTargetInfo(const std::string& triple) :
180 OSTargetInfo<Target>(triple) {
Eric Christopheraa7333c2011-07-02 00:20:22 +0000181 llvm::Triple T = llvm::Triple(triple);
182 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000183 this->MCountName = "\01mcount";
Torok Edwin5f6c1942009-06-30 17:10:35 +0000184 }
185
Chris Lattner5f9e2722011-07-23 10:55:15 +0000186 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000187 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000188 StringRef Segment, Section;
Chris Lattner797c3c42009-08-10 19:03:04 +0000189 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000190 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000191 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000192 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000193 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000194
Anders Carlsson18af3682010-06-08 22:47:50 +0000195 virtual const char *getStaticInitSectionSpecifier() const {
196 // FIXME: We should return 0 when building kexts.
197 return "__TEXT,__StaticInit,regular,pure_instructions";
198 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000199
John McCall41887602012-01-29 01:20:30 +0000200 /// Darwin does not support protected visibility. Darwin's "default"
201 /// is very similar to ELF's "protected"; Darwin requires a "weak"
202 /// attribute on declarations that can be dynamically replaced.
203 virtual bool hasProtectedVisibility() const {
204 return false;
205 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000206};
207
Chris Lattner797c3c42009-08-10 19:03:04 +0000208
Torok Edwin5f6c1942009-06-30 17:10:35 +0000209// DragonFlyBSD Target
210template<typename Target>
211class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
212protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000213 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000214 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000215 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000216 Builder.defineMacro("__DragonFly__");
217 Builder.defineMacro("__DragonFly_cc_version", "100001");
218 Builder.defineMacro("__ELF__");
219 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
220 Builder.defineMacro("__tune_i386__");
221 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000222 }
223public:
Mike Stump1eb44332009-09-09 15:08:12 +0000224 DragonFlyBSDTargetInfo(const std::string &triple)
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000225 : OSTargetInfo<Target>(triple) {
226 this->UserLabelPrefix = "";
227
228 llvm::Triple Triple(triple);
229 switch (Triple.getArch()) {
230 default:
231 case llvm::Triple::x86:
232 case llvm::Triple::x86_64:
233 this->MCountName = ".mcount";
234 break;
235 }
236 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000237};
238
239// FreeBSD Target
240template<typename Target>
241class FreeBSDTargetInfo : public OSTargetInfo<Target> {
242protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000243 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000244 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000245 // FreeBSD defines; list based off of gcc output
246
Benjamin Kramer474202f2011-10-18 10:10:08 +0000247 unsigned Release = Triple.getOSMajorVersion();
248 if (Release == 0U)
249 Release = 8;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000250
Benjamin Kramer474202f2011-10-18 10:10:08 +0000251 Builder.defineMacro("__FreeBSD__", Twine(Release));
252 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramera9992772010-01-09 17:55:51 +0000253 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
254 DefineStd(Builder, "unix", Opts);
255 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000256 }
257public:
Mike Stump1eb44332009-09-09 15:08:12 +0000258 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000259 : OSTargetInfo<Target>(triple) {
260 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000261
262 llvm::Triple Triple(triple);
263 switch (Triple.getArch()) {
264 default:
265 case llvm::Triple::x86:
266 case llvm::Triple::x86_64:
267 this->MCountName = ".mcount";
268 break;
269 case llvm::Triple::mips:
270 case llvm::Triple::mipsel:
271 case llvm::Triple::ppc:
272 case llvm::Triple::ppc64:
273 this->MCountName = "_mcount";
274 break;
275 case llvm::Triple::arm:
276 this->MCountName = "__mcount";
277 break;
278 }
279
Duncan Sands1e90faf2009-07-08 13:55:08 +0000280 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000281};
282
Chris Lattner38e317d2010-07-07 16:01:42 +0000283// Minix Target
284template<typename Target>
285class MinixTargetInfo : public OSTargetInfo<Target> {
286protected:
287 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
288 MacroBuilder &Builder) const {
289 // Minix defines
290
291 Builder.defineMacro("__minix", "3");
292 Builder.defineMacro("_EM_WSIZE", "4");
293 Builder.defineMacro("_EM_PSIZE", "4");
294 Builder.defineMacro("_EM_SSIZE", "2");
295 Builder.defineMacro("_EM_LSIZE", "4");
296 Builder.defineMacro("_EM_FSIZE", "4");
297 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000298 Builder.defineMacro("__ELF__");
Chris Lattner38e317d2010-07-07 16:01:42 +0000299 DefineStd(Builder, "unix", Opts);
300 }
301public:
302 MinixTargetInfo(const std::string &triple)
303 : OSTargetInfo<Target>(triple) {
304 this->UserLabelPrefix = "";
305 }
306};
307
Torok Edwin5f6c1942009-06-30 17:10:35 +0000308// Linux target
309template<typename Target>
310class LinuxTargetInfo : public OSTargetInfo<Target> {
311protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000312 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000313 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000314 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000315 DefineStd(Builder, "unix", Opts);
316 DefineStd(Builder, "linux", Opts);
317 Builder.defineMacro("__gnu_linux__");
318 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000319 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000320 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000321 if (Opts.CPlusPlus)
322 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000323 }
324public:
Mike Stump1eb44332009-09-09 15:08:12 +0000325 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000326 : OSTargetInfo<Target>(triple) {
327 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000328 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000329 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000330
331 virtual const char *getStaticInitSectionSpecifier() const {
332 return ".text.startup";
333 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000334};
335
Chris Lattnerb62bb282009-07-13 20:29:08 +0000336// NetBSD Target
337template<typename Target>
338class NetBSDTargetInfo : public OSTargetInfo<Target> {
339protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000340 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000341 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000342 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000343 Builder.defineMacro("__NetBSD__");
344 Builder.defineMacro("__unix__");
345 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000346 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000347 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000348 }
349public:
Mike Stump1eb44332009-09-09 15:08:12 +0000350 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000351 : OSTargetInfo<Target>(triple) {
352 this->UserLabelPrefix = "";
353 }
354};
355
Torok Edwin5f6c1942009-06-30 17:10:35 +0000356// OpenBSD Target
357template<typename Target>
358class OpenBSDTargetInfo : public OSTargetInfo<Target> {
359protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000360 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000361 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000362 // OpenBSD defines; list based off of gcc output
363
Benjamin Kramera9992772010-01-09 17:55:51 +0000364 Builder.defineMacro("__OpenBSD__");
365 DefineStd(Builder, "unix", Opts);
366 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000367 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000368 Builder.defineMacro("_POSIX_THREADS");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000369 }
370public:
Mike Stump1eb44332009-09-09 15:08:12 +0000371 OpenBSDTargetInfo(const std::string &triple)
Eli Friedman62d829a2011-12-15 02:15:56 +0000372 : OSTargetInfo<Target>(triple) {
373 this->UserLabelPrefix = "";
374
375 llvm::Triple Triple(triple);
376 switch (Triple.getArch()) {
377 default:
378 case llvm::Triple::x86:
379 case llvm::Triple::x86_64:
380 case llvm::Triple::arm:
381 case llvm::Triple::sparc:
382 this->MCountName = "__mcount";
383 break;
384 case llvm::Triple::mips64:
385 case llvm::Triple::mips64el:
386 case llvm::Triple::ppc:
387 case llvm::Triple::sparcv9:
388 this->MCountName = "_mcount";
389 break;
390 }
391 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000392};
393
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000394// PSP Target
395template<typename Target>
396class PSPTargetInfo : public OSTargetInfo<Target> {
397protected:
398 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000399 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000400 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000401 Builder.defineMacro("PSP");
402 Builder.defineMacro("_PSP");
403 Builder.defineMacro("__psp__");
404 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000405 }
406public:
407 PSPTargetInfo(const std::string& triple)
408 : OSTargetInfo<Target>(triple) {
409 this->UserLabelPrefix = "";
410 }
411};
412
John Thompson3f6918a2009-11-19 17:18:50 +0000413// PS3 PPU Target
414template<typename Target>
415class PS3PPUTargetInfo : public OSTargetInfo<Target> {
416protected:
417 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000418 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000419 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000420 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000421 Builder.defineMacro("__PPU__");
422 Builder.defineMacro("__CELLOS_LV2__");
423 Builder.defineMacro("__ELF__");
424 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000425 Builder.defineMacro("_ARCH_PPC64");
426 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000427 }
428public:
429 PS3PPUTargetInfo(const std::string& triple)
430 : OSTargetInfo<Target>(triple) {
431 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000432 this->LongWidth = this->LongAlign = 32;
433 this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000434 this->IntMaxType = TargetInfo::SignedLongLong;
435 this->UIntMaxType = TargetInfo::UnsignedLongLong;
436 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000437 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000438 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 +0000439 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000440 }
441};
442
443// FIXME: Need a real SPU target.
444// PS3 SPU Target
445template<typename Target>
446class PS3SPUTargetInfo : public OSTargetInfo<Target> {
447protected:
448 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000449 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000450 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000451 Builder.defineMacro("__SPU__");
452 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000453 }
454public:
455 PS3SPUTargetInfo(const std::string& triple)
456 : OSTargetInfo<Target>(triple) {
457 this->UserLabelPrefix = "";
458 }
459};
460
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000461// AuroraUX target
462template<typename Target>
463class AuroraUXTargetInfo : public OSTargetInfo<Target> {
464protected:
465 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000466 MacroBuilder &Builder) const {
467 DefineStd(Builder, "sun", Opts);
468 DefineStd(Builder, "unix", Opts);
469 Builder.defineMacro("__ELF__");
470 Builder.defineMacro("__svr4__");
471 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000472 }
473public:
474 AuroraUXTargetInfo(const std::string& triple)
475 : OSTargetInfo<Target>(triple) {
476 this->UserLabelPrefix = "";
477 this->WCharType = this->SignedLong;
478 // FIXME: WIntType should be SignedLong
479 }
480};
481
Torok Edwin5f6c1942009-06-30 17:10:35 +0000482// Solaris target
483template<typename Target>
484class SolarisTargetInfo : public OSTargetInfo<Target> {
485protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000486 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000487 MacroBuilder &Builder) const {
488 DefineStd(Builder, "sun", Opts);
489 DefineStd(Builder, "unix", Opts);
490 Builder.defineMacro("__ELF__");
491 Builder.defineMacro("__svr4__");
492 Builder.defineMacro("__SVR4");
David Chisnall48fad492012-02-17 18:35:11 +0000493 Builder.defineMacro("_XOPEN_SOURCE", "500");
494 Builder.defineMacro("_LARGEFILE_SOURCE");
495 Builder.defineMacro("_LARGEFILE64_SOURCE");
496 Builder.defineMacro("__EXTENSIONS__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000497 }
498public:
Mike Stump1eb44332009-09-09 15:08:12 +0000499 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000500 : OSTargetInfo<Target>(triple) {
501 this->UserLabelPrefix = "";
502 this->WCharType = this->SignedLong;
503 // FIXME: WIntType should be SignedLong
504 }
505};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000506
507// Windows target
508template<typename Target>
509class WindowsTargetInfo : public OSTargetInfo<Target> {
510protected:
511 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
512 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000513 Builder.defineMacro("_WIN32");
514 }
515 void getVisualStudioDefines(const LangOptions &Opts,
516 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000517 if (Opts.CPlusPlus) {
518 if (Opts.RTTI)
519 Builder.defineMacro("_CPPRTTI");
520
521 if (Opts.Exceptions)
522 Builder.defineMacro("_CPPUNWIND");
523 }
524
525 if (!Opts.CharIsSigned)
526 Builder.defineMacro("_CHAR_UNSIGNED");
527
528 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
529 // but it works for now.
530 if (Opts.POSIXThreads)
531 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000532
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000533 if (Opts.MSCVersion != 0)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000534 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000535
Francois Pichet62ec1f22011-09-17 17:15:52 +0000536 if (Opts.MicrosoftExt) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000537 Builder.defineMacro("_MSC_EXTENSIONS");
538
539 if (Opts.CPlusPlus0x) {
540 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
541 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
542 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
543 }
544 }
545
546 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000547 }
548
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000549public:
550 WindowsTargetInfo(const std::string &triple)
551 : OSTargetInfo<Target>(triple) {}
552};
553
Mike Stump1eb44332009-09-09 15:08:12 +0000554} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000555
Chris Lattnerd29b6302008-10-05 21:50:58 +0000556//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000557// Specific target implementations.
558//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000559
Eli Friedmane4277982008-08-20 23:11:40 +0000560namespace {
561// PPC abstract base class
562class PPCTargetInfo : public TargetInfo {
563 static const Builtin::Info BuiltinInfo[];
564 static const char * const GCCRegNames[];
565 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Eli Friedmane4277982008-08-20 23:11:40 +0000566public:
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000567 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
568 LongDoubleWidth = LongDoubleAlign = 128;
569 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
570 }
Eli Friedman15b91762009-06-05 07:05:05 +0000571
Eli Friedmane4277982008-08-20 23:11:40 +0000572 virtual void getTargetBuiltins(const Builtin::Info *&Records,
573 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000574 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000575 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000576 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000577
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000578 virtual bool isCLZForZeroUndef() const { return false; }
579
Chris Lattner33328642009-03-20 15:52:06 +0000580 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000581 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000582
Douglas Gregore727d212012-01-30 06:38:25 +0000583 virtual bool hasFeature(StringRef Feature) const;
584
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000585 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000586 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000587 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000588 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000589 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000590 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000591 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000592 default: return false;
593 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000594 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000595 case 'b': // Base register
596 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000597 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000598 break;
599 // FIXME: The following are added to allow parsing.
600 // I just took a guess at what the actions should be.
601 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000602 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000603 case 'v': // Altivec vector register
604 Info.setAllowsRegister();
605 break;
606 case 'w':
607 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000608 case 'd':// VSX vector register to hold vector double data
609 case 'f':// VSX vector register to hold vector float data
610 case 's':// VSX vector register to hold scalar float data
611 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000612 break;
613 default:
614 return false;
615 }
616 Info.setAllowsRegister();
617 Name++; // Skip over 'w'.
618 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000619 case 'h': // `MQ', `CTR', or `LINK' register
620 case 'q': // `MQ' register
621 case 'c': // `CTR' register
622 case 'l': // `LINK' register
623 case 'x': // `CR' register (condition register) number 0
624 case 'y': // `CR' register (condition register)
625 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000626 Info.setAllowsRegister();
627 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000628 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000629 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000630 // (use `L' instead for SImode constants)
631 case 'K': // Unsigned 16-bit constant
632 case 'L': // Signed 16-bit constant shifted left 16 bits
633 case 'M': // Constant larger than 31
634 case 'N': // Exact power of 2
635 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000636 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000637 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000638 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000639 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000640 break;
641 case 'm': // Memory operand. Note that on PowerPC targets, m can
642 // include addresses that update the base register. It
643 // is therefore only safe to use `m' in an asm statement
644 // if that asm statement accesses the operand exactly once.
645 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000646 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000647 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000648 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000649 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000650 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
651 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000652 // register to be updated.
653 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000654 if (Name[1] != 's')
655 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000656 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000657 // include any automodification of the base register. Unlike
658 // `m', this constraint can be used in asm statements that
659 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000660 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000661 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000662 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000663 break;
664 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000665 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000666 case 'Z': // Memory operand that is an indexed or indirect from a
667 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000668 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000669 Info.setAllowsMemory();
670 Info.setAllowsRegister();
671 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000672 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000673 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000674 // register (`p' is preferable for asm statements)
675 case 'S': // Constant suitable as a 64-bit mask operand
676 case 'T': // Constant suitable as a 32-bit mask operand
677 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000678 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000679 // instructions
680 case 'W': // Vector constant that does not require memory
681 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000682 break;
683 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000684 }
John Thompson8e6065a2010-06-24 22:44:13 +0000685 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000686 }
Eli Friedmane4277982008-08-20 23:11:40 +0000687 virtual const char *getClobbers() const {
688 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000689 }
Eli Friedmane4277982008-08-20 23:11:40 +0000690};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000691
Eli Friedmane4277982008-08-20 23:11:40 +0000692const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000693#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000694#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000695 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000696#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000697};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000698
699
Chris Lattnerc0f59212009-03-02 22:27:17 +0000700/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
701/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000702void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000703 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000704 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000705 Builder.defineMacro("__ppc__");
706 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000707 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000708 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000709 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000710 Builder.defineMacro("_ARCH_PPC64");
711 Builder.defineMacro("_LP64");
712 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000713 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000714 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000715 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000716 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000717 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000718
Chris Lattnerc0f59212009-03-02 22:27:17 +0000719 // Target properties.
Joerg Sonnenberger7cd1de52011-07-05 14:56:12 +0000720 if (getTriple().getOS() != llvm::Triple::NetBSD)
721 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramera9992772010-01-09 17:55:51 +0000722 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000723
Chris Lattnerc0f59212009-03-02 22:27:17 +0000724 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000725 Builder.defineMacro("__NATURAL_ALIGNMENT__");
726 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000727
Chris Lattnerc0f59212009-03-02 22:27:17 +0000728 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000729 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000730
John Thompson3f6918a2009-11-19 17:18:50 +0000731 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000732 Builder.defineMacro("__VEC__", "10206");
733 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000734 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000735}
736
Douglas Gregore727d212012-01-30 06:38:25 +0000737bool PPCTargetInfo::hasFeature(StringRef Feature) const {
738 return Feature == "powerpc";
739}
Chris Lattner393ff042008-04-21 18:56:49 +0000740
Douglas Gregore727d212012-01-30 06:38:25 +0000741
Eli Friedmane4277982008-08-20 23:11:40 +0000742const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000743 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
744 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
745 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
746 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
747 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
748 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
749 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
750 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000751 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000752 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000753 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000754 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
755 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
756 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
757 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000758 "vrsave", "vscr",
759 "spe_acc", "spefscr",
760 "sfp"
761};
Reid Spencer5f016e22007-07-11 17:01:13 +0000762
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000763void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000764 unsigned &NumNames) const {
765 Names = GCCRegNames;
766 NumNames = llvm::array_lengthof(GCCRegNames);
767}
Reid Spencer5f016e22007-07-11 17:01:13 +0000768
Eli Friedmane4277982008-08-20 23:11:40 +0000769const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
770 // While some of these aliases do map to different registers
771 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000772 { { "0" }, "r0" },
773 { { "1"}, "r1" },
774 { { "2" }, "r2" },
775 { { "3" }, "r3" },
776 { { "4" }, "r4" },
777 { { "5" }, "r5" },
778 { { "6" }, "r6" },
779 { { "7" }, "r7" },
780 { { "8" }, "r8" },
781 { { "9" }, "r9" },
782 { { "10" }, "r10" },
783 { { "11" }, "r11" },
784 { { "12" }, "r12" },
785 { { "13" }, "r13" },
786 { { "14" }, "r14" },
787 { { "15" }, "r15" },
788 { { "16" }, "r16" },
789 { { "17" }, "r17" },
790 { { "18" }, "r18" },
791 { { "19" }, "r19" },
792 { { "20" }, "r20" },
793 { { "21" }, "r21" },
794 { { "22" }, "r22" },
795 { { "23" }, "r23" },
796 { { "24" }, "r24" },
797 { { "25" }, "r25" },
798 { { "26" }, "r26" },
799 { { "27" }, "r27" },
800 { { "28" }, "r28" },
801 { { "29" }, "r29" },
802 { { "30" }, "r30" },
803 { { "31" }, "r31" },
804 { { "fr0" }, "f0" },
805 { { "fr1" }, "f1" },
806 { { "fr2" }, "f2" },
807 { { "fr3" }, "f3" },
808 { { "fr4" }, "f4" },
809 { { "fr5" }, "f5" },
810 { { "fr6" }, "f6" },
811 { { "fr7" }, "f7" },
812 { { "fr8" }, "f8" },
813 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000814 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000815 { { "fr11" }, "f11" },
816 { { "fr12" }, "f12" },
817 { { "fr13" }, "f13" },
818 { { "fr14" }, "f14" },
819 { { "fr15" }, "f15" },
820 { { "fr16" }, "f16" },
821 { { "fr17" }, "f17" },
822 { { "fr18" }, "f18" },
823 { { "fr19" }, "f19" },
824 { { "fr20" }, "f20" },
825 { { "fr21" }, "f21" },
826 { { "fr22" }, "f22" },
827 { { "fr23" }, "f23" },
828 { { "fr24" }, "f24" },
829 { { "fr25" }, "f25" },
830 { { "fr26" }, "f26" },
831 { { "fr27" }, "f27" },
832 { { "fr28" }, "f28" },
833 { { "fr29" }, "f29" },
834 { { "fr30" }, "f30" },
835 { { "fr31" }, "f31" },
836 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000837};
838
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000839void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000840 unsigned &NumAliases) const {
841 Aliases = GCCRegAliases;
842 NumAliases = llvm::array_lengthof(GCCRegAliases);
843}
844} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000845
846namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000847class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000848public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000849 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000850 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 +0000851 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000852
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000853 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000854 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000855 case llvm::Triple::FreeBSD:
856 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000857 SizeType = UnsignedInt;
858 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +0000859 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000860 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000861 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000862 }
863
864 virtual const char *getVAListDeclaration() const {
865 // This is the ELF definition, and is overridden by the Darwin sub-target
866 return "typedef struct __va_list_tag {"
867 " unsigned char gpr;"
868 " unsigned char fpr;"
869 " unsigned short reserved;"
870 " void* overflow_arg_area;"
871 " void* reg_save_area;"
872 "} __builtin_va_list[1];";
Eli Friedmaned855cb2008-08-21 00:13:15 +0000873 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000874};
875} // end anonymous namespace.
876
877namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000878class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000879public:
Eli Friedmane4277982008-08-20 23:11:40 +0000880 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000881 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000882 IntMaxType = SignedLong;
883 UIntMaxType = UnsignedLong;
884 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000885 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +0000886 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerf291b102008-05-09 06:17:04 +0000887 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000888 virtual const char *getVAListDeclaration() const {
889 return "typedef char* __builtin_va_list;";
890 }
Eli Friedmane4277982008-08-20 23:11:40 +0000891};
892} // end anonymous namespace.
893
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000894
895namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000896class DarwinPPC32TargetInfo :
897 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000898public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000899 DarwinPPC32TargetInfo(const std::string& triple)
900 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000901 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000902 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Anton Yartsev9bc23ba2012-01-17 22:40:00 +0000903 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +0000904 SuitableAlign = 128;
Anton Yartsev9bc23ba2012-01-17 22:40:00 +0000905 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
906 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +0000907 }
908 virtual const char *getVAListDeclaration() const {
909 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000910 }
911};
912
913class DarwinPPC64TargetInfo :
914 public DarwinTargetInfo<PPC64TargetInfo> {
915public:
916 DarwinPPC64TargetInfo(const std::string& triple)
917 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
918 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +0000919 SuitableAlign = 128;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000920 }
921};
922} // end anonymous namespace.
923
Reid Spencer5f016e22007-07-11 17:01:13 +0000924namespace {
Justin Holewinski25bedca2011-10-03 17:28:37 +0000925 static const unsigned PTXAddrSpaceMap[] = {
926 0, // opencl_global
927 4, // opencl_local
928 1 // opencl_constant
929 };
Justin Holewinski285dc652011-04-20 19:34:15 +0000930 class PTXTargetInfo : public TargetInfo {
931 static const char * const GCCRegNames[];
932 static const Builtin::Info BuiltinInfo[];
Justin Holewinskid8e0fe62011-09-22 17:57:40 +0000933 std::vector<llvm::StringRef> AvailableFeatures;
Justin Holewinski285dc652011-04-20 19:34:15 +0000934 public:
935 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +0000936 BigEndian = false;
Justin Holewinski285dc652011-04-20 19:34:15 +0000937 TLSSupported = false;
938 LongWidth = LongAlign = 64;
Justin Holewinski25bedca2011-10-03 17:28:37 +0000939 AddrSpaceMap = &PTXAddrSpaceMap;
Justin Holewinskid8e0fe62011-09-22 17:57:40 +0000940 // Define available target features
941 // These must be defined in sorted order!
942 AvailableFeatures.push_back("compute10");
943 AvailableFeatures.push_back("compute11");
944 AvailableFeatures.push_back("compute12");
945 AvailableFeatures.push_back("compute13");
946 AvailableFeatures.push_back("compute20");
947 AvailableFeatures.push_back("double");
948 AvailableFeatures.push_back("no-fma");
949 AvailableFeatures.push_back("ptx20");
950 AvailableFeatures.push_back("ptx21");
951 AvailableFeatures.push_back("ptx22");
952 AvailableFeatures.push_back("ptx23");
953 AvailableFeatures.push_back("sm10");
954 AvailableFeatures.push_back("sm11");
955 AvailableFeatures.push_back("sm12");
956 AvailableFeatures.push_back("sm13");
957 AvailableFeatures.push_back("sm20");
958 AvailableFeatures.push_back("sm21");
959 AvailableFeatures.push_back("sm22");
960 AvailableFeatures.push_back("sm23");
Justin Holewinski285dc652011-04-20 19:34:15 +0000961 }
962 virtual void getTargetDefines(const LangOptions &Opts,
963 MacroBuilder &Builder) const {
964 Builder.defineMacro("__PTX__");
965 }
966 virtual void getTargetBuiltins(const Builtin::Info *&Records,
967 unsigned &NumRecords) const {
968 Records = BuiltinInfo;
969 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
970 }
Douglas Gregore727d212012-01-30 06:38:25 +0000971 virtual bool hasFeature(StringRef Feature) const {
972 return Feature == "ptx";
973 }
974
Justin Holewinski285dc652011-04-20 19:34:15 +0000975 virtual void getGCCRegNames(const char * const *&Names,
976 unsigned &NumNames) const;
977 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
978 unsigned &NumAliases) const {
979 // No aliases.
980 Aliases = 0;
981 NumAliases = 0;
982 }
983 virtual bool validateAsmConstraint(const char *&Name,
984 TargetInfo::ConstraintInfo &info) const {
985 // FIXME: implement
986 return true;
987 }
988 virtual const char *getClobbers() const {
989 // FIXME: Is this really right?
990 return "";
991 }
992 virtual const char *getVAListDeclaration() const {
993 // FIXME: implement
994 return "typedef char* __builtin_va_list;";
995 }
Justin Holewinski808ef662011-09-15 12:13:38 +0000996
997 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
998 const std::string &Name,
999 bool Enabled) const;
Justin Holewinski285dc652011-04-20 19:34:15 +00001000 };
1001
1002 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001003#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +00001004#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001005 ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +00001006#include "clang/Basic/BuiltinsPTX.def"
1007 };
1008
1009 const char * const PTXTargetInfo::GCCRegNames[] = {
1010 "r0"
1011 };
1012
1013 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
1014 unsigned &NumNames) const {
1015 Names = GCCRegNames;
1016 NumNames = llvm::array_lengthof(GCCRegNames);
1017 }
1018
Justin Holewinski808ef662011-09-15 12:13:38 +00001019 bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1020 const std::string &Name,
1021 bool Enabled) const {
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001022 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1023 Name)) {
1024 Features[Name] = Enabled;
1025 return true;
Justin Holewinski808ef662011-09-15 12:13:38 +00001026 } else {
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001027 return false;
Justin Holewinski808ef662011-09-15 12:13:38 +00001028 }
Justin Holewinski808ef662011-09-15 12:13:38 +00001029 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001030
1031 class PTX32TargetInfo : public PTXTargetInfo {
1032 public:
1033 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1034 PointerWidth = PointerAlign = 32;
1035 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1036 DescriptionString
1037 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
1038 }
1039 };
1040
1041 class PTX64TargetInfo : public PTXTargetInfo {
1042 public:
1043 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1044 PointerWidth = PointerAlign = 64;
1045 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1046 DescriptionString
1047 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
1048 }
1049 };
1050}
1051
1052namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +00001053// MBlaze abstract base class
1054class MBlazeTargetInfo : public TargetInfo {
1055 static const char * const GCCRegNames[];
1056 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1057
1058public:
1059 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +00001060 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +00001061 }
1062
1063 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1064 unsigned &NumRecords) const {
1065 // FIXME: Implement.
1066 Records = 0;
1067 NumRecords = 0;
1068 }
1069
1070 virtual void getTargetDefines(const LangOptions &Opts,
1071 MacroBuilder &Builder) const;
1072
Douglas Gregore727d212012-01-30 06:38:25 +00001073 virtual bool hasFeature(StringRef Feature) const {
1074 return Feature == "mblaze";
1075 }
1076
Chris Lattner9cbeb632010-03-06 21:21:27 +00001077 virtual const char *getVAListDeclaration() const {
1078 return "typedef char* __builtin_va_list;";
1079 }
1080 virtual const char *getTargetPrefix() const {
1081 return "mblaze";
1082 }
1083 virtual void getGCCRegNames(const char * const *&Names,
1084 unsigned &NumNames) const;
1085 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1086 unsigned &NumAliases) const;
1087 virtual bool validateAsmConstraint(const char *&Name,
1088 TargetInfo::ConstraintInfo &Info) const {
1089 switch (*Name) {
1090 default: return false;
1091 case 'O': // Zero
1092 return true;
1093 case 'b': // Base register
1094 case 'f': // Floating point register
1095 Info.setAllowsRegister();
1096 return true;
1097 }
1098 }
1099 virtual const char *getClobbers() const {
1100 return "";
1101 }
1102};
1103
1104/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1105/// #defines that are not tied to a specific subtarget.
1106void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1107 MacroBuilder &Builder) const {
1108 // Target identification.
1109 Builder.defineMacro("__microblaze__");
1110 Builder.defineMacro("_ARCH_MICROBLAZE");
1111 Builder.defineMacro("__MICROBLAZE__");
1112
1113 // Target properties.
1114 Builder.defineMacro("_BIG_ENDIAN");
1115 Builder.defineMacro("__BIG_ENDIAN__");
1116
1117 // Subtarget options.
1118 Builder.defineMacro("__REGISTER_PREFIX__", "");
1119}
1120
1121
1122const char * const MBlazeTargetInfo::GCCRegNames[] = {
1123 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1124 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1125 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1126 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1127 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1128 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1129 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1130 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1131 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1132 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1133};
1134
1135void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1136 unsigned &NumNames) const {
1137 Names = GCCRegNames;
1138 NumNames = llvm::array_lengthof(GCCRegNames);
1139}
1140
1141const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1142 { {"f0"}, "r0" },
1143 { {"f1"}, "r1" },
1144 { {"f2"}, "r2" },
1145 { {"f3"}, "r3" },
1146 { {"f4"}, "r4" },
1147 { {"f5"}, "r5" },
1148 { {"f6"}, "r6" },
1149 { {"f7"}, "r7" },
1150 { {"f8"}, "r8" },
1151 { {"f9"}, "r9" },
1152 { {"f10"}, "r10" },
1153 { {"f11"}, "r11" },
1154 { {"f12"}, "r12" },
1155 { {"f13"}, "r13" },
1156 { {"f14"}, "r14" },
1157 { {"f15"}, "r15" },
1158 { {"f16"}, "r16" },
1159 { {"f17"}, "r17" },
1160 { {"f18"}, "r18" },
1161 { {"f19"}, "r19" },
1162 { {"f20"}, "r20" },
1163 { {"f21"}, "r21" },
1164 { {"f22"}, "r22" },
1165 { {"f23"}, "r23" },
1166 { {"f24"}, "r24" },
1167 { {"f25"}, "r25" },
1168 { {"f26"}, "r26" },
1169 { {"f27"}, "r27" },
1170 { {"f28"}, "r28" },
1171 { {"f29"}, "r29" },
1172 { {"f30"}, "r30" },
1173 { {"f31"}, "r31" },
1174};
1175
1176void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1177 unsigned &NumAliases) const {
1178 Aliases = GCCRegAliases;
1179 NumAliases = llvm::array_lengthof(GCCRegAliases);
1180}
1181} // end anonymous namespace.
1182
1183namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001184// Namespace for x86 abstract base class
1185const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001186#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001187#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001188 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001189#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001190};
Eli Friedman61538a72008-05-20 14:21:01 +00001191
Nuno Lopes2550d702009-12-23 17:49:57 +00001192static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001193 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1194 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001195 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001196 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1197 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1198 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001199 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001200 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1201 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001202};
1203
Eric Christophercfd323d2011-06-21 00:05:20 +00001204const TargetInfo::AddlRegName AddlRegNames[] = {
1205 { { "al", "ah", "eax", "rax" }, 0 },
1206 { { "bl", "bh", "ebx", "rbx" }, 3 },
1207 { { "cl", "ch", "ecx", "rcx" }, 2 },
1208 { { "dl", "dh", "edx", "rdx" }, 1 },
1209 { { "esi", "rsi" }, 4 },
1210 { { "edi", "rdi" }, 5 },
1211 { { "esp", "rsp" }, 7 },
1212 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001213};
1214
1215// X86 target abstract base class; x86-32 and x86-64 are very close, so
1216// most of the implementation can be shared.
1217class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001218 enum X86SSEEnum {
Craig Topper05fe4b52012-01-09 09:19:09 +00001219 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner84f0ea82009-03-02 22:40:39 +00001220 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001221 enum MMX3DNowEnum {
1222 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1223 } MMX3DNowLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001224
Eric Christophereea12d12010-04-02 23:50:19 +00001225 bool HasAES;
Craig Topper31ceea02011-12-25 05:06:45 +00001226 bool HasLZCNT;
1227 bool HasBMI;
1228 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001229 bool HasPOPCNT;
Craig Topper6a511e12011-12-30 07:33:42 +00001230 bool HasFMA4;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001231
Chandler Carruth499d9722011-09-28 08:55:34 +00001232 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1233 ///
1234 /// Each enumeration represents a particular CPU supported by Clang. These
1235 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1236 enum CPUKind {
1237 CK_Generic,
1238
1239 /// \name i386
1240 /// i386-generation processors.
1241 //@{
1242 CK_i386,
1243 //@}
1244
1245 /// \name i486
1246 /// i486-generation processors.
1247 //@{
1248 CK_i486,
1249 CK_WinChipC6,
1250 CK_WinChip2,
1251 CK_C3,
1252 //@}
1253
1254 /// \name i586
1255 /// i586-generation processors, P5 microarchitecture based.
1256 //@{
1257 CK_i586,
1258 CK_Pentium,
1259 CK_PentiumMMX,
1260 //@}
1261
1262 /// \name i686
1263 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1264 //@{
1265 CK_i686,
1266 CK_PentiumPro,
1267 CK_Pentium2,
1268 CK_Pentium3,
1269 CK_Pentium3M,
1270 CK_PentiumM,
1271 CK_C3_2,
1272
1273 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1274 /// Clang however has some logic to suport this.
1275 // FIXME: Warn, deprecate, and potentially remove this.
1276 CK_Yonah,
1277 //@}
1278
1279 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001280 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001281 //@{
1282 CK_Pentium4,
1283 CK_Pentium4M,
1284 CK_Prescott,
1285 CK_Nocona,
1286 //@}
1287
1288 /// \name Core
1289 /// Core microarchitecture based processors.
1290 //@{
1291 CK_Core2,
1292
1293 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1294 /// codename which GCC no longer accepts as an option to -march, but Clang
1295 /// has some logic for recognizing it.
1296 // FIXME: Warn, deprecate, and potentially remove this.
1297 CK_Penryn,
1298 //@}
1299
1300 /// \name Atom
1301 /// Atom processors
1302 //@{
1303 CK_Atom,
1304 //@}
1305
1306 /// \name Nehalem
1307 /// Nehalem microarchitecture based processors.
1308 //@{
1309 CK_Corei7,
1310 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001311 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001312 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001313 //@}
1314
1315 /// \name K6
1316 /// K6 architecture processors.
1317 //@{
1318 CK_K6,
1319 CK_K6_2,
1320 CK_K6_3,
1321 //@}
1322
1323 /// \name K7
1324 /// K7 architecture processors.
1325 //@{
1326 CK_Athlon,
1327 CK_AthlonThunderbird,
1328 CK_Athlon4,
1329 CK_AthlonXP,
1330 CK_AthlonMP,
1331 //@}
1332
1333 /// \name K8
1334 /// K8 architecture processors.
1335 //@{
1336 CK_Athlon64,
1337 CK_Athlon64SSE3,
1338 CK_AthlonFX,
1339 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001340 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001341 CK_Opteron,
1342 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001343 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001344 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001345
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001346 /// \name Bobcat
1347 /// Bobcat architecture processors.
1348 //@{
1349 CK_BTVER1,
1350 //@}
1351
1352 /// \name Bulldozer
1353 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001354 //@{
1355 CK_BDVER1,
1356 CK_BDVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001357 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001358
Chandler Carruth499d9722011-09-28 08:55:34 +00001359 /// This specification is deprecated and will be removed in the future.
1360 /// Users should prefer \see CK_K8.
1361 // FIXME: Warn on this when the CPU is set to it.
1362 CK_x86_64,
1363 //@}
1364
1365 /// \name Geode
1366 /// Geode processors.
1367 //@{
1368 CK_Geode
1369 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001370 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001371
Eli Friedman618234a2008-08-20 02:34:37 +00001372public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001373 X86TargetInfo(const std::string& triple)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001374 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Craig Topper05fe4b52012-01-09 09:19:09 +00001375 HasAES(false), HasLZCNT(false), HasBMI(false), HasBMI2(false),
1376 HasPOPCNT(false), HasFMA4(false), CPU(CK_Generic) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001377 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001378 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001379 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001380 virtual unsigned getFloatEvalMethod() const {
1381 // X87 evaluates with 80 bits "long double" precision.
1382 return SSELevel == NoSSE ? 2 : 0;
1383 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001384 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1385 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001386 Records = BuiltinInfo;
1387 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001388 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001389 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001390 unsigned &NumNames) const {
1391 Names = GCCRegNames;
1392 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001393 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001394 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001395 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001396 Aliases = 0;
1397 NumAliases = 0;
1398 }
1399 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1400 unsigned &NumNames) const {
1401 Names = AddlRegNames;
1402 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001403 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001404 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001405 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001406 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001407 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001408 return "~{dirflag},~{fpsr},~{flags}";
1409 }
Chris Lattner33328642009-03-20 15:52:06 +00001410 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001411 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001412 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1413 const std::string &Name,
1414 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001415 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregore727d212012-01-30 06:38:25 +00001416 virtual bool hasFeature(StringRef Feature) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001417 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001418 virtual const char* getABI() const {
Craig Topper05fe4b52012-01-09 09:19:09 +00001419 if (PointerWidth == 64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001420 return "avx";
1421 else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1422 return "no-mmx";
1423 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001424 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001425 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001426 CPU = llvm::StringSwitch<CPUKind>(Name)
1427 .Case("i386", CK_i386)
1428 .Case("i486", CK_i486)
1429 .Case("winchip-c6", CK_WinChipC6)
1430 .Case("winchip2", CK_WinChip2)
1431 .Case("c3", CK_C3)
1432 .Case("i586", CK_i586)
1433 .Case("pentium", CK_Pentium)
1434 .Case("pentium-mmx", CK_PentiumMMX)
1435 .Case("i686", CK_i686)
1436 .Case("pentiumpro", CK_PentiumPro)
1437 .Case("pentium2", CK_Pentium2)
1438 .Case("pentium3", CK_Pentium3)
1439 .Case("pentium3m", CK_Pentium3M)
1440 .Case("pentium-m", CK_PentiumM)
1441 .Case("c3-2", CK_C3_2)
1442 .Case("yonah", CK_Yonah)
1443 .Case("pentium4", CK_Pentium4)
1444 .Case("pentium4m", CK_Pentium4M)
1445 .Case("prescott", CK_Prescott)
1446 .Case("nocona", CK_Nocona)
1447 .Case("core2", CK_Core2)
1448 .Case("penryn", CK_Penryn)
1449 .Case("atom", CK_Atom)
1450 .Case("corei7", CK_Corei7)
1451 .Case("corei7-avx", CK_Corei7AVX)
1452 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001453 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001454 .Case("k6", CK_K6)
1455 .Case("k6-2", CK_K6_2)
1456 .Case("k6-3", CK_K6_3)
1457 .Case("athlon", CK_Athlon)
1458 .Case("athlon-tbird", CK_AthlonThunderbird)
1459 .Case("athlon-4", CK_Athlon4)
1460 .Case("athlon-xp", CK_AthlonXP)
1461 .Case("athlon-mp", CK_AthlonMP)
1462 .Case("athlon64", CK_Athlon64)
1463 .Case("athlon64-sse3", CK_Athlon64SSE3)
1464 .Case("athlon-fx", CK_AthlonFX)
1465 .Case("k8", CK_K8)
1466 .Case("k8-sse3", CK_K8SSE3)
1467 .Case("opteron", CK_Opteron)
1468 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001469 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001470 .Case("btver1", CK_BTVER1)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001471 .Case("bdver1", CK_BDVER1)
1472 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001473 .Case("x86-64", CK_x86_64)
1474 .Case("geode", CK_Geode)
1475 .Default(CK_Generic);
1476
Chandler Carruth26a39142011-09-28 09:45:08 +00001477 // Perform any per-CPU checks necessary to determine if this CPU is
1478 // acceptable.
1479 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1480 // invalid without explaining *why*.
1481 switch (CPU) {
1482 case CK_Generic:
1483 // No processor selected!
1484 return false;
1485
1486 case CK_i386:
1487 case CK_i486:
1488 case CK_WinChipC6:
1489 case CK_WinChip2:
1490 case CK_C3:
1491 case CK_i586:
1492 case CK_Pentium:
1493 case CK_PentiumMMX:
1494 case CK_i686:
1495 case CK_PentiumPro:
1496 case CK_Pentium2:
1497 case CK_Pentium3:
1498 case CK_Pentium3M:
1499 case CK_PentiumM:
1500 case CK_Yonah:
1501 case CK_C3_2:
1502 case CK_Pentium4:
1503 case CK_Pentium4M:
1504 case CK_Prescott:
1505 case CK_K6:
1506 case CK_K6_2:
1507 case CK_K6_3:
1508 case CK_Athlon:
1509 case CK_AthlonThunderbird:
1510 case CK_Athlon4:
1511 case CK_AthlonXP:
1512 case CK_AthlonMP:
1513 case CK_Geode:
1514 // Only accept certain architectures when compiling in 32-bit mode.
1515 if (PointerWidth != 32)
1516 return false;
1517
1518 // Fallthrough
1519 case CK_Nocona:
1520 case CK_Core2:
1521 case CK_Penryn:
1522 case CK_Atom:
1523 case CK_Corei7:
1524 case CK_Corei7AVX:
1525 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001526 case CK_CoreAVX2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001527 case CK_Athlon64:
1528 case CK_Athlon64SSE3:
1529 case CK_AthlonFX:
1530 case CK_K8:
1531 case CK_K8SSE3:
1532 case CK_Opteron:
1533 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00001534 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001535 case CK_BTVER1:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001536 case CK_BDVER1:
1537 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001538 case CK_x86_64:
1539 return true;
1540 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00001541 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001542 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001543};
Chris Lattner3daed522009-03-02 22:20:04 +00001544
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001545void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001546 // FIXME: This should not be here.
1547 Features["3dnow"] = false;
1548 Features["3dnowa"] = false;
1549 Features["mmx"] = false;
1550 Features["sse"] = false;
1551 Features["sse2"] = false;
1552 Features["sse3"] = false;
1553 Features["ssse3"] = false;
1554 Features["sse41"] = false;
1555 Features["sse42"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001556 Features["sse4a"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001557 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001558 Features["avx"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001559 Features["avx2"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001560 Features["lzcnt"] = false;
1561 Features["bmi"] = false;
1562 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001563 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001564 Features["fma4"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001565
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001566 // FIXME: This *really* should not be here.
1567
1568 // X86_64 always has SSE2.
1569 if (PointerWidth == 64)
1570 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1571
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001572 switch (CPU) {
1573 case CK_Generic:
1574 case CK_i386:
1575 case CK_i486:
1576 case CK_i586:
1577 case CK_Pentium:
1578 case CK_i686:
1579 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001580 break;
1581 case CK_PentiumMMX:
1582 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001583 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001584 break;
1585 case CK_Pentium3:
1586 case CK_Pentium3M:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001587 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001588 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001589 break;
1590 case CK_PentiumM:
1591 case CK_Pentium4:
1592 case CK_Pentium4M:
1593 case CK_x86_64:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001594 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001595 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001596 break;
1597 case CK_Yonah:
1598 case CK_Prescott:
1599 case CK_Nocona:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001600 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001601 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001602 break;
1603 case CK_Core2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001604 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001605 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001606 break;
1607 case CK_Penryn:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001608 setFeatureEnabled(Features, "mmx", true);
Benjamin Kramerb3453a82012-01-04 14:36:57 +00001609 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001610 break;
1611 case CK_Atom:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001612 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00001613 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001614 break;
1615 case CK_Corei7:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001616 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001617 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001618 setFeatureEnabled(Features, "aes", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001619 break;
1620 case CK_Corei7AVX:
1621 case CK_CoreAVXi:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001622 setFeatureEnabled(Features, "mmx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00001623 setFeatureEnabled(Features, "sse4", true);
1624 setFeatureEnabled(Features, "aes", true);
Bruno Cardoso Lopese02d3912011-07-11 23:33:46 +00001625 //setFeatureEnabled(Features, "avx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001626 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00001627 case CK_CoreAVX2:
1628 setFeatureEnabled(Features, "mmx", true);
1629 setFeatureEnabled(Features, "sse4", true);
1630 setFeatureEnabled(Features, "aes", true);
Craig Topper31ceea02011-12-25 05:06:45 +00001631 setFeatureEnabled(Features, "lzcnt", true);
1632 setFeatureEnabled(Features, "bmi", true);
1633 setFeatureEnabled(Features, "bmi2", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00001634 //setFeatureEnabled(Features, "avx2", true);
1635 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001636 case CK_K6:
1637 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001638 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001639 break;
1640 case CK_K6_2:
1641 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001642 case CK_WinChip2:
1643 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001644 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001645 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00001646 case CK_Athlon:
1647 case CK_AthlonThunderbird:
1648 case CK_Geode:
1649 setFeatureEnabled(Features, "3dnowa", true);
1650 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001651 case CK_Athlon4:
1652 case CK_AthlonXP:
1653 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001654 setFeatureEnabled(Features, "sse", true);
1655 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001656 break;
1657 case CK_K8:
1658 case CK_Opteron:
1659 case CK_Athlon64:
1660 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00001661 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001662 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001663 break;
1664 case CK_K8SSE3:
1665 case CK_OpteronSSE3:
1666 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00001667 setFeatureEnabled(Features, "sse3", true);
1668 setFeatureEnabled(Features, "3dnowa", true);
1669 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001670 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00001671 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00001672 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001673 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001674 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001675 case CK_BTVER1:
1676 setFeatureEnabled(Features, "ssse3", true);
1677 setFeatureEnabled(Features, "sse4a", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001678 case CK_BDVER1:
1679 case CK_BDVER2:
1680 setFeatureEnabled(Features, "sse4", true);
1681 setFeatureEnabled(Features, "sse4a", true);
1682 setFeatureEnabled(Features, "aes", true);
1683 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001684 case CK_C3_2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001685 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001686 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001687 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001688 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001689}
1690
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001691bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001692 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001693 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001694 // FIXME: This *really* should not be here. We need some way of translating
1695 // options into llvm subtarget features.
1696 if (!Features.count(Name) &&
1697 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001698 return false;
1699
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001700 // FIXME: this should probably use a switch with fall through.
1701
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001702 if (Enabled) {
1703 if (Name == "mmx")
1704 Features["mmx"] = true;
1705 else if (Name == "sse")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001706 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001707 else if (Name == "sse2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001708 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001709 else if (Name == "sse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001710 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1711 true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001712 else if (Name == "ssse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001713 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001714 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001715 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001716 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001717 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1718 Features["popcnt"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001719 else if (Name == "sse4.1")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001720 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00001721 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001722 else if (Name == "3dnow")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001723 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001724 else if (Name == "3dnowa")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001725 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001726 else if (Name == "aes")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001727 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001728 else if (Name == "avx")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001729 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1730 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001731 Features["popcnt"] = Features["avx"] = true;
Craig Topper2b03bb02011-12-17 19:55:21 +00001732 else if (Name == "avx2")
1733 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1734 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001735 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topper6a511e12011-12-30 07:33:42 +00001736 else if (Name == "fma4")
1737 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1738 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1739 Features["popcnt"] = Features["avx"] = Features["fma4"] = true;
Roman Divacky80b32b82011-10-30 13:47:56 +00001740 else if (Name == "sse4a")
Craig Topper6a511e12011-12-30 07:33:42 +00001741 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Benjamin Kramer5c65e4f2012-01-10 11:50:13 +00001742 Features["lzcnt"] = Features["popcnt"] = Features["sse4a"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00001743 else if (Name == "lzcnt")
1744 Features["lzcnt"] = true;
1745 else if (Name == "bmi")
1746 Features["bmi"] = true;
1747 else if (Name == "bmi2")
1748 Features["bmi2"] = true;
Craig Toppere14e08b2011-12-29 16:10:46 +00001749 else if (Name == "popcnt")
1750 Features["popcnt"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001751 } else {
1752 if (Name == "mmx")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001753 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001754 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001755 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001756 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1757 Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001758 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001759 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001760 Features["sse41"] = Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001761 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001762 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001763 Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001764 else if (Name == "ssse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001765 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001766 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001767 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001768 else if (Name == "sse4.2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001769 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001770 else if (Name == "3dnow")
1771 Features["3dnow"] = Features["3dnowa"] = false;
1772 else if (Name == "3dnowa")
1773 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001774 else if (Name == "aes")
1775 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001776 else if (Name == "avx")
Craig Topper6a511e12011-12-30 07:33:42 +00001777 Features["avx"] = Features["avx2"] = Features["fma4"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001778 else if (Name == "avx2")
1779 Features["avx2"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001780 else if (Name == "sse4a")
1781 Features["sse4a"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001782 else if (Name == "lzcnt")
1783 Features["lzcnt"] = false;
1784 else if (Name == "bmi")
1785 Features["bmi"] = false;
1786 else if (Name == "bmi2")
1787 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001788 else if (Name == "popcnt")
1789 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001790 else if (Name == "fma4")
1791 Features["fma4"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001792 }
1793
1794 return true;
1795}
1796
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001797/// HandleTargetOptions - Perform initialization based on the user
1798/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001799void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001800 // Remember the maximum enabled sselevel.
1801 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1802 // Ignore disabled features.
1803 if (Features[i][0] == '-')
1804 continue;
1805
Eric Christophereea12d12010-04-02 23:50:19 +00001806 if (Features[i].substr(1) == "aes") {
1807 HasAES = true;
1808 continue;
1809 }
1810
Craig Topper31ceea02011-12-25 05:06:45 +00001811 if (Features[i].substr(1) == "lzcnt") {
1812 HasLZCNT = true;
1813 continue;
1814 }
1815
1816 if (Features[i].substr(1) == "bmi") {
1817 HasBMI = true;
1818 continue;
1819 }
1820
1821 if (Features[i].substr(1) == "bmi2") {
1822 HasBMI2 = true;
1823 continue;
1824 }
1825
Craig Toppere14e08b2011-12-29 16:10:46 +00001826 if (Features[i].substr(1) == "popcnt") {
1827 HasPOPCNT = true;
1828 continue;
1829 }
1830
Craig Topper6a511e12011-12-30 07:33:42 +00001831 if (Features[i].substr(1) == "fma4") {
1832 HasFMA4 = true;
1833 continue;
1834 }
1835
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001836 assert(Features[i][0] == '+' && "Invalid target feature!");
1837 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
Craig Topper05fe4b52012-01-09 09:19:09 +00001838 .Case("avx2", AVX2)
1839 .Case("avx", AVX)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001840 .Case("sse42", SSE42)
1841 .Case("sse41", SSE41)
1842 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001843 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001844 .Case("sse2", SSE2)
1845 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001846 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001847 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001848
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001849 MMX3DNowEnum ThreeDNowLevel =
1850 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001851 .Case("3dnowa", AMD3DNowAthlon)
1852 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001853 .Case("mmx", MMX)
1854 .Default(NoMMX3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001855
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001856 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001857 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001858
1859 // Don't tell the backend if we're turning off mmx; it will end up disabling
1860 // SSE, which we don't want.
1861 std::vector<std::string>::iterator it;
1862 it = std::find(Features.begin(), Features.end(), "-mmx");
1863 if (it != Features.end())
1864 Features.erase(it);
Chris Lattner3daed522009-03-02 22:20:04 +00001865}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001866
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001867/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1868/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001869void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001870 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001871 // Target identification.
1872 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001873 Builder.defineMacro("_LP64");
1874 Builder.defineMacro("__LP64__");
1875 Builder.defineMacro("__amd64__");
1876 Builder.defineMacro("__amd64");
1877 Builder.defineMacro("__x86_64");
1878 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001879 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001880 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001881 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001882
Chris Lattnerc0f59212009-03-02 22:27:17 +00001883 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001884 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
1885 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001886 switch (CPU) {
1887 case CK_Generic:
1888 break;
1889 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001890 // The rest are coming from the i386 define above.
1891 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001892 break;
1893 case CK_i486:
1894 case CK_WinChipC6:
1895 case CK_WinChip2:
1896 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001897 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001898 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00001899 case CK_PentiumMMX:
1900 Builder.defineMacro("__pentium_mmx__");
1901 Builder.defineMacro("__tune_pentium_mmx__");
1902 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001903 case CK_i586:
1904 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001905 defineCPUMacros(Builder, "i586");
1906 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001907 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001908 case CK_Pentium3:
1909 case CK_Pentium3M:
1910 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001911 Builder.defineMacro("__tune_pentium3__");
1912 // Fallthrough
1913 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001914 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001915 Builder.defineMacro("__tune_pentium2__");
1916 // Fallthrough
1917 case CK_PentiumPro:
1918 Builder.defineMacro("__tune_i686__");
1919 Builder.defineMacro("__tune_pentiumpro__");
1920 // Fallthrough
1921 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001922 Builder.defineMacro("__i686");
1923 Builder.defineMacro("__i686__");
1924 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
1925 Builder.defineMacro("__pentiumpro");
1926 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001927 break;
1928 case CK_Pentium4:
1929 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001930 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001931 break;
1932 case CK_Yonah:
1933 case CK_Prescott:
1934 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001935 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001936 break;
1937 case CK_Core2:
1938 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001939 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001940 break;
1941 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001942 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001943 break;
1944 case CK_Corei7:
1945 case CK_Corei7AVX:
1946 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001947 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001948 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001949 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001950 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001951 Builder.defineMacro("__k6_2__");
1952 Builder.defineMacro("__tune_k6_2__");
1953 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001954 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001955 if (CPU != CK_K6_2) { // In case of fallthrough
1956 // FIXME: GCC may be enabling these in cases where some other k6
1957 // architecture is specified but -m3dnow is explicitly provided. The
1958 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001959 Builder.defineMacro("__k6_3__");
1960 Builder.defineMacro("__tune_k6_3__");
1961 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00001962 // Fallthrough
1963 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001964 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001965 break;
1966 case CK_Athlon:
1967 case CK_AthlonThunderbird:
1968 case CK_Athlon4:
1969 case CK_AthlonXP:
1970 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001971 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00001972 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001973 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00001974 Builder.defineMacro("__tune_athlon_sse__");
1975 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001976 break;
1977 case CK_K8:
1978 case CK_K8SSE3:
1979 case CK_x86_64:
1980 case CK_Opteron:
1981 case CK_OpteronSSE3:
1982 case CK_Athlon64:
1983 case CK_Athlon64SSE3:
1984 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001985 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001986 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001987 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001988 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00001989 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001990 case CK_BTVER1:
1991 defineCPUMacros(Builder, "btver1");
1992 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001993 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001994 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001995 break;
1996 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001997 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001998 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001999 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002000 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002001 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002002 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00002003
Chandler Carruth88c75b02011-09-28 09:54:07 +00002004 // Target properties.
2005 Builder.defineMacro("__LITTLE_ENDIAN__");
2006 Builder.defineMacro("__REGISTER_PREFIX__", "");
2007
Chris Lattner54175442009-04-19 17:32:33 +00002008 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2009 // functions in glibc header files that use FP Stack inline asm which the
2010 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00002011 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002012
Chandler Carruth88c75b02011-09-28 09:54:07 +00002013 if (HasAES)
2014 Builder.defineMacro("__AES__");
2015
Craig Topper31ceea02011-12-25 05:06:45 +00002016 if (HasLZCNT)
2017 Builder.defineMacro("__LZCNT__");
2018
2019 if (HasBMI)
2020 Builder.defineMacro("__BMI__");
2021
2022 if (HasBMI2)
2023 Builder.defineMacro("__BMI2__");
2024
Craig Toppere14e08b2011-12-29 16:10:46 +00002025 if (HasPOPCNT)
2026 Builder.defineMacro("__POPCNT__");
2027
Craig Topper6a511e12011-12-30 07:33:42 +00002028 if (HasFMA4)
2029 Builder.defineMacro("__FMA4__");
2030
Chris Lattner84f0ea82009-03-02 22:40:39 +00002031 // Each case falls through to the previous one here.
2032 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002033 case AVX2:
2034 Builder.defineMacro("__AVX2__");
2035 case AVX:
2036 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002037 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00002038 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002039 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002040 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002041 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002042 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002043 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002044 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002045 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002046 Builder.defineMacro("__SSE2__");
2047 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002048 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002049 Builder.defineMacro("__SSE__");
2050 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002051 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002052 break;
2053 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002054
Francois Pichet62ec1f22011-09-17 17:15:52 +00002055 if (Opts.MicrosoftExt && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002056 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002057 case AVX2:
2058 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002059 case SSE42:
2060 case SSE41:
2061 case SSSE3:
2062 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002063 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002064 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002065 break;
2066 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002067 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002068 break;
2069 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002070 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002071 }
2072 }
2073
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002074 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002075 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002076 case AMD3DNowAthlon:
2077 Builder.defineMacro("__3dNOW_A__");
2078 case AMD3DNow:
2079 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002080 case MMX:
2081 Builder.defineMacro("__MMX__");
2082 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002083 break;
2084 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00002085}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002086
Douglas Gregore727d212012-01-30 06:38:25 +00002087bool X86TargetInfo::hasFeature(StringRef Feature) const {
2088 return llvm::StringSwitch<bool>(Feature)
2089 .Case("aes", HasAES)
2090 .Case("avx", SSELevel >= AVX)
2091 .Case("avx2", SSELevel >= AVX2)
2092 .Case("bmi", HasBMI)
2093 .Case("bmi2", HasBMI2)
2094 .Case("fma4", HasFMA4)
2095 .Case("lzcnt", HasLZCNT)
2096 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2097 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2098 .Case("mmx", MMX3DNowLevel >= MMX)
2099 .Case("popcnt", HasPOPCNT)
2100 .Case("sse", SSELevel >= SSE1)
2101 .Case("sse2", SSELevel >= SSE2)
2102 .Case("sse3", SSELevel >= SSE3)
2103 .Case("ssse3", SSELevel >= SSSE3)
2104 .Case("sse41", SSELevel >= SSE41)
2105 .Case("sse42", SSELevel >= SSE42)
2106 .Case("x86", true)
2107 .Case("x86_32", PointerWidth == 32)
2108 .Case("x86_64", PointerWidth == 64)
2109 .Default(false);
2110}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002111
Eli Friedman618234a2008-08-20 02:34:37 +00002112bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002113X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002114 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002115 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002116 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002117 case 'Y': // first letter of a pair:
2118 switch (*(Name+1)) {
2119 default: return false;
2120 case '0': // First SSE register.
2121 case 't': // Any SSE register, when SSE2 is enabled.
2122 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2123 case 'm': // any MMX register, when inter-unit moves enabled.
2124 break; // falls through to setAllowsRegister.
2125 }
Eli Friedman618234a2008-08-20 02:34:37 +00002126 case 'a': // eax.
2127 case 'b': // ebx.
2128 case 'c': // ecx.
2129 case 'd': // edx.
2130 case 'S': // esi.
2131 case 'D': // edi.
2132 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002133 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002134 case 't': // top of floating point stack.
2135 case 'u': // second from top of floating point stack.
2136 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002137 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002138 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002139 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002140 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2141 case 'l': // "Index" registers: any general register that can be used as an
2142 // index in a base+index memory access.
2143 Info.setAllowsRegister();
2144 return true;
2145 case 'C': // SSE floating point constant.
2146 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002147 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002148 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002149 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002150 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002151 return true;
2152 }
2153}
2154
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002155
Eli Friedman618234a2008-08-20 02:34:37 +00002156std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002157X86TargetInfo::convertConstraint(const char *&Constraint) const {
2158 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002159 case 'a': return std::string("{ax}");
2160 case 'b': return std::string("{bx}");
2161 case 'c': return std::string("{cx}");
2162 case 'd': return std::string("{dx}");
2163 case 'S': return std::string("{si}");
2164 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002165 case 'p': // address
2166 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002167 case 't': // top of floating point stack.
2168 return std::string("{st}");
2169 case 'u': // second from top of floating point stack.
2170 return std::string("{st(1)}"); // second from top of floating point stack.
2171 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002172 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002173 }
2174}
Eli Friedman618234a2008-08-20 02:34:37 +00002175} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002176
2177namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002178// X86-32 generic target
2179class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002180public:
Eli Friedman618234a2008-08-20 02:34:37 +00002181 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2182 DoubleAlign = LongLongAlign = 32;
2183 LongDoubleWidth = 96;
2184 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002185 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002186 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2187 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002188 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002189 SizeType = UnsignedInt;
2190 PtrDiffType = SignedInt;
2191 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002192 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002193
2194 // Use fpret for all types.
2195 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2196 (1 << TargetInfo::Double) |
2197 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002198
2199 // x86-32 has atomics up to 8 bytes
2200 // FIXME: Check that we actually have cmpxchg8b before setting
2201 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2202 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002203 }
2204 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002205 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00002206 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002207
Chris Lattner21fb98e2009-09-23 06:06:36 +00002208 int getEHDataRegisterNumber(unsigned RegNo) const {
2209 if (RegNo == 0) return 0;
2210 if (RegNo == 1) return 2;
2211 return -1;
2212 }
Eli Friedman618234a2008-08-20 02:34:37 +00002213};
2214} // end anonymous namespace
2215
2216namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002217class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2218public:
2219 NetBSDI386TargetInfo(const std::string &triple) :
2220 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2221 }
2222
2223 virtual unsigned getFloatEvalMethod() const {
2224 // NetBSD defaults to "double" rounding
2225 return 1;
2226 }
2227};
2228} // end anonymous namespace
2229
2230namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002231class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2232public:
2233 OpenBSDI386TargetInfo(const std::string& triple) :
2234 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2235 SizeType = UnsignedLong;
2236 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002237 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002238 }
2239};
2240} // end anonymous namespace
2241
2242namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002243class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002244public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002245 DarwinI386TargetInfo(const std::string& triple) :
2246 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002247 LongDoubleWidth = 128;
2248 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002249 SuitableAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00002250 SizeType = UnsignedLong;
2251 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002252 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2253 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002254 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002255 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002256 }
2257
Eli Friedman618234a2008-08-20 02:34:37 +00002258};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002259} // end anonymous namespace
2260
2261namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002262// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002263class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002264public:
2265 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002266 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002267 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002268 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002269 DoubleAlign = LongLongAlign = 64;
2270 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 +00002271 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002272 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002273 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002274 virtual void getTargetDefines(const LangOptions &Opts,
2275 MacroBuilder &Builder) const {
2276 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2277 }
2278};
2279} // end anonymous namespace
2280
2281namespace {
2282
2283// x86-32 Windows Visual Studio target
2284class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2285public:
2286 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2287 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002288 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002289 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2290 }
2291 virtual void getTargetDefines(const LangOptions &Opts,
2292 MacroBuilder &Builder) const {
2293 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2294 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2295 // The value of the following reflects processor type.
2296 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2297 // We lost the original triple, so we use the default.
2298 Builder.defineMacro("_M_IX86", "600");
2299 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002300};
2301} // end anonymous namespace
2302
2303namespace {
2304// x86-32 MinGW target
2305class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2306public:
2307 MinGWX86_32TargetInfo(const std::string& triple)
2308 : WindowsX86_32TargetInfo(triple) {
2309 }
2310 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002311 MacroBuilder &Builder) const {
2312 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002313 DefineStd(Builder, "WIN32", Opts);
2314 DefineStd(Builder, "WINNT", Opts);
2315 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002316 Builder.defineMacro("__MSVCRT__");
2317 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002318
2319 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2320 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002321 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002322 // Provide "as-is" __declspec.
2323 Builder.defineMacro("__declspec", "__declspec");
2324 else
2325 // Provide alias of __attribute__ like mingw32-gcc.
2326 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002327 }
2328};
2329} // end anonymous namespace
2330
2331namespace {
2332// x86-32 Cygwin target
2333class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2334public:
2335 CygwinX86_32TargetInfo(const std::string& triple)
2336 : X86_32TargetInfo(triple) {
2337 TLSSupported = false;
2338 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002339 DoubleAlign = LongLongAlign = 64;
2340 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2341 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002342 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002343 }
2344 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002345 MacroBuilder &Builder) const {
2346 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2347 Builder.defineMacro("__CYGWIN__");
2348 Builder.defineMacro("__CYGWIN32__");
2349 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00002350 if (Opts.CPlusPlus)
2351 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00002352 }
Eli Friedman29a30502008-08-21 01:40:19 +00002353};
2354} // end anonymous namespace
2355
2356namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00002357// x86-32 Haiku target
2358class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2359public:
2360 HaikuX86_32TargetInfo(const std::string& triple)
2361 : X86_32TargetInfo(triple) {
2362 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00002363 IntPtrType = SignedLong;
2364 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00002365 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00002366 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00002367 virtual void getTargetDefines(const LangOptions &Opts,
2368 MacroBuilder &Builder) const {
2369 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2370 Builder.defineMacro("__INTEL__");
2371 Builder.defineMacro("__HAIKU__");
2372 }
2373};
2374} // end anonymous namespace
2375
Douglas Gregordca52262011-07-01 22:41:14 +00002376// RTEMS Target
2377template<typename Target>
2378class RTEMSTargetInfo : public OSTargetInfo<Target> {
2379protected:
2380 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2381 MacroBuilder &Builder) const {
2382 // RTEMS defines; list based off of gcc output
2383
Douglas Gregordca52262011-07-01 22:41:14 +00002384 Builder.defineMacro("__rtems__");
2385 Builder.defineMacro("__ELF__");
2386 }
2387public:
2388 RTEMSTargetInfo(const std::string &triple)
2389 : OSTargetInfo<Target>(triple) {
2390 this->UserLabelPrefix = "";
2391
2392 llvm::Triple Triple(triple);
2393 switch (Triple.getArch()) {
2394 default:
2395 case llvm::Triple::x86:
2396 // this->MCountName = ".mcount";
2397 break;
2398 case llvm::Triple::mips:
2399 case llvm::Triple::mipsel:
2400 case llvm::Triple::ppc:
2401 case llvm::Triple::ppc64:
2402 // this->MCountName = "_mcount";
2403 break;
2404 case llvm::Triple::arm:
2405 // this->MCountName = "__mcount";
2406 break;
2407 }
2408
2409 }
2410};
2411
2412namespace {
2413// x86-32 RTEMS target
2414class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2415public:
2416 RTEMSX86_32TargetInfo(const std::string& triple)
2417 : X86_32TargetInfo(triple) {
2418 SizeType = UnsignedLong;
2419 IntPtrType = SignedLong;
2420 PtrDiffType = SignedLong;
2421 this->UserLabelPrefix = "";
2422 }
2423 virtual void getTargetDefines(const LangOptions &Opts,
2424 MacroBuilder &Builder) const {
2425 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2426 Builder.defineMacro("__INTEL__");
2427 Builder.defineMacro("__rtems__");
2428 }
2429};
2430} // end anonymous namespace
2431
Chris Lattner86ed3a32010-04-11 19:29:39 +00002432namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002433// x86-64 generic target
2434class X86_64TargetInfo : public X86TargetInfo {
2435public:
Chris Lattner33328642009-03-20 15:52:06 +00002436 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00002437 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002438 LongDoubleWidth = 128;
2439 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00002440 LargeArrayMinWidth = 128;
2441 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002442 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00002443 IntMaxType = SignedLong;
2444 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002445 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002446 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00002447
Eli Friedmaned855cb2008-08-21 00:13:15 +00002448 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2449 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002450 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002451
2452 // Use fpret only for long double.
2453 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00002454
Anders Carlssoneea64802011-10-31 16:27:11 +00002455 // Use fp2ret for _Complex long double.
2456 ComplexLongDoubleUsesFP2Ret = true;
2457
Eli Friedman2be46072011-10-14 20:59:01 +00002458 // x86-64 has atomics up to 16 bytes.
2459 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2460 // on CPUs with cmpxchg16b
2461 MaxAtomicPromoteWidth = 128;
2462 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00002463 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00002464 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002465 return "typedef struct __va_list_tag {"
2466 " unsigned gp_offset;"
2467 " unsigned fp_offset;"
2468 " void* overflow_arg_area;"
2469 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00002470 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00002471 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00002472 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002473
Chris Lattner21fb98e2009-09-23 06:06:36 +00002474 int getEHDataRegisterNumber(unsigned RegNo) const {
2475 if (RegNo == 0) return 0;
2476 if (RegNo == 1) return 1;
2477 return -1;
2478 }
Eli Friedman618234a2008-08-20 02:34:37 +00002479};
2480} // end anonymous namespace
2481
2482namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002483// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002484class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002485public:
2486 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002487 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002488 TLSSupported = false;
2489 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00002490 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00002491 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00002492 IntMaxType = SignedLongLong;
2493 UIntMaxType = UnsignedLongLong;
2494 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00002495 SizeType = UnsignedLongLong;
2496 PtrDiffType = SignedLongLong;
2497 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00002498 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002499 }
2500 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002501 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002502 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002503 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00002504 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00002505 virtual const char *getVAListDeclaration() const {
2506 return "typedef char* __builtin_va_list;";
2507 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002508};
2509} // end anonymous namespace
2510
2511namespace {
2512// x86-64 Windows Visual Studio target
2513class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2514public:
2515 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2516 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002517 LongDoubleWidth = LongDoubleAlign = 64;
2518 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00002519 }
2520 virtual void getTargetDefines(const LangOptions &Opts,
2521 MacroBuilder &Builder) const {
2522 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2523 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00002524 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002525 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002526 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002527};
2528} // end anonymous namespace
2529
2530namespace {
2531// x86-64 MinGW target
2532class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2533public:
2534 MinGWX86_64TargetInfo(const std::string& triple)
2535 : WindowsX86_64TargetInfo(triple) {
2536 }
2537 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002538 MacroBuilder &Builder) const {
2539 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002540 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00002541 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00002542 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00002543 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002544
2545 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2546 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002547 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002548 // Provide "as-is" __declspec.
2549 Builder.defineMacro("__declspec", "__declspec");
2550 else
2551 // Provide alias of __attribute__ like mingw32-gcc.
2552 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002553 }
2554};
2555} // end anonymous namespace
2556
2557namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002558class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2559public:
Mike Stump1eb44332009-09-09 15:08:12 +00002560 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002561 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2562 Int64Type = SignedLongLong;
2563 }
2564};
2565} // end anonymous namespace
2566
2567namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00002568class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2569public:
Mike Stump1eb44332009-09-09 15:08:12 +00002570 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00002571 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2572 IntMaxType = SignedLongLong;
2573 UIntMaxType = UnsignedLongLong;
2574 Int64Type = SignedLongLong;
2575 }
2576};
2577} // end anonymous namespace
2578
2579namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00002580class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002581 // Possible FPU choices.
2582 enum FPUMode {
2583 NoFPU,
2584 VFP2FPU,
2585 VFP3FPU,
2586 NeonFPU
2587 };
2588
2589 static bool FPUModeIsVFP(FPUMode Mode) {
2590 return Mode >= VFP2FPU && Mode <= NeonFPU;
2591 }
2592
2593 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2594 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002595
Daniel Dunbareac7c532009-12-18 18:42:37 +00002596 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002597
2598 unsigned FPU : 3;
2599
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002600 unsigned IsThumb : 1;
2601
2602 // Initialized via features.
2603 unsigned SoftFloat : 1;
2604 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002605
Chris Lattner2752c012010-03-03 19:03:45 +00002606 static const Builtin::Info BuiltinInfo[];
2607
Chris Lattner393ff042008-04-21 18:56:49 +00002608public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002609 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00002610 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002611 {
Eli Friedmane6a24e82011-12-22 03:51:45 +00002612 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002613 SizeType = UnsignedInt;
2614 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00002615 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2616 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002617
Chris Lattner9bffb072010-04-23 16:29:58 +00002618 // {} in inline assembly are neon specifiers, not assembly variant
2619 // specifiers.
2620 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00002621
Daniel Dunbareac7c532009-12-18 18:42:37 +00002622 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00002623 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002624 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002625 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2626 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002627 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2628 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002629 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002630 } else {
2631 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2632 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002633 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002634 }
John McCallee79a4c2010-08-21 22:46:04 +00002635
2636 // ARM targets default to using the ARM C++ ABI.
2637 CXXABI = CXXABI_ARM;
Eli Friedman2be46072011-10-14 20:59:01 +00002638
2639 // ARM has atomics up to 8 bytes
2640 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2641 MaxAtomicPromoteWidth = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002642 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002643 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00002644 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002645 ABI = Name;
2646
Daniel Dunbara2a41612009-09-14 00:02:24 +00002647 // The defaults (above) are for AAPCS, check if we need to change them.
2648 //
2649 // FIXME: We need support for -meabi... we could just mangle it into the
2650 // name.
2651 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002652 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002653 SizeType = UnsignedLong;
2654
James Molloya6d81f92011-11-23 13:35:08 +00002655 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2656 WCharType = SignedInt;
2657
Daniel Dunbar684de632010-04-22 16:14:54 +00002658 // Do not respect the alignment of bit-field types when laying out
2659 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2660 UseBitFieldTypeAlignment = false;
2661
Chad Rosier61a62212011-08-04 01:21:14 +00002662 /// Do force alignment of members that follow zero length bitfields. If
2663 /// the alignment of the zero-length bitfield is greater than the member
2664 /// that follows it, `bar', `bar' will be aligned as the type of the
2665 /// zero length bitfield.
2666 UseZeroLengthBitfieldAlignment = true;
2667
2668 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00002669 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2670 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00002671 ZeroLengthBitfieldBoundary = 32;
2672
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002673 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002674 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2675 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002676 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 +00002677 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002678 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002679 } else {
2680 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 +00002681 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002682 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002683 }
2684
Chad Rosier9f1210c2011-07-26 07:03:04 +00002685 // FIXME: Override "preferred align" for double and long long.
Daniel Dunbara2a41612009-09-14 00:02:24 +00002686 } else if (Name == "aapcs") {
2687 // FIXME: Enumerated types are variable width in straight AAPCS.
2688 } else if (Name == "aapcs-linux") {
Chad Rosier9f1210c2011-07-26 07:03:04 +00002689 ;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002690 } else
2691 return false;
2692
2693 return true;
2694 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002695
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002696 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002697 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2698 Features["vfp2"] = true;
2699 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2700 Features["neon"] = true;
2701 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002702
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002703 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2704 const std::string &Name,
2705 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00002706 if (Name == "soft-float" || Name == "soft-float-abi" ||
Evgeniy Stepanov35dd7322012-01-11 11:21:31 +00002707 Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002708 Features[Name] = Enabled;
2709 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002710 return false;
2711
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002712 return true;
2713 }
2714
2715 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002716 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002717 SoftFloat = SoftFloatABI = false;
2718 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2719 if (Features[i] == "+soft-float")
2720 SoftFloat = true;
2721 else if (Features[i] == "+soft-float-abi")
2722 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002723 else if (Features[i] == "+vfp2")
2724 FPU = VFP2FPU;
2725 else if (Features[i] == "+vfp3")
2726 FPU = VFP3FPU;
2727 else if (Features[i] == "+neon")
2728 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002729 }
2730
2731 // Remove front-end specific options which the backend handles differently.
2732 std::vector<std::string>::iterator it;
2733 it = std::find(Features.begin(), Features.end(), "+soft-float");
2734 if (it != Features.end())
2735 Features.erase(it);
2736 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2737 if (it != Features.end())
2738 Features.erase(it);
2739 }
2740
Douglas Gregore727d212012-01-30 06:38:25 +00002741 virtual bool hasFeature(StringRef Feature) const {
2742 return llvm::StringSwitch<bool>(Feature)
2743 .Case("arm", true)
2744 .Case("softfloat", SoftFloat)
2745 .Case("thumb", IsThumb)
2746 .Case("neon", FPU == NeonFPU && !SoftFloat &&
2747 StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
2748 .Default(false);
2749 }
Chris Lattner5f9e2722011-07-23 10:55:15 +00002750 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00002751 return llvm::StringSwitch<const char*>(Name)
2752 .Cases("arm8", "arm810", "4")
2753 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2754 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2755 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2756 .Case("ep9312", "4T")
2757 .Cases("arm10tdmi", "arm1020t", "5T")
2758 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2759 .Case("arm926ej-s", "5TEJ")
2760 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2761 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002762 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002763 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002764 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002765 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2766 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00002767 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00002768 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002769 .Default(0);
2770 }
2771 virtual bool setCPU(const std::string &Name) {
2772 if (!getCPUDefineSuffix(Name))
2773 return false;
2774
2775 CPU = Name;
2776 return true;
2777 }
Chris Lattner33328642009-03-20 15:52:06 +00002778 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002779 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002780 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00002781 Builder.defineMacro("__arm");
2782 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002783
Chris Lattnerc0f59212009-03-02 22:27:17 +00002784 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00002785 Builder.defineMacro("__ARMEL__");
2786 Builder.defineMacro("__LITTLE_ENDIAN__");
2787 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002788
Chris Lattner5f9e2722011-07-23 10:55:15 +00002789 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00002790 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002791
Mike Stump437bb4b2009-04-08 02:07:04 +00002792 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002793
Daniel Dunbareac7c532009-12-18 18:42:37 +00002794 // FIXME: It's more complicated than this and we don't really support
2795 // interworking.
2796 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00002797 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002798
Daniel Dunbareac7c532009-12-18 18:42:37 +00002799 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00002800 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002801
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002802 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00002803 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002804
2805 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00002806 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002807
Bob Wilson84f95cf2011-05-13 18:56:03 +00002808 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002809 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002810 Builder.defineMacro("__THUMBEL__");
2811 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00002812 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002813 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002814 }
2815
2816 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00002817 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002818
2819 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00002820 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002821
2822 // This only gets set when Neon instructions are actually available, unlike
2823 // the VFP define, hence the soft float and arch check. This is subtly
2824 // different from gcc, we follow the intent which was that it should be set
2825 // when Neon instructions are actually available.
Bob Wilson84f95cf2011-05-13 18:56:03 +00002826 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002827 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00002828 }
2829 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2830 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00002831 Records = BuiltinInfo;
2832 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00002833 }
Bob Wilson8b30a932012-01-26 22:14:27 +00002834 virtual bool isCLZForZeroUndef() const { return false; }
Chris Lattner393ff042008-04-21 18:56:49 +00002835 virtual const char *getVAListDeclaration() const {
John McCall0e9972c2011-05-09 02:19:37 +00002836 return "typedef void* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00002837 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002838 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002839 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002840 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002841 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002842 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002843 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002844 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002845 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00002846 default:
Nate Begemanad487f42008-04-22 05:03:19 +00002847 case 'l': // r0-r7
2848 case 'h': // r8-r15
2849 case 'w': // VFP Floating point register single precision
2850 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00002851 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00002852 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00002853 case 'Q': // A memory address that is a single base register.
2854 Info.setAllowsMemory();
2855 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00002856 case 'U': // a memory reference...
2857 switch (Name[1]) {
2858 case 'q': // ...ARMV4 ldrsb
2859 case 'v': // ...VFP load/store (reg+constant offset)
2860 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00002861 case 't': // address valid for load/store opaque types wider
2862 // than 128-bits
2863 case 'n': // valid address for Neon doubleword vector load/store
2864 case 'm': // valid address for Neon element and structure load/store
2865 case 's': // valid address for non-offset loads/stores of quad-word
2866 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00002867 Info.setAllowsMemory();
2868 Name++;
2869 return true;
2870 }
Nate Begemanad487f42008-04-22 05:03:19 +00002871 }
Chris Lattner393ff042008-04-21 18:56:49 +00002872 return false;
2873 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00002874 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00002875 std::string R;
2876 switch (*Constraint) {
2877 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00002878 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00002879 Constraint++;
2880 break;
Eric Christopher283f4472011-06-17 00:40:18 +00002881 case 'p': // 'p' should be translated to 'r' by default.
2882 R = std::string("r");
2883 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00002884 default:
2885 return std::string(1, *Constraint);
2886 }
2887 return R;
2888 }
Chris Lattner393ff042008-04-21 18:56:49 +00002889 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002890 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00002891 return "";
2892 }
2893};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002894
2895const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002896 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002897 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002898 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2899
2900 // Float registers
2901 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2902 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2903 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002904 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002905
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002906 // Double registers
2907 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2908 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00002909 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2910 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002911
2912 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00002913 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2914 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002915};
2916
2917void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002918 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002919 Names = GCCRegNames;
2920 NumNames = llvm::array_lengthof(GCCRegNames);
2921}
2922
2923const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002924 { { "a1" }, "r0" },
2925 { { "a2" }, "r1" },
2926 { { "a3" }, "r2" },
2927 { { "a4" }, "r3" },
2928 { { "v1" }, "r4" },
2929 { { "v2" }, "r5" },
2930 { { "v3" }, "r6" },
2931 { { "v4" }, "r7" },
2932 { { "v5" }, "r8" },
2933 { { "v6", "rfp" }, "r9" },
2934 { { "sl" }, "r10" },
2935 { { "fp" }, "r11" },
2936 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002937 { { "r13" }, "sp" },
2938 { { "r14" }, "lr" },
2939 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002940 // The S, D and Q registers overlap, but aren't really aliases; we
2941 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002942};
2943
2944void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2945 unsigned &NumAliases) const {
2946 Aliases = GCCRegAliases;
2947 NumAliases = llvm::array_lengthof(GCCRegAliases);
2948}
Chris Lattner2752c012010-03-03 19:03:45 +00002949
2950const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00002951#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002952#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00002953 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00002954#include "clang/Basic/BuiltinsARM.def"
2955};
Chris Lattner393ff042008-04-21 18:56:49 +00002956} // end anonymous namespace.
2957
Eli Friedmana9f54962008-08-20 07:44:10 +00002958namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002959class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002960 public DarwinTargetInfo<ARMTargetInfo> {
2961protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002962 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002963 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002964 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00002965 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002966
Torok Edwin5f6c1942009-06-30 17:10:35 +00002967public:
Mike Stump1eb44332009-09-09 15:08:12 +00002968 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002969 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2970 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00002971 // iOS always has 64-bit atomic instructions.
2972 // FIXME: This should be based off of the target features in ARMTargetInfo.
2973 MaxAtomicInlineWidth = 64;
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002974 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002975};
2976} // end anonymous namespace.
2977
Tony Linthicum96319392011-12-12 21:14:55 +00002978
2979namespace {
2980// Hexagon abstract base class
2981class HexagonTargetInfo : public TargetInfo {
2982 static const Builtin::Info BuiltinInfo[];
2983 static const char * const GCCRegNames[];
2984 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2985 std::string CPU;
2986public:
2987 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00002988 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00002989 DescriptionString = ("e-p:32:32:32-"
2990 "i64:64:64-i32:32:32-"
2991 "i16:16:16-i1:32:32-a:0:0");
2992
2993 // {} in inline assembly are packet specifiers, not assembly variant
2994 // specifiers.
2995 NoAsmVariants = true;
2996 }
2997
2998 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2999 unsigned &NumRecords) const {
3000 Records = BuiltinInfo;
3001 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3002 }
3003
3004 virtual bool validateAsmConstraint(const char *&Name,
3005 TargetInfo::ConstraintInfo &Info) const {
3006 return true;
3007 }
3008
3009 virtual void getTargetDefines(const LangOptions &Opts,
3010 MacroBuilder &Builder) const;
3011
Douglas Gregore727d212012-01-30 06:38:25 +00003012 virtual bool hasFeature(StringRef Feature) const {
3013 return Feature == "hexagon";
3014 }
3015
Tony Linthicum96319392011-12-12 21:14:55 +00003016 virtual const char *getVAListDeclaration() const {
3017 return "typedef char* __builtin_va_list;";
3018 }
3019 virtual void getGCCRegNames(const char * const *&Names,
3020 unsigned &NumNames) const;
3021 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3022 unsigned &NumAliases) const;
3023 virtual const char *getClobbers() const {
3024 return "";
3025 }
Sebastian Pop43115d42012-01-13 20:37:10 +00003026
3027 static const char *getHexagonCPUSuffix(StringRef Name) {
3028 return llvm::StringSwitch<const char*>(Name)
3029 .Case("hexagonv2", "2")
3030 .Case("hexagonv3", "3")
3031 .Case("hexagonv4", "4")
3032 .Default(0);
3033 }
3034
Tony Linthicum96319392011-12-12 21:14:55 +00003035 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00003036 if (!getHexagonCPUSuffix(Name))
3037 return false;
3038
Tony Linthicum96319392011-12-12 21:14:55 +00003039 CPU = Name;
3040 return true;
3041 }
3042};
3043
3044void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
3045 MacroBuilder &Builder) const {
3046 Builder.defineMacro("qdsp6");
3047 Builder.defineMacro("__qdsp6", "1");
3048 Builder.defineMacro("__qdsp6__", "1");
3049
3050 Builder.defineMacro("hexagon");
3051 Builder.defineMacro("__hexagon", "1");
3052 Builder.defineMacro("__hexagon__", "1");
3053
3054 if(CPU == "hexagonv1") {
3055 Builder.defineMacro("__HEXAGON_V1__");
3056 Builder.defineMacro("__HEXAGON_ARCH__", "1");
3057 if(Opts.HexagonQdsp6Compat) {
3058 Builder.defineMacro("__QDSP6_V1__");
3059 Builder.defineMacro("__QDSP6_ARCH__", "1");
3060 }
3061 }
3062 else if(CPU == "hexagonv2") {
3063 Builder.defineMacro("__HEXAGON_V2__");
3064 Builder.defineMacro("__HEXAGON_ARCH__", "2");
3065 if(Opts.HexagonQdsp6Compat) {
3066 Builder.defineMacro("__QDSP6_V2__");
3067 Builder.defineMacro("__QDSP6_ARCH__", "2");
3068 }
3069 }
3070 else if(CPU == "hexagonv3") {
3071 Builder.defineMacro("__HEXAGON_V3__");
3072 Builder.defineMacro("__HEXAGON_ARCH__", "3");
3073 if(Opts.HexagonQdsp6Compat) {
3074 Builder.defineMacro("__QDSP6_V3__");
3075 Builder.defineMacro("__QDSP6_ARCH__", "3");
3076 }
3077 }
3078 else if(CPU == "hexagonv4") {
3079 Builder.defineMacro("__HEXAGON_V4__");
3080 Builder.defineMacro("__HEXAGON_ARCH__", "4");
3081 if(Opts.HexagonQdsp6Compat) {
3082 Builder.defineMacro("__QDSP6_V4__");
3083 Builder.defineMacro("__QDSP6_ARCH__", "4");
3084 }
3085 }
3086}
3087
3088const char * const HexagonTargetInfo::GCCRegNames[] = {
3089 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3090 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3091 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3092 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3093 "p0", "p1", "p2", "p3",
3094 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3095};
3096
3097void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3098 unsigned &NumNames) const {
3099 Names = GCCRegNames;
3100 NumNames = llvm::array_lengthof(GCCRegNames);
3101}
3102
3103
3104const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3105 { { "sp" }, "r29" },
3106 { { "fp" }, "r30" },
3107 { { "lr" }, "r31" },
3108 };
3109
3110void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3111 unsigned &NumAliases) const {
3112 Aliases = GCCRegAliases;
3113 NumAliases = llvm::array_lengthof(GCCRegAliases);
3114}
3115
3116
3117const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3118#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3119#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3120 ALL_LANGUAGES },
3121#include "clang/Basic/BuiltinsHexagon.def"
3122};
3123}
3124
3125
Reid Spencer5f016e22007-07-11 17:01:13 +00003126namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00003127class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00003128 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3129 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003130 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00003131public:
Eli Friedman01b86682008-08-20 07:28:14 +00003132 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3133 // FIXME: Support Sparc quad-precision long double?
Eli Friedmane6a24e82011-12-22 03:51:45 +00003134 BigEndian = false;
Eli Friedmaned855cb2008-08-21 00:13:15 +00003135 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 +00003136 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00003137 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003138 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3139 const std::string &Name,
3140 bool Enabled) const {
3141 if (Name == "soft-float")
3142 Features[Name] = Enabled;
3143 else
3144 return false;
3145
3146 return true;
3147 }
3148 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3149 SoftFloat = false;
3150 for (unsigned i = 0, e = Features.size(); i != e; ++i)
3151 if (Features[i] == "+soft-float")
3152 SoftFloat = true;
3153 }
Chris Lattner33328642009-03-20 15:52:06 +00003154 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003155 MacroBuilder &Builder) const {
3156 DefineStd(Builder, "sparc", Opts);
3157 Builder.defineMacro("__sparcv8");
3158 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003159
3160 if (SoftFloat)
3161 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00003162 }
Douglas Gregore727d212012-01-30 06:38:25 +00003163
3164 virtual bool hasFeature(StringRef Feature) const {
3165 return llvm::StringSwitch<bool>(Feature)
3166 .Case("softfloat", SoftFloat)
3167 .Case("sparc", true)
3168 .Default(false);
3169 }
3170
Gabor Greif26658672008-02-21 16:29:08 +00003171 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3172 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003173 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00003174 }
3175 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003176 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00003177 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003178 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003179 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003180 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003181 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003182 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00003183 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003184 // FIXME: Implement!
3185 return false;
Gabor Greif26658672008-02-21 16:29:08 +00003186 }
3187 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003188 // FIXME: Implement!
3189 return "";
Gabor Greif26658672008-02-21 16:29:08 +00003190 }
3191};
3192
Chris Lattnere957f532009-01-27 01:58:38 +00003193const char * const SparcV8TargetInfo::GCCRegNames[] = {
3194 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3195 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3196 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3197 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3198};
3199
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003200void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003201 unsigned &NumNames) const {
3202 Names = GCCRegNames;
3203 NumNames = llvm::array_lengthof(GCCRegNames);
3204}
3205
3206const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003207 { { "g0" }, "r0" },
3208 { { "g1" }, "r1" },
3209 { { "g2" }, "r2" },
3210 { { "g3" }, "r3" },
3211 { { "g4" }, "r4" },
3212 { { "g5" }, "r5" },
3213 { { "g6" }, "r6" },
3214 { { "g7" }, "r7" },
3215 { { "o0" }, "r8" },
3216 { { "o1" }, "r9" },
3217 { { "o2" }, "r10" },
3218 { { "o3" }, "r11" },
3219 { { "o4" }, "r12" },
3220 { { "o5" }, "r13" },
3221 { { "o6", "sp" }, "r14" },
3222 { { "o7" }, "r15" },
3223 { { "l0" }, "r16" },
3224 { { "l1" }, "r17" },
3225 { { "l2" }, "r18" },
3226 { { "l3" }, "r19" },
3227 { { "l4" }, "r20" },
3228 { { "l5" }, "r21" },
3229 { { "l6" }, "r22" },
3230 { { "l7" }, "r23" },
3231 { { "i0" }, "r24" },
3232 { { "i1" }, "r25" },
3233 { { "i2" }, "r26" },
3234 { { "i3" }, "r27" },
3235 { { "i4" }, "r28" },
3236 { { "i5" }, "r29" },
3237 { { "i6", "fp" }, "r30" },
3238 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00003239};
3240
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003241void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003242 unsigned &NumAliases) const {
3243 Aliases = GCCRegAliases;
3244 NumAliases = llvm::array_lengthof(GCCRegAliases);
3245}
Gabor Greif26658672008-02-21 16:29:08 +00003246} // end anonymous namespace.
3247
Eli Friedman01b86682008-08-20 07:28:14 +00003248namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003249class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3250public:
3251 AuroraUXSparcV8TargetInfo(const std::string& triple) :
3252 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3253 SizeType = UnsignedInt;
3254 PtrDiffType = SignedInt;
3255 }
3256};
Torok Edwin5f6c1942009-06-30 17:10:35 +00003257class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00003258public:
3259 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003260 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00003261 SizeType = UnsignedInt;
3262 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00003263 }
3264};
3265} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00003266
Chris Lattner2621fd12008-05-08 05:58:21 +00003267namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003268 class MSP430TargetInfo : public TargetInfo {
3269 static const char * const GCCRegNames[];
3270 public:
3271 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003272 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003273 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00003274 IntWidth = 16; IntAlign = 16;
3275 LongWidth = 32; LongLongWidth = 64;
3276 LongAlign = LongLongAlign = 16;
3277 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003278 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003279 SizeType = UnsignedInt;
3280 IntMaxType = SignedLong;
3281 UIntMaxType = UnsignedLong;
3282 IntPtrType = SignedShort;
3283 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00003284 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00003285 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003286 }
3287 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003288 MacroBuilder &Builder) const {
3289 Builder.defineMacro("MSP430");
3290 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003291 // FIXME: defines for different 'flavours' of MCU
3292 }
3293 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3294 unsigned &NumRecords) const {
3295 // FIXME: Implement.
3296 Records = 0;
3297 NumRecords = 0;
3298 }
Douglas Gregore727d212012-01-30 06:38:25 +00003299 virtual bool hasFeature(StringRef Feature) const {
3300 return Feature == "msp430";
3301 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003302 virtual void getGCCRegNames(const char * const *&Names,
3303 unsigned &NumNames) const;
3304 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3305 unsigned &NumAliases) const {
3306 // No aliases.
3307 Aliases = 0;
3308 NumAliases = 0;
3309 }
3310 virtual bool validateAsmConstraint(const char *&Name,
3311 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00003312 // No target constraints for now.
3313 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003314 }
3315 virtual const char *getClobbers() const {
3316 // FIXME: Is this really right?
3317 return "";
3318 }
3319 virtual const char *getVAListDeclaration() const {
3320 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00003321 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003322 }
3323 };
3324
3325 const char * const MSP430TargetInfo::GCCRegNames[] = {
3326 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3327 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3328 };
3329
3330 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3331 unsigned &NumNames) const {
3332 Names = GCCRegNames;
3333 NumNames = llvm::array_lengthof(GCCRegNames);
3334 }
3335}
3336
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00003337namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00003338
Mike Stump1eb44332009-09-09 15:08:12 +00003339 // LLVM and Clang cannot be used directly to output native binaries for
3340 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00003341 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00003342 //
3343 // TCE uses the llvm bitcode as input and uses it for generating customized
3344 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00003345 // publicly available in http://tce.cs.tut.fi
3346
Eli Friedman209f5bb2011-10-07 19:51:42 +00003347 static const unsigned TCEOpenCLAddrSpaceMap[] = {
3348 3, // opencl_global
3349 4, // opencl_local
3350 5 // opencl_constant
3351 };
3352
Eli Friedmanb63decf2009-08-19 20:47:07 +00003353 class TCETargetInfo : public TargetInfo{
3354 public:
3355 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3356 TLSSupported = false;
3357 IntWidth = 32;
3358 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003359 PointerWidth = 32;
3360 IntAlign = 32;
3361 LongAlign = LongLongAlign = 32;
3362 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003363 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003364 SizeType = UnsignedInt;
3365 IntMaxType = SignedLong;
3366 UIntMaxType = UnsignedLong;
3367 IntPtrType = SignedInt;
3368 PtrDiffType = SignedInt;
3369 FloatWidth = 32;
3370 FloatAlign = 32;
3371 DoubleWidth = 32;
3372 DoubleAlign = 32;
3373 LongDoubleWidth = 32;
3374 LongDoubleAlign = 32;
3375 FloatFormat = &llvm::APFloat::IEEEsingle;
3376 DoubleFormat = &llvm::APFloat::IEEEsingle;
3377 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00003378 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3379 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00003380 "f32:32:32-f64:32:32-v64:32:32-"
3381 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00003382 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003383 }
3384
3385 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003386 MacroBuilder &Builder) const {
3387 DefineStd(Builder, "tce", Opts);
3388 Builder.defineMacro("__TCE__");
3389 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00003390 }
Douglas Gregore727d212012-01-30 06:38:25 +00003391 virtual bool hasFeature(StringRef Feature) const {
3392 return Feature == "tce";
3393 }
3394
Eli Friedmanb63decf2009-08-19 20:47:07 +00003395 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3396 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00003397 virtual const char *getClobbers() const {
3398 return "";
3399 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003400 virtual const char *getVAListDeclaration() const {
3401 return "typedef void* __builtin_va_list;";
3402 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003403 virtual void getGCCRegNames(const char * const *&Names,
3404 unsigned &NumNames) const {}
3405 virtual bool validateAsmConstraint(const char *&Name,
3406 TargetInfo::ConstraintInfo &info) const {
3407 return true;
3408 }
3409 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3410 unsigned &NumAliases) const {}
3411 };
3412}
3413
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003414namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003415class MipsTargetInfoBase : public TargetInfo {
3416 std::string CPU;
3417protected:
3418 std::string ABI;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003419public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003420 MipsTargetInfoBase(const std::string& triple, const std::string& ABIStr)
Akira Hatanaka148735e2011-11-05 01:48:34 +00003421 : TargetInfo(triple), ABI(ABIStr) {}
Eric Christophered734732010-03-02 02:41:08 +00003422 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003423 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00003424 virtual bool setCPU(const std::string &Name) {
3425 CPU = Name;
3426 return true;
3427 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003428 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00003429 Features[ABI] = true;
3430 Features[CPU] = true;
3431 }
3432 virtual void getArchDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003433 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003434 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003435 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003436 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3437 unsigned &NumRecords) const {
3438 // FIXME: Implement!
3439 }
Douglas Gregore727d212012-01-30 06:38:25 +00003440 virtual bool hasFeature(StringRef Feature) const {
3441 return Feature == "mips";
3442 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003443 virtual const char *getVAListDeclaration() const {
3444 return "typedef void* __builtin_va_list;";
3445 }
3446 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003447 unsigned &NumNames) const {
3448 static const char * const GCCRegNames[] = {
3449 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
3450 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
3451 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
3452 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
3453 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
3454 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3455 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3456 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3457 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3458 "$fcc5","$fcc6","$fcc7"
3459 };
3460 Names = GCCRegNames;
3461 NumNames = llvm::array_lengthof(GCCRegNames);
3462 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003463 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003464 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003465 virtual bool validateAsmConstraint(const char *&Name,
3466 TargetInfo::ConstraintInfo &Info) const {
3467 switch (*Name) {
3468 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00003469 return false;
3470
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003471 case 'r': // CPU registers.
3472 case 'd': // Equivalent to "r" unless generating MIPS16 code.
3473 case 'y': // Equivalent to "r", backwards compatibility only.
3474 case 'f': // floating-point registers.
3475 Info.setAllowsRegister();
3476 return true;
3477 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003478 }
3479
3480 virtual const char *getClobbers() const {
3481 // FIXME: Implement!
3482 return "";
3483 }
3484};
3485
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003486class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003487public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003488 Mips32TargetInfoBase(const std::string& triple) :
Akira Hatanaka148735e2011-11-05 01:48:34 +00003489 MipsTargetInfoBase(triple, "o32") {
3490 SizeType = UnsignedInt;
3491 PtrDiffType = SignedInt;
3492 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003493 virtual bool setABI(const std::string &Name) {
3494 if ((Name == "o32") || (Name == "eabi")) {
3495 ABI = Name;
3496 return true;
3497 } else
3498 return false;
3499 }
3500 virtual void getArchDefines(const LangOptions &Opts,
3501 MacroBuilder &Builder) const {
Douglas Gregorc9a23712011-11-09 15:17:16 +00003502 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3503 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3504 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
3505
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003506 if (ABI == "o32") {
3507 Builder.defineMacro("__mips_o32");
3508 Builder.defineMacro("_ABIO32", "1");
3509 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3510 }
3511 else if (ABI == "eabi")
3512 Builder.defineMacro("__mips_eabi");
3513 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003514 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003515 }
3516 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3517 unsigned &NumAliases) const {
3518 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3519 { { "at" }, "$1" },
3520 { { "v0" }, "$2" },
3521 { { "v1" }, "$3" },
3522 { { "a0" }, "$4" },
3523 { { "a1" }, "$5" },
3524 { { "a2" }, "$6" },
3525 { { "a3" }, "$7" },
3526 { { "t0" }, "$8" },
3527 { { "t1" }, "$9" },
3528 { { "t2" }, "$10" },
3529 { { "t3" }, "$11" },
3530 { { "t4" }, "$12" },
3531 { { "t5" }, "$13" },
3532 { { "t6" }, "$14" },
3533 { { "t7" }, "$15" },
3534 { { "s0" }, "$16" },
3535 { { "s1" }, "$17" },
3536 { { "s2" }, "$18" },
3537 { { "s3" }, "$19" },
3538 { { "s4" }, "$20" },
3539 { { "s5" }, "$21" },
3540 { { "s6" }, "$22" },
3541 { { "s7" }, "$23" },
3542 { { "t8" }, "$24" },
3543 { { "t9" }, "$25" },
3544 { { "k0" }, "$26" },
3545 { { "k1" }, "$27" },
3546 { { "gp" }, "$28" },
3547 { { "sp" }, "$29" },
3548 { { "fp" }, "$30" },
3549 { { "ra" }, "$31" }
3550 };
3551 Aliases = GCCRegAliases;
3552 NumAliases = llvm::array_lengthof(GCCRegAliases);
3553 }
3554};
3555
3556class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3557public:
3558 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3559 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3560 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3561 }
3562 virtual void getTargetDefines(const LangOptions &Opts,
3563 MacroBuilder &Builder) const {
3564 DefineStd(Builder, "mips", Opts);
3565 Builder.defineMacro("_mips");
3566 DefineStd(Builder, "MIPSEB", Opts);
3567 Builder.defineMacro("_MIPSEB");
3568 Builder.defineMacro("__REGISTER_PREFIX__", "");
3569 getArchDefines(Opts, Builder);
3570 }
3571};
3572
3573class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3574public:
3575 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003576 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003577 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka619e8872011-06-02 00:09:17 +00003578 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003579 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003580 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003581 MacroBuilder &Builder) const {
3582 DefineStd(Builder, "mips", Opts);
3583 Builder.defineMacro("_mips");
3584 DefineStd(Builder, "MIPSEL", Opts);
3585 Builder.defineMacro("_MIPSEL");
3586 Builder.defineMacro("__REGISTER_PREFIX__", "");
3587 getArchDefines(Opts, Builder);
3588 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003589};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003590
3591class Mips64TargetInfoBase : public MipsTargetInfoBase {
3592 virtual void SetDescriptionString(const std::string &Name) = 0;
3593public:
3594 Mips64TargetInfoBase(const std::string& triple) :
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003595 MipsTargetInfoBase(triple, "n64") {
3596 LongWidth = LongAlign = 64;
3597 PointerWidth = PointerAlign = 64;
3598 LongDoubleWidth = LongDoubleAlign = 128;
3599 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003600 SuitableAlign = 128;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003601 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003602 virtual bool setABI(const std::string &Name) {
3603 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003604
3605 if (Name != "n32" && Name != "n64")
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003606 return false;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003607
3608 ABI = Name;
3609
3610 if (Name == "n32") {
3611 LongWidth = LongAlign = 32;
3612 PointerWidth = PointerAlign = 32;
3613 }
3614
3615 return true;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003616 }
3617 virtual void getArchDefines(const LangOptions &Opts,
3618 MacroBuilder &Builder) const {
3619 if (ABI == "n32") {
3620 Builder.defineMacro("__mips_n32");
3621 Builder.defineMacro("_ABIN32", "2");
3622 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3623 }
3624 else if (ABI == "n64") {
3625 Builder.defineMacro("__mips_n64");
3626 Builder.defineMacro("_ABI64", "3");
3627 Builder.defineMacro("_MIPS_SIM", "_ABI64");
3628 }
3629 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003630 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003631 }
3632 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3633 unsigned &NumAliases) const {
3634 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3635 { { "at" }, "$1" },
3636 { { "v0" }, "$2" },
3637 { { "v1" }, "$3" },
3638 { { "a0" }, "$4" },
3639 { { "a1" }, "$5" },
3640 { { "a2" }, "$6" },
3641 { { "a3" }, "$7" },
3642 { { "a4" }, "$8" },
3643 { { "a5" }, "$9" },
3644 { { "a6" }, "$10" },
3645 { { "a7" }, "$11" },
3646 { { "t0" }, "$12" },
3647 { { "t1" }, "$13" },
3648 { { "t2" }, "$14" },
3649 { { "t3" }, "$15" },
3650 { { "s0" }, "$16" },
3651 { { "s1" }, "$17" },
3652 { { "s2" }, "$18" },
3653 { { "s3" }, "$19" },
3654 { { "s4" }, "$20" },
3655 { { "s5" }, "$21" },
3656 { { "s6" }, "$22" },
3657 { { "s7" }, "$23" },
3658 { { "t8" }, "$24" },
3659 { { "t9" }, "$25" },
3660 { { "k0" }, "$26" },
3661 { { "k1" }, "$27" },
3662 { { "gp" }, "$28" },
3663 { { "sp" }, "$29" },
3664 { { "fp" }, "$30" },
3665 { { "ra" }, "$31" }
3666 };
3667 Aliases = GCCRegAliases;
3668 NumAliases = llvm::array_lengthof(GCCRegAliases);
3669 }
3670};
3671
3672class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3673 virtual void SetDescriptionString(const std::string &Name) {
3674 // Change DescriptionString only if ABI is n32.
3675 if (Name == "n32")
3676 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 +00003677 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3678 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003679 }
3680public:
3681 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3682 // Default ABI is n64.
3683 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 +00003684 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3685 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003686 }
3687 virtual void getTargetDefines(const LangOptions &Opts,
3688 MacroBuilder &Builder) const {
3689 DefineStd(Builder, "mips", Opts);
3690 Builder.defineMacro("_mips");
3691 DefineStd(Builder, "MIPSEB", Opts);
3692 Builder.defineMacro("_MIPSEB");
3693 Builder.defineMacro("__REGISTER_PREFIX__", "");
3694 getArchDefines(Opts, Builder);
3695 }
3696};
3697
3698class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3699 virtual void SetDescriptionString(const std::string &Name) {
3700 // Change DescriptionString only if ABI is n32.
3701 if (Name == "n32")
3702 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 +00003703 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
3704 "-v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003705 }
3706public:
3707 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003708 // Default ABI is n64.
3709 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003710 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 +00003711 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3712 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003713 }
3714 virtual void getTargetDefines(const LangOptions &Opts,
3715 MacroBuilder &Builder) const {
3716 DefineStd(Builder, "mips", Opts);
3717 Builder.defineMacro("_mips");
3718 DefineStd(Builder, "MIPSEL", Opts);
3719 Builder.defineMacro("_MIPSEL");
3720 Builder.defineMacro("__REGISTER_PREFIX__", "");
3721 getArchDefines(Opts, Builder);
3722 }
3723};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003724} // end anonymous namespace.
3725
Ivan Krasinef05abd2011-08-24 20:22:22 +00003726namespace {
3727class PNaClTargetInfo : public TargetInfo {
3728public:
3729 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003730 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003731 this->UserLabelPrefix = "";
3732 this->LongAlign = 32;
3733 this->LongWidth = 32;
3734 this->PointerAlign = 32;
3735 this->PointerWidth = 32;
3736 this->IntMaxType = TargetInfo::SignedLongLong;
3737 this->UIntMaxType = TargetInfo::UnsignedLongLong;
3738 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003739 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003740 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003741 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003742 this->SizeType = TargetInfo::UnsignedInt;
3743 this->PtrDiffType = TargetInfo::SignedInt;
3744 this->IntPtrType = TargetInfo::SignedInt;
David Meyerdd4a8892011-10-11 03:12:01 +00003745 this->RegParmMax = 2;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003746 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3747 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3748 }
3749
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003750 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00003751 }
3752 virtual void getArchDefines(const LangOptions &Opts,
3753 MacroBuilder &Builder) const {
3754 Builder.defineMacro("__le32__");
3755 Builder.defineMacro("__pnacl__");
3756 }
3757 virtual void getTargetDefines(const LangOptions &Opts,
3758 MacroBuilder &Builder) const {
Ivan Krasin089ee112011-08-25 23:49:20 +00003759 DefineStd(Builder, "unix", Opts);
3760 Builder.defineMacro("__ELF__");
3761 if (Opts.POSIXThreads)
3762 Builder.defineMacro("_REENTRANT");
3763 if (Opts.CPlusPlus)
3764 Builder.defineMacro("_GNU_SOURCE");
3765
Ivan Krasinef05abd2011-08-24 20:22:22 +00003766 Builder.defineMacro("__native_client__");
3767 getArchDefines(Opts, Builder);
3768 }
Douglas Gregore727d212012-01-30 06:38:25 +00003769 virtual bool hasFeature(StringRef Feature) const {
3770 return Feature == "pnacl";
3771 }
Ivan Krasinef05abd2011-08-24 20:22:22 +00003772 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3773 unsigned &NumRecords) const {
3774 }
3775 virtual const char *getVAListDeclaration() const {
Ivan Krasin68018db2011-09-20 14:56:54 +00003776 return "typedef int __builtin_va_list[4];";
Ivan Krasinef05abd2011-08-24 20:22:22 +00003777 }
3778 virtual void getGCCRegNames(const char * const *&Names,
3779 unsigned &NumNames) const;
3780 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3781 unsigned &NumAliases) const;
3782 virtual bool validateAsmConstraint(const char *&Name,
3783 TargetInfo::ConstraintInfo &Info) const {
3784 return false;
3785 }
3786
3787 virtual const char *getClobbers() const {
3788 return "";
3789 }
3790};
3791
3792void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
3793 unsigned &NumNames) const {
3794 Names = NULL;
3795 NumNames = 0;
3796}
3797
3798void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3799 unsigned &NumAliases) const {
3800 Aliases = NULL;
3801 NumAliases = 0;
3802}
3803} // end anonymous namespace.
3804
3805
Reid Spencer5f016e22007-07-11 17:01:13 +00003806//===----------------------------------------------------------------------===//
3807// Driver code
3808//===----------------------------------------------------------------------===//
3809
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003810static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003811 llvm::Triple Triple(T);
3812 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00003813
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003814 switch (Triple.getArch()) {
3815 default:
3816 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00003817
Tony Linthicum96319392011-12-12 21:14:55 +00003818 case llvm::Triple::hexagon:
3819 return new HexagonTargetInfo(T);
3820
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003821 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00003822 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003823 if (Triple.isOSDarwin())
3824 return new DarwinARMTargetInfo(T);
3825
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003826 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00003827 case llvm::Triple::Linux:
3828 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003829 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00003830 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003831 case llvm::Triple::NetBSD:
3832 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00003833 case llvm::Triple::RTEMS:
3834 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003835 default:
3836 return new ARMTargetInfo(T);
3837 }
Eli Friedman61538a72008-05-20 14:21:01 +00003838
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003839 case llvm::Triple::msp430:
3840 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00003841
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003842 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003843 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003844 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003845 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003846 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003847 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003848 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003849 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003850 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003851 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003852 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003853 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003854 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003855
3856 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003857 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003858 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003859 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003860 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003861 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003862 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003863 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003864 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003865 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003866 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003867 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003868 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003869
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003870 case llvm::Triple::mips64:
3871 switch (os) {
3872 case llvm::Triple::Linux:
3873 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
3874 case llvm::Triple::RTEMS:
3875 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
3876 case llvm::Triple::FreeBSD:
3877 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
3878 case llvm::Triple::NetBSD:
3879 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
3880 default:
3881 return new Mips64EBTargetInfo(T);
3882 }
3883
3884 case llvm::Triple::mips64el:
3885 switch (os) {
3886 case llvm::Triple::Linux:
3887 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
3888 case llvm::Triple::RTEMS:
3889 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
3890 case llvm::Triple::FreeBSD:
3891 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
3892 case llvm::Triple::NetBSD:
3893 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
3894 default:
3895 return new Mips64ELTargetInfo(T);
3896 }
3897
Ivan Krasinef05abd2011-08-24 20:22:22 +00003898 case llvm::Triple::le32:
3899 switch (os) {
3900 case llvm::Triple::NativeClient:
3901 return new PNaClTargetInfo(T);
3902 default:
3903 return NULL;
3904 }
3905
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003906 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003907 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00003908 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003909 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003910 case llvm::Triple::Linux:
3911 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003912 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00003913 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003914 case llvm::Triple::NetBSD:
3915 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
3916 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00003917 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003918 default:
3919 return new PPC32TargetInfo(T);
3920 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003921
3922 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003923 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00003924 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003925 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003926 case llvm::Triple::Linux:
3927 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003928 case llvm::Triple::Lv2:
John Thompson3f6918a2009-11-19 17:18:50 +00003929 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003930 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00003931 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003932 case llvm::Triple::NetBSD:
3933 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
3934 default:
3935 return new PPC64TargetInfo(T);
3936 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003937
Justin Holewinski285dc652011-04-20 19:34:15 +00003938 case llvm::Triple::ptx32:
3939 return new PTX32TargetInfo(T);
3940 case llvm::Triple::ptx64:
3941 return new PTX64TargetInfo(T);
3942
Chris Lattner9cbeb632010-03-06 21:21:27 +00003943 case llvm::Triple::mblaze:
3944 return new MBlazeTargetInfo(T);
3945
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003946 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003947 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003948 case llvm::Triple::Linux:
3949 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003950 case llvm::Triple::AuroraUX:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003951 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003952 case llvm::Triple::Solaris:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003953 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003954 case llvm::Triple::NetBSD:
3955 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
3956 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00003957 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003958 default:
3959 return new SparcV8TargetInfo(T);
3960 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003961
John Thompson3f6918a2009-11-19 17:18:50 +00003962 // FIXME: Need a real SPU target.
3963 case llvm::Triple::cellspu:
3964 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
3965
Eli Friedmanb63decf2009-08-19 20:47:07 +00003966 case llvm::Triple::tce:
3967 return new TCETargetInfo(T);
3968
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003969 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003970 if (Triple.isOSDarwin())
3971 return new DarwinI386TargetInfo(T);
3972
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003973 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003974 case llvm::Triple::AuroraUX:
3975 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003976 case llvm::Triple::Linux:
3977 return new LinuxTargetInfo<X86_32TargetInfo>(T);
3978 case llvm::Triple::DragonFly:
3979 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
3980 case llvm::Triple::NetBSD:
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003981 return new NetBSDI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003982 case llvm::Triple::OpenBSD:
3983 return new OpenBSDI386TargetInfo(T);
3984 case llvm::Triple::FreeBSD:
3985 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00003986 case llvm::Triple::Minix:
3987 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003988 case llvm::Triple::Solaris:
3989 return new SolarisTargetInfo<X86_32TargetInfo>(T);
3990 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003991 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003992 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003993 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003994 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00003995 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00003996 case llvm::Triple::Haiku:
3997 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00003998 case llvm::Triple::RTEMS:
3999 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004000 default:
4001 return new X86_32TargetInfo(T);
4002 }
4003
4004 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004005 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
4006 return new DarwinX86_64TargetInfo(T);
4007
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004008 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004009 case llvm::Triple::AuroraUX:
4010 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004011 case llvm::Triple::Linux:
4012 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00004013 case llvm::Triple::DragonFly:
4014 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004015 case llvm::Triple::NetBSD:
4016 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
4017 case llvm::Triple::OpenBSD:
4018 return new OpenBSDX86_64TargetInfo(T);
4019 case llvm::Triple::FreeBSD:
4020 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
4021 case llvm::Triple::Solaris:
4022 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00004023 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00004024 return new MinGWX86_64TargetInfo(T);
4025 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004026 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004027 default:
4028 return new X86_64TargetInfo(T);
4029 }
4030 }
Reid Spencer5f016e22007-07-11 17:01:13 +00004031}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004032
4033/// CreateTargetInfo - Return the target info object for the specified target
4034/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00004035TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004036 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004037 llvm::Triple Triple(Opts.Triple);
4038
4039 // Construct the target
Dylan Noblesmith6f42b622012-02-05 02:12:40 +00004040 OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004041 if (!Target) {
4042 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
4043 return 0;
4044 }
4045
Daniel Dunbareac7c532009-12-18 18:42:37 +00004046 // Set the target CPU if specified.
4047 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
4048 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
4049 return 0;
4050 }
4051
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004052 // Set the target ABI if specified.
4053 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
4054 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
4055 return 0;
4056 }
4057
Charles Davis98b7c5c2010-06-11 01:06:47 +00004058 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00004059 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00004060 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
4061 return 0;
4062 }
4063
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004064 // Compute the default target features, we need the target to handle this
4065 // because features may have dependencies on one another.
4066 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004067 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004068
4069 // Apply the user specified deltas.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00004070 // First the enables.
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004071 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4072 ie = Opts.Features.end(); it != ie; ++it) {
4073 const char *Name = it->c_str();
4074
Rafael Espindola53ac3d82011-11-27 20:00:43 +00004075 if (Name[0] != '+')
4076 continue;
4077
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004078 // Apply the feature via the target.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00004079 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
4080 Diags.Report(diag::err_target_invalid_feature) << Name;
4081 return 0;
4082 }
4083 }
4084
4085 // Then the disables.
4086 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4087 ie = Opts.Features.end(); it != ie; ++it) {
4088 const char *Name = it->c_str();
4089
4090 if (Name[0] == '+')
4091 continue;
4092
4093 // Apply the feature via the target.
4094 if (Name[0] != '-' ||
4095 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004096 Diags.Report(diag::err_target_invalid_feature) << Name;
4097 return 0;
4098 }
4099 }
4100
4101 // Add the features to the compile options.
4102 //
4103 // FIXME: If we are completely confident that we have the right set, we only
4104 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004105 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004106 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
4107 ie = Features.end(); it != ie; ++it)
Chris Lattner1e5f83b2011-07-14 18:24:21 +00004108 Opts.Features.push_back(std::string(it->second ? "+" : "-") +
Chris Lattner48b78bd2011-07-14 18:45:41 +00004109 it->first().str());
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004110 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004111
4112 return Target.take();
4113}