blob: 989d1754abfb967ac06a9cda4de2ac41ef3d9559 [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__");
Evgeniy Stepanov32064032012-04-26 12:08:09 +0000319 if (Triple.getEnvironment() == llvm::Triple::ANDROIDEABI)
320 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000321 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000322 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000323 if (Opts.CPlusPlus)
324 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000325 }
326public:
Mike Stump1eb44332009-09-09 15:08:12 +0000327 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000328 : OSTargetInfo<Target>(triple) {
329 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000330 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000331 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000332
333 virtual const char *getStaticInitSectionSpecifier() const {
334 return ".text.startup";
335 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000336};
337
Chris Lattnerb62bb282009-07-13 20:29:08 +0000338// NetBSD Target
339template<typename Target>
340class NetBSDTargetInfo : public OSTargetInfo<Target> {
341protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000342 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000343 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000344 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000345 Builder.defineMacro("__NetBSD__");
346 Builder.defineMacro("__unix__");
347 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000348 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000349 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000350 }
351public:
Mike Stump1eb44332009-09-09 15:08:12 +0000352 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000353 : OSTargetInfo<Target>(triple) {
354 this->UserLabelPrefix = "";
355 }
356};
357
Torok Edwin5f6c1942009-06-30 17:10:35 +0000358// OpenBSD Target
359template<typename Target>
360class OpenBSDTargetInfo : public OSTargetInfo<Target> {
361protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000362 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000363 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000364 // OpenBSD defines; list based off of gcc output
365
Benjamin Kramera9992772010-01-09 17:55:51 +0000366 Builder.defineMacro("__OpenBSD__");
367 DefineStd(Builder, "unix", Opts);
368 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000369 if (Opts.POSIXThreads)
Chris Lattner4ddcf3b2012-04-25 06:12:24 +0000370 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000371 }
372public:
Mike Stump1eb44332009-09-09 15:08:12 +0000373 OpenBSDTargetInfo(const std::string &triple)
Eli Friedman62d829a2011-12-15 02:15:56 +0000374 : OSTargetInfo<Target>(triple) {
375 this->UserLabelPrefix = "";
376
377 llvm::Triple Triple(triple);
378 switch (Triple.getArch()) {
379 default:
380 case llvm::Triple::x86:
381 case llvm::Triple::x86_64:
382 case llvm::Triple::arm:
383 case llvm::Triple::sparc:
384 this->MCountName = "__mcount";
385 break;
386 case llvm::Triple::mips64:
387 case llvm::Triple::mips64el:
388 case llvm::Triple::ppc:
389 case llvm::Triple::sparcv9:
390 this->MCountName = "_mcount";
391 break;
392 }
393 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000394};
395
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000396// PSP Target
397template<typename Target>
398class PSPTargetInfo : public OSTargetInfo<Target> {
399protected:
400 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000401 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000402 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000403 Builder.defineMacro("PSP");
404 Builder.defineMacro("_PSP");
405 Builder.defineMacro("__psp__");
406 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000407 }
408public:
409 PSPTargetInfo(const std::string& triple)
410 : OSTargetInfo<Target>(triple) {
411 this->UserLabelPrefix = "";
412 }
413};
414
John Thompson3f6918a2009-11-19 17:18:50 +0000415// PS3 PPU Target
416template<typename Target>
417class PS3PPUTargetInfo : public OSTargetInfo<Target> {
418protected:
419 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000420 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000421 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000422 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000423 Builder.defineMacro("__PPU__");
424 Builder.defineMacro("__CELLOS_LV2__");
425 Builder.defineMacro("__ELF__");
426 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000427 Builder.defineMacro("_ARCH_PPC64");
428 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000429 }
430public:
431 PS3PPUTargetInfo(const std::string& triple)
432 : OSTargetInfo<Target>(triple) {
433 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000434 this->LongWidth = this->LongAlign = 32;
435 this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000436 this->IntMaxType = TargetInfo::SignedLongLong;
437 this->UIntMaxType = TargetInfo::UnsignedLongLong;
438 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000439 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000440 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 +0000441 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000442 }
443};
444
445// FIXME: Need a real SPU target.
446// PS3 SPU Target
447template<typename Target>
448class PS3SPUTargetInfo : public OSTargetInfo<Target> {
449protected:
450 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000451 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000452 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000453 Builder.defineMacro("__SPU__");
454 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000455 }
456public:
457 PS3SPUTargetInfo(const std::string& triple)
458 : OSTargetInfo<Target>(triple) {
459 this->UserLabelPrefix = "";
460 }
461};
462
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000463// AuroraUX target
464template<typename Target>
465class AuroraUXTargetInfo : public OSTargetInfo<Target> {
466protected:
467 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000468 MacroBuilder &Builder) const {
469 DefineStd(Builder, "sun", Opts);
470 DefineStd(Builder, "unix", Opts);
471 Builder.defineMacro("__ELF__");
472 Builder.defineMacro("__svr4__");
473 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000474 }
475public:
476 AuroraUXTargetInfo(const std::string& triple)
477 : OSTargetInfo<Target>(triple) {
478 this->UserLabelPrefix = "";
479 this->WCharType = this->SignedLong;
480 // FIXME: WIntType should be SignedLong
481 }
482};
483
Torok Edwin5f6c1942009-06-30 17:10:35 +0000484// Solaris target
485template<typename Target>
486class SolarisTargetInfo : public OSTargetInfo<Target> {
487protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000488 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000489 MacroBuilder &Builder) const {
490 DefineStd(Builder, "sun", Opts);
491 DefineStd(Builder, "unix", Opts);
492 Builder.defineMacro("__ELF__");
493 Builder.defineMacro("__svr4__");
494 Builder.defineMacro("__SVR4");
David Chisnall165329c2012-02-28 17:10:04 +0000495 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
496 // newer, but to 500 for everything else. feature_test.h has a check to
497 // ensure that you are not using C99 with an old version of X/Open or C89
498 // with a new version.
499 if (Opts.C99 || Opts.C11)
500 Builder.defineMacro("_XOPEN_SOURCE", "600");
501 else
502 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnallb4f0bd62012-03-02 10:49:52 +0000503 if (Opts.CPlusPlus)
David Chisnall165329c2012-02-28 17:10:04 +0000504 Builder.defineMacro("__C99FEATURES__");
David Chisnall48fad492012-02-17 18:35:11 +0000505 Builder.defineMacro("_LARGEFILE_SOURCE");
506 Builder.defineMacro("_LARGEFILE64_SOURCE");
507 Builder.defineMacro("__EXTENSIONS__");
David Chisnall165329c2012-02-28 17:10:04 +0000508 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000509 }
510public:
Mike Stump1eb44332009-09-09 15:08:12 +0000511 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000512 : OSTargetInfo<Target>(triple) {
513 this->UserLabelPrefix = "";
David Chisnallfb027842012-03-28 18:04:14 +0000514 this->WCharType = this->SignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000515 // FIXME: WIntType should be SignedLong
516 }
517};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000518
519// Windows target
520template<typename Target>
521class WindowsTargetInfo : public OSTargetInfo<Target> {
522protected:
523 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
524 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000525 Builder.defineMacro("_WIN32");
526 }
527 void getVisualStudioDefines(const LangOptions &Opts,
528 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000529 if (Opts.CPlusPlus) {
530 if (Opts.RTTI)
531 Builder.defineMacro("_CPPRTTI");
532
533 if (Opts.Exceptions)
534 Builder.defineMacro("_CPPUNWIND");
535 }
536
537 if (!Opts.CharIsSigned)
538 Builder.defineMacro("_CHAR_UNSIGNED");
539
540 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
541 // but it works for now.
542 if (Opts.POSIXThreads)
543 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000544
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000545 if (Opts.MSCVersion != 0)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000546 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000547
Francois Pichet62ec1f22011-09-17 17:15:52 +0000548 if (Opts.MicrosoftExt) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000549 Builder.defineMacro("_MSC_EXTENSIONS");
550
551 if (Opts.CPlusPlus0x) {
552 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
553 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
554 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
555 }
556 }
557
558 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000559 }
560
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000561public:
562 WindowsTargetInfo(const std::string &triple)
563 : OSTargetInfo<Target>(triple) {}
564};
565
Mike Stump1eb44332009-09-09 15:08:12 +0000566} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000567
Chris Lattnerd29b6302008-10-05 21:50:58 +0000568//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000569// Specific target implementations.
570//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000571
Eli Friedmane4277982008-08-20 23:11:40 +0000572namespace {
573// PPC abstract base class
574class PPCTargetInfo : public TargetInfo {
575 static const Builtin::Info BuiltinInfo[];
576 static const char * const GCCRegNames[];
577 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel02a84272012-06-11 22:35:19 +0000578 std::string CPU;
Eli Friedmane4277982008-08-20 23:11:40 +0000579public:
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000580 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
581 LongDoubleWidth = LongDoubleAlign = 128;
582 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
583 }
Eli Friedman15b91762009-06-05 07:05:05 +0000584
Hal Finkel02a84272012-06-11 22:35:19 +0000585 virtual bool setCPU(const std::string &Name) {
586 bool CPUKnown = llvm::StringSwitch<bool>(Name)
587 .Case("generic", true)
588 .Case("440", true)
589 .Case("450", true)
590 .Case("601", true)
591 .Case("602", true)
592 .Case("603", true)
593 .Case("603e", true)
594 .Case("603ev", true)
595 .Case("604", true)
596 .Case("604e", true)
597 .Case("620", true)
598 .Case("g3", true)
599 .Case("7400", true)
600 .Case("g4", true)
601 .Case("7450", true)
602 .Case("g4+", true)
603 .Case("750", true)
604 .Case("970", true)
605 .Case("g5", true)
606 .Case("a2", true)
607 .Case("pwr6", true)
608 .Case("pwr7", true)
609 .Case("ppc", true)
610 .Case("ppc64", true)
611 .Default(false);
612
613 if (CPUKnown)
614 CPU = Name;
615
616 return CPUKnown;
617 }
618
Eli Friedmane4277982008-08-20 23:11:40 +0000619 virtual void getTargetBuiltins(const Builtin::Info *&Records,
620 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000621 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000622 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000623 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000624
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000625 virtual bool isCLZForZeroUndef() const { return false; }
626
Chris Lattner33328642009-03-20 15:52:06 +0000627 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000628 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000629
Douglas Gregore727d212012-01-30 06:38:25 +0000630 virtual bool hasFeature(StringRef Feature) const;
631
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000632 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000633 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000634 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000635 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000636 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000637 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000638 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000639 default: return false;
640 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000641 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000642 case 'b': // Base register
643 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000644 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000645 break;
646 // FIXME: The following are added to allow parsing.
647 // I just took a guess at what the actions should be.
648 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000649 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000650 case 'v': // Altivec vector register
651 Info.setAllowsRegister();
652 break;
653 case 'w':
654 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000655 case 'd':// VSX vector register to hold vector double data
656 case 'f':// VSX vector register to hold vector float data
657 case 's':// VSX vector register to hold scalar float data
658 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000659 break;
660 default:
661 return false;
662 }
663 Info.setAllowsRegister();
664 Name++; // Skip over 'w'.
665 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000666 case 'h': // `MQ', `CTR', or `LINK' register
667 case 'q': // `MQ' register
668 case 'c': // `CTR' register
669 case 'l': // `LINK' register
670 case 'x': // `CR' register (condition register) number 0
671 case 'y': // `CR' register (condition register)
672 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000673 Info.setAllowsRegister();
674 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000675 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000676 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000677 // (use `L' instead for SImode constants)
678 case 'K': // Unsigned 16-bit constant
679 case 'L': // Signed 16-bit constant shifted left 16 bits
680 case 'M': // Constant larger than 31
681 case 'N': // Exact power of 2
682 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000683 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000684 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000685 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000686 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000687 break;
688 case 'm': // Memory operand. Note that on PowerPC targets, m can
689 // include addresses that update the base register. It
690 // is therefore only safe to use `m' in an asm statement
691 // if that asm statement accesses the operand exactly once.
692 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000693 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000694 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000695 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000696 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000697 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
698 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000699 // register to be updated.
700 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000701 if (Name[1] != 's')
702 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000703 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000704 // include any automodification of the base register. Unlike
705 // `m', this constraint can be used in asm statements that
706 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000707 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000708 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000709 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000710 break;
711 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000712 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000713 case 'Z': // Memory operand that is an indexed or indirect from a
714 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000715 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000716 Info.setAllowsMemory();
717 Info.setAllowsRegister();
718 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000719 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000720 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000721 // register (`p' is preferable for asm statements)
722 case 'S': // Constant suitable as a 64-bit mask operand
723 case 'T': // Constant suitable as a 32-bit mask operand
724 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000725 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000726 // instructions
727 case 'W': // Vector constant that does not require memory
728 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000729 break;
730 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000731 }
John Thompson8e6065a2010-06-24 22:44:13 +0000732 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000733 }
Eli Friedmane4277982008-08-20 23:11:40 +0000734 virtual const char *getClobbers() const {
735 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000736 }
Eli Friedmane4277982008-08-20 23:11:40 +0000737};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000738
Eli Friedmane4277982008-08-20 23:11:40 +0000739const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000740#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000741#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000742 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000743#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000744};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000745
746
Chris Lattnerc0f59212009-03-02 22:27:17 +0000747/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
748/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000749void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000750 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000751 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000752 Builder.defineMacro("__ppc__");
753 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000754 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000755 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000756 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000757 Builder.defineMacro("_ARCH_PPC64");
758 Builder.defineMacro("_LP64");
759 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000760 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000761 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000762 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000763 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000764 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000765
Chris Lattnerc0f59212009-03-02 22:27:17 +0000766 // Target properties.
Joerg Sonnenberger7cd1de52011-07-05 14:56:12 +0000767 if (getTriple().getOS() != llvm::Triple::NetBSD)
768 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramera9992772010-01-09 17:55:51 +0000769 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000770
Chris Lattnerc0f59212009-03-02 22:27:17 +0000771 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000772 Builder.defineMacro("__NATURAL_ALIGNMENT__");
773 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000774
Chris Lattnerc0f59212009-03-02 22:27:17 +0000775 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000776 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000777
John Thompson3f6918a2009-11-19 17:18:50 +0000778 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000779 Builder.defineMacro("__VEC__", "10206");
780 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000781 }
Hal Finkel02a84272012-06-11 22:35:19 +0000782
783 // CPU identification.
784 if (CPU == "440") {
785 Builder.defineMacro("_ARCH_440");
786 } else if (CPU == "450") {
787 Builder.defineMacro("_ARCH_440");
788 Builder.defineMacro("_ARCH_450");
789 } else if (CPU == "970") {
790 Builder.defineMacro("_ARCH_970");
791 } else if (CPU == "pwr6") {
792 Builder.defineMacro("_ARCH_PWR6");
793 } else if (CPU == "pwr7") {
794 Builder.defineMacro("_ARCH_PWR7");
795 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000796}
797
Douglas Gregore727d212012-01-30 06:38:25 +0000798bool PPCTargetInfo::hasFeature(StringRef Feature) const {
799 return Feature == "powerpc";
800}
Chris Lattner393ff042008-04-21 18:56:49 +0000801
Douglas Gregore727d212012-01-30 06:38:25 +0000802
Eli Friedmane4277982008-08-20 23:11:40 +0000803const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000804 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
805 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
806 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
807 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
808 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
809 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
810 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
811 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000812 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000813 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000814 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000815 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
816 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
817 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
818 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000819 "vrsave", "vscr",
820 "spe_acc", "spefscr",
821 "sfp"
822};
Reid Spencer5f016e22007-07-11 17:01:13 +0000823
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000824void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000825 unsigned &NumNames) const {
826 Names = GCCRegNames;
827 NumNames = llvm::array_lengthof(GCCRegNames);
828}
Reid Spencer5f016e22007-07-11 17:01:13 +0000829
Eli Friedmane4277982008-08-20 23:11:40 +0000830const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
831 // While some of these aliases do map to different registers
832 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000833 { { "0" }, "r0" },
834 { { "1"}, "r1" },
835 { { "2" }, "r2" },
836 { { "3" }, "r3" },
837 { { "4" }, "r4" },
838 { { "5" }, "r5" },
839 { { "6" }, "r6" },
840 { { "7" }, "r7" },
841 { { "8" }, "r8" },
842 { { "9" }, "r9" },
843 { { "10" }, "r10" },
844 { { "11" }, "r11" },
845 { { "12" }, "r12" },
846 { { "13" }, "r13" },
847 { { "14" }, "r14" },
848 { { "15" }, "r15" },
849 { { "16" }, "r16" },
850 { { "17" }, "r17" },
851 { { "18" }, "r18" },
852 { { "19" }, "r19" },
853 { { "20" }, "r20" },
854 { { "21" }, "r21" },
855 { { "22" }, "r22" },
856 { { "23" }, "r23" },
857 { { "24" }, "r24" },
858 { { "25" }, "r25" },
859 { { "26" }, "r26" },
860 { { "27" }, "r27" },
861 { { "28" }, "r28" },
862 { { "29" }, "r29" },
863 { { "30" }, "r30" },
864 { { "31" }, "r31" },
865 { { "fr0" }, "f0" },
866 { { "fr1" }, "f1" },
867 { { "fr2" }, "f2" },
868 { { "fr3" }, "f3" },
869 { { "fr4" }, "f4" },
870 { { "fr5" }, "f5" },
871 { { "fr6" }, "f6" },
872 { { "fr7" }, "f7" },
873 { { "fr8" }, "f8" },
874 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000875 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000876 { { "fr11" }, "f11" },
877 { { "fr12" }, "f12" },
878 { { "fr13" }, "f13" },
879 { { "fr14" }, "f14" },
880 { { "fr15" }, "f15" },
881 { { "fr16" }, "f16" },
882 { { "fr17" }, "f17" },
883 { { "fr18" }, "f18" },
884 { { "fr19" }, "f19" },
885 { { "fr20" }, "f20" },
886 { { "fr21" }, "f21" },
887 { { "fr22" }, "f22" },
888 { { "fr23" }, "f23" },
889 { { "fr24" }, "f24" },
890 { { "fr25" }, "f25" },
891 { { "fr26" }, "f26" },
892 { { "fr27" }, "f27" },
893 { { "fr28" }, "f28" },
894 { { "fr29" }, "f29" },
895 { { "fr30" }, "f30" },
896 { { "fr31" }, "f31" },
897 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000898};
899
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000900void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000901 unsigned &NumAliases) const {
902 Aliases = GCCRegAliases;
903 NumAliases = llvm::array_lengthof(GCCRegAliases);
904}
905} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000906
907namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000908class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000909public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000910 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000911 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 +0000912 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000913
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000914 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000915 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000916 case llvm::Triple::FreeBSD:
917 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000918 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +0000919 PtrDiffType = SignedInt;
920 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000921 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +0000922 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000923 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000924 }
Roman Divackye3d175d2012-03-13 16:53:54 +0000925
Roman Divackyefe9c0d2012-03-13 19:20:17 +0000926 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
927 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +0000928 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +0000929 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000930 }
931
932 virtual const char *getVAListDeclaration() const {
933 // This is the ELF definition, and is overridden by the Darwin sub-target
934 return "typedef struct __va_list_tag {"
935 " unsigned char gpr;"
936 " unsigned char fpr;"
937 " unsigned short reserved;"
938 " void* overflow_arg_area;"
939 " void* reg_save_area;"
940 "} __builtin_va_list[1];";
Eli Friedmaned855cb2008-08-21 00:13:15 +0000941 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000942};
943} // end anonymous namespace.
944
945namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000946class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000947public:
Eli Friedmane4277982008-08-20 23:11:40 +0000948 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000949 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000950 IntMaxType = SignedLong;
951 UIntMaxType = UnsignedLong;
952 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000953 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 +0000954 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Roman Divackye3d175d2012-03-13 16:53:54 +0000955
Roman Divackyefe9c0d2012-03-13 19:20:17 +0000956 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
957 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +0000958 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +0000959 }
Chris Lattnerf291b102008-05-09 06:17:04 +0000960 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000961 virtual const char *getVAListDeclaration() const {
962 return "typedef char* __builtin_va_list;";
963 }
Eli Friedmane4277982008-08-20 23:11:40 +0000964};
965} // end anonymous namespace.
966
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000967
968namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000969class DarwinPPC32TargetInfo :
970 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000971public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000972 DarwinPPC32TargetInfo(const std::string& triple)
973 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000974 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000975 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Anton Yartsev9bc23ba2012-01-17 22:40:00 +0000976 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +0000977 SuitableAlign = 128;
Anton Yartsev9bc23ba2012-01-17 22:40:00 +0000978 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
979 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +0000980 }
981 virtual const char *getVAListDeclaration() const {
982 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000983 }
984};
985
986class DarwinPPC64TargetInfo :
987 public DarwinTargetInfo<PPC64TargetInfo> {
988public:
989 DarwinPPC64TargetInfo(const std::string& triple)
990 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
991 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +0000992 SuitableAlign = 128;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000993 }
994};
995} // end anonymous namespace.
996
Reid Spencer5f016e22007-07-11 17:01:13 +0000997namespace {
Peter Collingbourneedb66f32012-05-20 23:28:41 +0000998 static const unsigned NVPTXAddrSpaceMap[] = {
999 1, // opencl_global
1000 3, // opencl_local
1001 4, // opencl_constant
1002 1, // cuda_device
1003 4, // cuda_constant
1004 3, // cuda_shared
1005 };
1006 class NVPTXTargetInfo : public TargetInfo {
1007 static const char * const GCCRegNames[];
Justin Holewinski2c585b92012-05-24 17:43:12 +00001008 static const Builtin::Info BuiltinInfo[];
1009 std::vector<llvm::StringRef> AvailableFeatures;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001010 public:
1011 NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
1012 BigEndian = false;
1013 TLSSupported = false;
1014 LongWidth = LongAlign = 64;
1015 AddrSpaceMap = &NVPTXAddrSpaceMap;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001016 // Define available target features
1017 // These must be defined in sorted order!
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001018 }
1019 virtual void getTargetDefines(const LangOptions &Opts,
1020 MacroBuilder &Builder) const {
1021 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001022 Builder.defineMacro("__NVPTX__");
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001023 }
1024 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1025 unsigned &NumRecords) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001026 Records = BuiltinInfo;
1027 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001028 }
1029 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001030 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001031 }
1032
1033 virtual void getGCCRegNames(const char * const *&Names,
1034 unsigned &NumNames) const;
1035 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1036 unsigned &NumAliases) const {
1037 // No aliases.
1038 Aliases = 0;
1039 NumAliases = 0;
1040 }
1041 virtual bool validateAsmConstraint(const char *&Name,
1042 TargetInfo::ConstraintInfo &info) const {
1043 // FIXME: implement
1044 return true;
1045 }
1046 virtual const char *getClobbers() const {
1047 // FIXME: Is this really right?
1048 return "";
1049 }
1050 virtual const char *getVAListDeclaration() const {
1051 // FIXME: implement
1052 return "typedef char* __builtin_va_list;";
1053 }
1054 virtual bool setCPU(const std::string &Name) {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001055 return Name == "sm_10" || Name == "sm_13" || Name == "sm_20";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001056 }
Justin Holewinski2c585b92012-05-24 17:43:12 +00001057 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1058 StringRef Name,
1059 bool Enabled) const;
1060 };
1061
1062 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1063#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1064#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1065 ALL_LANGUAGES },
1066#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001067 };
1068
1069 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1070 "r0"
1071 };
1072
1073 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1074 unsigned &NumNames) const {
1075 Names = GCCRegNames;
1076 NumNames = llvm::array_lengthof(GCCRegNames);
1077 }
1078
Justin Holewinski2c585b92012-05-24 17:43:12 +00001079 bool NVPTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1080 StringRef Name,
1081 bool Enabled) const {
1082 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1083 Name)) {
1084 Features[Name] = Enabled;
1085 return true;
1086 } else {
1087 return false;
1088 }
1089 }
1090
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001091 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1092 public:
Justin Holewinski2c585b92012-05-24 17:43:12 +00001093 NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001094 PointerWidth = PointerAlign = 32;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001095 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001096 DescriptionString
1097 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1098 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1099 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001100 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001101 };
1102
1103 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1104 public:
Justin Holewinski2c585b92012-05-24 17:43:12 +00001105 NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001106 PointerWidth = PointerAlign = 64;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001107 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001108 DescriptionString
1109 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1110 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1111 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001112 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001113 };
1114}
1115
1116namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +00001117// MBlaze abstract base class
1118class MBlazeTargetInfo : public TargetInfo {
1119 static const char * const GCCRegNames[];
1120 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1121
1122public:
1123 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +00001124 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +00001125 }
1126
1127 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1128 unsigned &NumRecords) const {
1129 // FIXME: Implement.
1130 Records = 0;
1131 NumRecords = 0;
1132 }
1133
1134 virtual void getTargetDefines(const LangOptions &Opts,
1135 MacroBuilder &Builder) const;
1136
Douglas Gregore727d212012-01-30 06:38:25 +00001137 virtual bool hasFeature(StringRef Feature) const {
1138 return Feature == "mblaze";
1139 }
1140
Chris Lattner9cbeb632010-03-06 21:21:27 +00001141 virtual const char *getVAListDeclaration() const {
1142 return "typedef char* __builtin_va_list;";
1143 }
1144 virtual const char *getTargetPrefix() const {
1145 return "mblaze";
1146 }
1147 virtual void getGCCRegNames(const char * const *&Names,
1148 unsigned &NumNames) const;
1149 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1150 unsigned &NumAliases) const;
1151 virtual bool validateAsmConstraint(const char *&Name,
1152 TargetInfo::ConstraintInfo &Info) const {
1153 switch (*Name) {
1154 default: return false;
1155 case 'O': // Zero
1156 return true;
1157 case 'b': // Base register
1158 case 'f': // Floating point register
1159 Info.setAllowsRegister();
1160 return true;
1161 }
1162 }
1163 virtual const char *getClobbers() const {
1164 return "";
1165 }
1166};
1167
1168/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1169/// #defines that are not tied to a specific subtarget.
1170void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1171 MacroBuilder &Builder) const {
1172 // Target identification.
1173 Builder.defineMacro("__microblaze__");
1174 Builder.defineMacro("_ARCH_MICROBLAZE");
1175 Builder.defineMacro("__MICROBLAZE__");
1176
1177 // Target properties.
1178 Builder.defineMacro("_BIG_ENDIAN");
1179 Builder.defineMacro("__BIG_ENDIAN__");
1180
1181 // Subtarget options.
1182 Builder.defineMacro("__REGISTER_PREFIX__", "");
1183}
1184
1185
1186const char * const MBlazeTargetInfo::GCCRegNames[] = {
1187 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1188 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1189 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1190 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1191 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1192 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1193 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1194 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1195 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1196 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1197};
1198
1199void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1200 unsigned &NumNames) const {
1201 Names = GCCRegNames;
1202 NumNames = llvm::array_lengthof(GCCRegNames);
1203}
1204
1205const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1206 { {"f0"}, "r0" },
1207 { {"f1"}, "r1" },
1208 { {"f2"}, "r2" },
1209 { {"f3"}, "r3" },
1210 { {"f4"}, "r4" },
1211 { {"f5"}, "r5" },
1212 { {"f6"}, "r6" },
1213 { {"f7"}, "r7" },
1214 { {"f8"}, "r8" },
1215 { {"f9"}, "r9" },
1216 { {"f10"}, "r10" },
1217 { {"f11"}, "r11" },
1218 { {"f12"}, "r12" },
1219 { {"f13"}, "r13" },
1220 { {"f14"}, "r14" },
1221 { {"f15"}, "r15" },
1222 { {"f16"}, "r16" },
1223 { {"f17"}, "r17" },
1224 { {"f18"}, "r18" },
1225 { {"f19"}, "r19" },
1226 { {"f20"}, "r20" },
1227 { {"f21"}, "r21" },
1228 { {"f22"}, "r22" },
1229 { {"f23"}, "r23" },
1230 { {"f24"}, "r24" },
1231 { {"f25"}, "r25" },
1232 { {"f26"}, "r26" },
1233 { {"f27"}, "r27" },
1234 { {"f28"}, "r28" },
1235 { {"f29"}, "r29" },
1236 { {"f30"}, "r30" },
1237 { {"f31"}, "r31" },
1238};
1239
1240void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1241 unsigned &NumAliases) const {
1242 Aliases = GCCRegAliases;
1243 NumAliases = llvm::array_lengthof(GCCRegAliases);
1244}
1245} // end anonymous namespace.
1246
1247namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001248// Namespace for x86 abstract base class
1249const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001250#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001251#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001252 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001253#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001254};
Eli Friedman61538a72008-05-20 14:21:01 +00001255
Nuno Lopes2550d702009-12-23 17:49:57 +00001256static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001257 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1258 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001259 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001260 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1261 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1262 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001263 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001264 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1265 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001266};
1267
Eric Christophercfd323d2011-06-21 00:05:20 +00001268const TargetInfo::AddlRegName AddlRegNames[] = {
1269 { { "al", "ah", "eax", "rax" }, 0 },
1270 { { "bl", "bh", "ebx", "rbx" }, 3 },
1271 { { "cl", "ch", "ecx", "rcx" }, 2 },
1272 { { "dl", "dh", "edx", "rdx" }, 1 },
1273 { { "esi", "rsi" }, 4 },
1274 { { "edi", "rdi" }, 5 },
1275 { { "esp", "rsp" }, 7 },
1276 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001277};
1278
1279// X86 target abstract base class; x86-32 and x86-64 are very close, so
1280// most of the implementation can be shared.
1281class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001282 enum X86SSEEnum {
Craig Topper05fe4b52012-01-09 09:19:09 +00001283 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner84f0ea82009-03-02 22:40:39 +00001284 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001285 enum MMX3DNowEnum {
1286 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1287 } MMX3DNowLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001288
Eric Christophereea12d12010-04-02 23:50:19 +00001289 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001290 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001291 bool HasLZCNT;
1292 bool HasBMI;
1293 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001294 bool HasPOPCNT;
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00001295 bool HasSSE4a;
Craig Topper6a511e12011-12-30 07:33:42 +00001296 bool HasFMA4;
Craig Topper2ae95072012-06-03 21:46:30 +00001297 bool HasFMA;
Craig Topperb6af69e2012-06-09 22:24:14 +00001298 bool HasXOP;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001299
Chandler Carruth499d9722011-09-28 08:55:34 +00001300 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1301 ///
1302 /// Each enumeration represents a particular CPU supported by Clang. These
1303 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1304 enum CPUKind {
1305 CK_Generic,
1306
1307 /// \name i386
1308 /// i386-generation processors.
1309 //@{
1310 CK_i386,
1311 //@}
1312
1313 /// \name i486
1314 /// i486-generation processors.
1315 //@{
1316 CK_i486,
1317 CK_WinChipC6,
1318 CK_WinChip2,
1319 CK_C3,
1320 //@}
1321
1322 /// \name i586
1323 /// i586-generation processors, P5 microarchitecture based.
1324 //@{
1325 CK_i586,
1326 CK_Pentium,
1327 CK_PentiumMMX,
1328 //@}
1329
1330 /// \name i686
1331 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1332 //@{
1333 CK_i686,
1334 CK_PentiumPro,
1335 CK_Pentium2,
1336 CK_Pentium3,
1337 CK_Pentium3M,
1338 CK_PentiumM,
1339 CK_C3_2,
1340
1341 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1342 /// Clang however has some logic to suport this.
1343 // FIXME: Warn, deprecate, and potentially remove this.
1344 CK_Yonah,
1345 //@}
1346
1347 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001348 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001349 //@{
1350 CK_Pentium4,
1351 CK_Pentium4M,
1352 CK_Prescott,
1353 CK_Nocona,
1354 //@}
1355
1356 /// \name Core
1357 /// Core microarchitecture based processors.
1358 //@{
1359 CK_Core2,
1360
1361 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1362 /// codename which GCC no longer accepts as an option to -march, but Clang
1363 /// has some logic for recognizing it.
1364 // FIXME: Warn, deprecate, and potentially remove this.
1365 CK_Penryn,
1366 //@}
1367
1368 /// \name Atom
1369 /// Atom processors
1370 //@{
1371 CK_Atom,
1372 //@}
1373
1374 /// \name Nehalem
1375 /// Nehalem microarchitecture based processors.
1376 //@{
1377 CK_Corei7,
1378 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001379 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001380 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001381 //@}
1382
1383 /// \name K6
1384 /// K6 architecture processors.
1385 //@{
1386 CK_K6,
1387 CK_K6_2,
1388 CK_K6_3,
1389 //@}
1390
1391 /// \name K7
1392 /// K7 architecture processors.
1393 //@{
1394 CK_Athlon,
1395 CK_AthlonThunderbird,
1396 CK_Athlon4,
1397 CK_AthlonXP,
1398 CK_AthlonMP,
1399 //@}
1400
1401 /// \name K8
1402 /// K8 architecture processors.
1403 //@{
1404 CK_Athlon64,
1405 CK_Athlon64SSE3,
1406 CK_AthlonFX,
1407 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001408 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001409 CK_Opteron,
1410 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001411 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001412 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001413
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001414 /// \name Bobcat
1415 /// Bobcat architecture processors.
1416 //@{
1417 CK_BTVER1,
1418 //@}
1419
1420 /// \name Bulldozer
1421 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001422 //@{
1423 CK_BDVER1,
1424 CK_BDVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001425 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001426
Chandler Carruth499d9722011-09-28 08:55:34 +00001427 /// This specification is deprecated and will be removed in the future.
1428 /// Users should prefer \see CK_K8.
1429 // FIXME: Warn on this when the CPU is set to it.
1430 CK_x86_64,
1431 //@}
1432
1433 /// \name Geode
1434 /// Geode processors.
1435 //@{
1436 CK_Geode
1437 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001438 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001439
Eli Friedman618234a2008-08-20 02:34:37 +00001440public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001441 X86TargetInfo(const std::string& triple)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001442 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Craig Topper3c0bc152012-05-31 05:18:48 +00001443 HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasBMI(false),
1444 HasBMI2(false), HasPOPCNT(false), HasSSE4a(false), HasFMA4(false),
Craig Topperb6af69e2012-06-09 22:24:14 +00001445 HasFMA(false), HasXOP(false), CPU(CK_Generic) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001446 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001447 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001448 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001449 virtual unsigned getFloatEvalMethod() const {
1450 // X87 evaluates with 80 bits "long double" precision.
1451 return SSELevel == NoSSE ? 2 : 0;
1452 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001453 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1454 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001455 Records = BuiltinInfo;
1456 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001457 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001458 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001459 unsigned &NumNames) const {
1460 Names = GCCRegNames;
1461 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001462 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001463 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001464 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001465 Aliases = 0;
1466 NumAliases = 0;
1467 }
1468 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1469 unsigned &NumNames) const {
1470 Names = AddlRegNames;
1471 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001472 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001473 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001474 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001475 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001476 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001477 return "~{dirflag},~{fpsr},~{flags}";
1478 }
Chris Lattner33328642009-03-20 15:52:06 +00001479 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001480 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001481 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00001482 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001483 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001484 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregore727d212012-01-30 06:38:25 +00001485 virtual bool hasFeature(StringRef Feature) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001486 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001487 virtual const char* getABI() const {
Craig Topper05fe4b52012-01-09 09:19:09 +00001488 if (PointerWidth == 64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001489 return "avx";
1490 else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1491 return "no-mmx";
1492 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001493 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001494 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001495 CPU = llvm::StringSwitch<CPUKind>(Name)
1496 .Case("i386", CK_i386)
1497 .Case("i486", CK_i486)
1498 .Case("winchip-c6", CK_WinChipC6)
1499 .Case("winchip2", CK_WinChip2)
1500 .Case("c3", CK_C3)
1501 .Case("i586", CK_i586)
1502 .Case("pentium", CK_Pentium)
1503 .Case("pentium-mmx", CK_PentiumMMX)
1504 .Case("i686", CK_i686)
1505 .Case("pentiumpro", CK_PentiumPro)
1506 .Case("pentium2", CK_Pentium2)
1507 .Case("pentium3", CK_Pentium3)
1508 .Case("pentium3m", CK_Pentium3M)
1509 .Case("pentium-m", CK_PentiumM)
1510 .Case("c3-2", CK_C3_2)
1511 .Case("yonah", CK_Yonah)
1512 .Case("pentium4", CK_Pentium4)
1513 .Case("pentium4m", CK_Pentium4M)
1514 .Case("prescott", CK_Prescott)
1515 .Case("nocona", CK_Nocona)
1516 .Case("core2", CK_Core2)
1517 .Case("penryn", CK_Penryn)
1518 .Case("atom", CK_Atom)
1519 .Case("corei7", CK_Corei7)
1520 .Case("corei7-avx", CK_Corei7AVX)
1521 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001522 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001523 .Case("k6", CK_K6)
1524 .Case("k6-2", CK_K6_2)
1525 .Case("k6-3", CK_K6_3)
1526 .Case("athlon", CK_Athlon)
1527 .Case("athlon-tbird", CK_AthlonThunderbird)
1528 .Case("athlon-4", CK_Athlon4)
1529 .Case("athlon-xp", CK_AthlonXP)
1530 .Case("athlon-mp", CK_AthlonMP)
1531 .Case("athlon64", CK_Athlon64)
1532 .Case("athlon64-sse3", CK_Athlon64SSE3)
1533 .Case("athlon-fx", CK_AthlonFX)
1534 .Case("k8", CK_K8)
1535 .Case("k8-sse3", CK_K8SSE3)
1536 .Case("opteron", CK_Opteron)
1537 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001538 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001539 .Case("btver1", CK_BTVER1)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001540 .Case("bdver1", CK_BDVER1)
1541 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001542 .Case("x86-64", CK_x86_64)
1543 .Case("geode", CK_Geode)
1544 .Default(CK_Generic);
1545
Chandler Carruth26a39142011-09-28 09:45:08 +00001546 // Perform any per-CPU checks necessary to determine if this CPU is
1547 // acceptable.
1548 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1549 // invalid without explaining *why*.
1550 switch (CPU) {
1551 case CK_Generic:
1552 // No processor selected!
1553 return false;
1554
1555 case CK_i386:
1556 case CK_i486:
1557 case CK_WinChipC6:
1558 case CK_WinChip2:
1559 case CK_C3:
1560 case CK_i586:
1561 case CK_Pentium:
1562 case CK_PentiumMMX:
1563 case CK_i686:
1564 case CK_PentiumPro:
1565 case CK_Pentium2:
1566 case CK_Pentium3:
1567 case CK_Pentium3M:
1568 case CK_PentiumM:
1569 case CK_Yonah:
1570 case CK_C3_2:
1571 case CK_Pentium4:
1572 case CK_Pentium4M:
1573 case CK_Prescott:
1574 case CK_K6:
1575 case CK_K6_2:
1576 case CK_K6_3:
1577 case CK_Athlon:
1578 case CK_AthlonThunderbird:
1579 case CK_Athlon4:
1580 case CK_AthlonXP:
1581 case CK_AthlonMP:
1582 case CK_Geode:
1583 // Only accept certain architectures when compiling in 32-bit mode.
1584 if (PointerWidth != 32)
1585 return false;
1586
1587 // Fallthrough
1588 case CK_Nocona:
1589 case CK_Core2:
1590 case CK_Penryn:
1591 case CK_Atom:
1592 case CK_Corei7:
1593 case CK_Corei7AVX:
1594 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001595 case CK_CoreAVX2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001596 case CK_Athlon64:
1597 case CK_Athlon64SSE3:
1598 case CK_AthlonFX:
1599 case CK_K8:
1600 case CK_K8SSE3:
1601 case CK_Opteron:
1602 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00001603 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001604 case CK_BTVER1:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001605 case CK_BDVER1:
1606 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001607 case CK_x86_64:
1608 return true;
1609 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00001610 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001611 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001612};
Chris Lattner3daed522009-03-02 22:20:04 +00001613
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001614void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001615 // FIXME: This should not be here.
1616 Features["3dnow"] = false;
1617 Features["3dnowa"] = false;
1618 Features["mmx"] = false;
1619 Features["sse"] = false;
1620 Features["sse2"] = false;
1621 Features["sse3"] = false;
1622 Features["ssse3"] = false;
1623 Features["sse41"] = false;
1624 Features["sse42"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001625 Features["sse4a"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001626 Features["aes"] = false;
Craig Topper3c0bc152012-05-31 05:18:48 +00001627 Features["pclmul"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001628 Features["avx"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001629 Features["avx2"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001630 Features["lzcnt"] = false;
1631 Features["bmi"] = false;
1632 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001633 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001634 Features["fma4"] = false;
Craig Topper2ae95072012-06-03 21:46:30 +00001635 Features["fma"] = false;
Craig Topperb6af69e2012-06-09 22:24:14 +00001636 Features["xop"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001637
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001638 // FIXME: This *really* should not be here.
1639
1640 // X86_64 always has SSE2.
1641 if (PointerWidth == 64)
1642 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1643
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001644 switch (CPU) {
1645 case CK_Generic:
1646 case CK_i386:
1647 case CK_i486:
1648 case CK_i586:
1649 case CK_Pentium:
1650 case CK_i686:
1651 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001652 break;
1653 case CK_PentiumMMX:
1654 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001655 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001656 break;
1657 case CK_Pentium3:
1658 case CK_Pentium3M:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001659 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001660 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001661 break;
1662 case CK_PentiumM:
1663 case CK_Pentium4:
1664 case CK_Pentium4M:
1665 case CK_x86_64:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001666 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001667 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001668 break;
1669 case CK_Yonah:
1670 case CK_Prescott:
1671 case CK_Nocona:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001672 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001673 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001674 break;
1675 case CK_Core2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001676 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001677 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001678 break;
1679 case CK_Penryn:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001680 setFeatureEnabled(Features, "mmx", true);
Benjamin Kramerb3453a82012-01-04 14:36:57 +00001681 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001682 break;
1683 case CK_Atom:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001684 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00001685 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001686 break;
1687 case CK_Corei7:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001688 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001689 setFeatureEnabled(Features, "sse4", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001690 break;
1691 case CK_Corei7AVX:
1692 case CK_CoreAVXi:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001693 setFeatureEnabled(Features, "mmx", true);
Craig Topperfd936302012-04-26 07:31:30 +00001694 setFeatureEnabled(Features, "avx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00001695 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00001696 setFeatureEnabled(Features, "pclmul", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001697 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00001698 case CK_CoreAVX2:
1699 setFeatureEnabled(Features, "mmx", true);
Craig Topperfd936302012-04-26 07:31:30 +00001700 setFeatureEnabled(Features, "avx2", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00001701 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00001702 setFeatureEnabled(Features, "pclmul", true);
Craig Topper31ceea02011-12-25 05:06:45 +00001703 setFeatureEnabled(Features, "lzcnt", true);
1704 setFeatureEnabled(Features, "bmi", true);
1705 setFeatureEnabled(Features, "bmi2", true);
Craig Topper2ae95072012-06-03 21:46:30 +00001706 setFeatureEnabled(Features, "fma", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00001707 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001708 case CK_K6:
1709 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001710 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001711 break;
1712 case CK_K6_2:
1713 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001714 case CK_WinChip2:
1715 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001716 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001717 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00001718 case CK_Athlon:
1719 case CK_AthlonThunderbird:
1720 case CK_Geode:
1721 setFeatureEnabled(Features, "3dnowa", true);
1722 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001723 case CK_Athlon4:
1724 case CK_AthlonXP:
1725 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001726 setFeatureEnabled(Features, "sse", true);
1727 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001728 break;
1729 case CK_K8:
1730 case CK_Opteron:
1731 case CK_Athlon64:
1732 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00001733 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001734 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001735 break;
1736 case CK_K8SSE3:
1737 case CK_OpteronSSE3:
1738 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00001739 setFeatureEnabled(Features, "sse3", true);
1740 setFeatureEnabled(Features, "3dnowa", true);
1741 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001742 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00001743 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00001744 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001745 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001746 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001747 case CK_BTVER1:
1748 setFeatureEnabled(Features, "ssse3", true);
1749 setFeatureEnabled(Features, "sse4a", true);
Craig Topper90ea0362012-05-30 05:54:54 +00001750 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001751 case CK_BDVER1:
1752 case CK_BDVER2:
Craig Topper70d9b162012-05-01 07:18:03 +00001753 setFeatureEnabled(Features, "avx", true);
Craig Topperb6af69e2012-06-09 22:24:14 +00001754 setFeatureEnabled(Features, "xop", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001755 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00001756 setFeatureEnabled(Features, "pclmul", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001757 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001758 case CK_C3_2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001759 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001760 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001761 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001762 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001763}
1764
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001765bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00001766 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001767 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001768 // FIXME: This *really* should not be here. We need some way of translating
1769 // options into llvm subtarget features.
1770 if (!Features.count(Name) &&
1771 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001772 return false;
1773
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001774 // FIXME: this should probably use a switch with fall through.
1775
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001776 if (Enabled) {
1777 if (Name == "mmx")
1778 Features["mmx"] = true;
1779 else if (Name == "sse")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001780 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001781 else if (Name == "sse2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001782 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001783 else if (Name == "sse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001784 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1785 true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001786 else if (Name == "ssse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001787 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001788 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001789 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001790 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001791 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1792 Features["popcnt"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001793 else if (Name == "sse4.1")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001794 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00001795 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001796 else if (Name == "3dnow")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001797 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001798 else if (Name == "3dnowa")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001799 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001800 else if (Name == "aes")
Craig Toppera7463c32012-06-03 21:56:22 +00001801 Features["sse"] = Features["sse2"] = Features["aes"] = true;
Craig Topper3c0bc152012-05-31 05:18:48 +00001802 else if (Name == "pclmul")
Craig Toppera7463c32012-06-03 21:56:22 +00001803 Features["sse"] = Features["sse2"] = Features["pclmul"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001804 else if (Name == "avx")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001805 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1806 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001807 Features["popcnt"] = Features["avx"] = true;
Craig Topper2b03bb02011-12-17 19:55:21 +00001808 else if (Name == "avx2")
1809 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1810 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001811 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topper2ae95072012-06-03 21:46:30 +00001812 else if (Name == "fma")
1813 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1814 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1815 Features["popcnt"] = Features["avx"] = Features["fma"] = true;
Craig Topper6a511e12011-12-30 07:33:42 +00001816 else if (Name == "fma4")
1817 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1818 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper90ea0362012-05-30 05:54:54 +00001819 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
1820 Features["fma4"] = true;
Craig Topperb6af69e2012-06-09 22:24:14 +00001821 else if (Name == "xop")
1822 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1823 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1824 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
1825 Features["fma4"] = Features["xop"] = true;
Roman Divacky80b32b82011-10-30 13:47:56 +00001826 else if (Name == "sse4a")
Craig Topper6a511e12011-12-30 07:33:42 +00001827 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper90ea0362012-05-30 05:54:54 +00001828 Features["sse4a"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00001829 else if (Name == "lzcnt")
1830 Features["lzcnt"] = true;
1831 else if (Name == "bmi")
1832 Features["bmi"] = true;
1833 else if (Name == "bmi2")
1834 Features["bmi2"] = true;
Craig Toppere14e08b2011-12-29 16:10:46 +00001835 else if (Name == "popcnt")
1836 Features["popcnt"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001837 } else {
1838 if (Name == "mmx")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001839 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001840 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001841 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001842 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper31380fb2012-06-03 22:23:42 +00001843 Features["sse4a"] = Features["avx"] = Features["avx2"] =
1844 Features["fma"] = Features["fma4"] = Features["aes"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00001845 Features["pclmul"] = Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001846 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001847 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Toppera7463c32012-06-03 21:56:22 +00001848 Features["sse41"] = Features["sse42"] = Features["sse4a"] =
Craig Topper31380fb2012-06-03 22:23:42 +00001849 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00001850 Features["fma4"] = Features["aes"] = Features["pclmul"] =
1851 Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001852 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001853 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topper31380fb2012-06-03 22:23:42 +00001854 Features["sse42"] = Features["sse4a"] = Features["avx"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00001855 Features["avx2"] = Features["fma"] = Features["fma4"] =
1856 Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001857 else if (Name == "ssse3")
Craig Topper31380fb2012-06-03 22:23:42 +00001858 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1859 Features["avx"] = Features["avx2"] = Features["fma"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001860 else if (Name == "sse4" || Name == "sse4.1")
Craig Topper31380fb2012-06-03 22:23:42 +00001861 Features["sse41"] = Features["sse42"] = Features["avx"] =
1862 Features["avx2"] = Features["fma"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001863 else if (Name == "sse4.2")
Craig Topper31380fb2012-06-03 22:23:42 +00001864 Features["sse42"] = Features["avx"] = Features["avx2"] =
1865 Features["fma"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001866 else if (Name == "3dnow")
1867 Features["3dnow"] = Features["3dnowa"] = false;
1868 else if (Name == "3dnowa")
1869 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001870 else if (Name == "aes")
1871 Features["aes"] = false;
Craig Topper3c0bc152012-05-31 05:18:48 +00001872 else if (Name == "pclmul")
1873 Features["pclmul"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001874 else if (Name == "avx")
Craig Topper2ae95072012-06-03 21:46:30 +00001875 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00001876 Features["fma4"] = Features["xop"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001877 else if (Name == "avx2")
1878 Features["avx2"] = false;
Craig Topper2ae95072012-06-03 21:46:30 +00001879 else if (Name == "fma")
1880 Features["fma"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001881 else if (Name == "sse4a")
Craig Topperb6af69e2012-06-09 22:24:14 +00001882 Features["sse4a"] = Features["fma4"] = Features["xop"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001883 else if (Name == "lzcnt")
1884 Features["lzcnt"] = false;
1885 else if (Name == "bmi")
1886 Features["bmi"] = false;
1887 else if (Name == "bmi2")
1888 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001889 else if (Name == "popcnt")
1890 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001891 else if (Name == "fma4")
Craig Topperb6af69e2012-06-09 22:24:14 +00001892 Features["fma4"] = Features["xop"] = false;
1893 else if (Name == "xop")
1894 Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001895 }
1896
1897 return true;
1898}
1899
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001900/// HandleTargetOptions - Perform initialization based on the user
1901/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001902void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001903 // Remember the maximum enabled sselevel.
1904 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1905 // Ignore disabled features.
1906 if (Features[i][0] == '-')
1907 continue;
1908
Benjamin Kramer713575a2012-03-05 15:10:44 +00001909 StringRef Feature = StringRef(Features[i]).substr(1);
1910
1911 if (Feature == "aes") {
Eric Christophereea12d12010-04-02 23:50:19 +00001912 HasAES = true;
1913 continue;
1914 }
1915
Craig Topper3c0bc152012-05-31 05:18:48 +00001916 if (Feature == "pclmul") {
1917 HasPCLMUL = true;
1918 continue;
1919 }
1920
Benjamin Kramer713575a2012-03-05 15:10:44 +00001921 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00001922 HasLZCNT = true;
1923 continue;
1924 }
1925
Benjamin Kramer713575a2012-03-05 15:10:44 +00001926 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00001927 HasBMI = true;
1928 continue;
1929 }
1930
Benjamin Kramer713575a2012-03-05 15:10:44 +00001931 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00001932 HasBMI2 = true;
1933 continue;
1934 }
1935
Benjamin Kramer713575a2012-03-05 15:10:44 +00001936 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00001937 HasPOPCNT = true;
1938 continue;
1939 }
1940
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00001941 if (Feature == "sse4a") {
1942 HasSSE4a = true;
1943 continue;
1944 }
1945
Benjamin Kramer713575a2012-03-05 15:10:44 +00001946 if (Feature == "fma4") {
Craig Topper6a511e12011-12-30 07:33:42 +00001947 HasFMA4 = true;
1948 continue;
1949 }
1950
Craig Topper2ae95072012-06-03 21:46:30 +00001951 if (Feature == "fma") {
1952 HasFMA = true;
1953 continue;
1954 }
1955
Craig Topperb6af69e2012-06-09 22:24:14 +00001956 if (Feature == "xop") {
1957 HasXOP = true;
1958 continue;
1959 }
1960
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001961 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00001962 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper05fe4b52012-01-09 09:19:09 +00001963 .Case("avx2", AVX2)
1964 .Case("avx", AVX)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001965 .Case("sse42", SSE42)
1966 .Case("sse41", SSE41)
1967 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001968 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001969 .Case("sse2", SSE2)
1970 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001971 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001972 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001973
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001974 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00001975 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001976 .Case("3dnowa", AMD3DNowAthlon)
1977 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001978 .Case("mmx", MMX)
1979 .Default(NoMMX3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001980
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001981 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001982 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001983
1984 // Don't tell the backend if we're turning off mmx; it will end up disabling
1985 // SSE, which we don't want.
1986 std::vector<std::string>::iterator it;
1987 it = std::find(Features.begin(), Features.end(), "-mmx");
1988 if (it != Features.end())
1989 Features.erase(it);
Chris Lattner3daed522009-03-02 22:20:04 +00001990}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001991
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001992/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1993/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001994void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001995 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001996 // Target identification.
1997 if (PointerWidth == 64) {
Aaron Ballmanc0765a02012-03-14 20:50:57 +00001998 if (getLongWidth() == 64) {
1999 Builder.defineMacro("_LP64");
2000 Builder.defineMacro("__LP64__");
2001 }
Benjamin Kramera9992772010-01-09 17:55:51 +00002002 Builder.defineMacro("__amd64__");
2003 Builder.defineMacro("__amd64");
2004 Builder.defineMacro("__x86_64");
2005 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00002006 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00002007 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00002008 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002009
Chris Lattnerc0f59212009-03-02 22:27:17 +00002010 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002011 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2012 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002013 switch (CPU) {
2014 case CK_Generic:
2015 break;
2016 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002017 // The rest are coming from the i386 define above.
2018 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002019 break;
2020 case CK_i486:
2021 case CK_WinChipC6:
2022 case CK_WinChip2:
2023 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002024 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002025 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002026 case CK_PentiumMMX:
2027 Builder.defineMacro("__pentium_mmx__");
2028 Builder.defineMacro("__tune_pentium_mmx__");
2029 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002030 case CK_i586:
2031 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002032 defineCPUMacros(Builder, "i586");
2033 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002034 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002035 case CK_Pentium3:
2036 case CK_Pentium3M:
2037 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002038 Builder.defineMacro("__tune_pentium3__");
2039 // Fallthrough
2040 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002041 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002042 Builder.defineMacro("__tune_pentium2__");
2043 // Fallthrough
2044 case CK_PentiumPro:
2045 Builder.defineMacro("__tune_i686__");
2046 Builder.defineMacro("__tune_pentiumpro__");
2047 // Fallthrough
2048 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002049 Builder.defineMacro("__i686");
2050 Builder.defineMacro("__i686__");
2051 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2052 Builder.defineMacro("__pentiumpro");
2053 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002054 break;
2055 case CK_Pentium4:
2056 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002057 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002058 break;
2059 case CK_Yonah:
2060 case CK_Prescott:
2061 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002062 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002063 break;
2064 case CK_Core2:
2065 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002066 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002067 break;
2068 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002069 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002070 break;
2071 case CK_Corei7:
2072 case CK_Corei7AVX:
2073 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002074 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002075 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002076 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002077 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002078 Builder.defineMacro("__k6_2__");
2079 Builder.defineMacro("__tune_k6_2__");
2080 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002081 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002082 if (CPU != CK_K6_2) { // In case of fallthrough
2083 // FIXME: GCC may be enabling these in cases where some other k6
2084 // architecture is specified but -m3dnow is explicitly provided. The
2085 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002086 Builder.defineMacro("__k6_3__");
2087 Builder.defineMacro("__tune_k6_3__");
2088 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00002089 // Fallthrough
2090 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002091 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002092 break;
2093 case CK_Athlon:
2094 case CK_AthlonThunderbird:
2095 case CK_Athlon4:
2096 case CK_AthlonXP:
2097 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002098 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002099 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002100 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002101 Builder.defineMacro("__tune_athlon_sse__");
2102 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002103 break;
2104 case CK_K8:
2105 case CK_K8SSE3:
2106 case CK_x86_64:
2107 case CK_Opteron:
2108 case CK_OpteronSSE3:
2109 case CK_Athlon64:
2110 case CK_Athlon64SSE3:
2111 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002112 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002113 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002114 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002115 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00002116 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002117 case CK_BTVER1:
2118 defineCPUMacros(Builder, "btver1");
2119 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002120 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002121 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002122 break;
2123 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002124 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002125 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002126 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002127 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002128 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002129 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00002130
Chandler Carruth88c75b02011-09-28 09:54:07 +00002131 // Target properties.
2132 Builder.defineMacro("__LITTLE_ENDIAN__");
2133 Builder.defineMacro("__REGISTER_PREFIX__", "");
2134
Chris Lattner54175442009-04-19 17:32:33 +00002135 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2136 // functions in glibc header files that use FP Stack inline asm which the
2137 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00002138 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002139
Chandler Carruth88c75b02011-09-28 09:54:07 +00002140 if (HasAES)
2141 Builder.defineMacro("__AES__");
2142
Craig Topper3c0bc152012-05-31 05:18:48 +00002143 if (HasPCLMUL)
2144 Builder.defineMacro("__PCLMUL__");
2145
Craig Topper31ceea02011-12-25 05:06:45 +00002146 if (HasLZCNT)
2147 Builder.defineMacro("__LZCNT__");
2148
2149 if (HasBMI)
2150 Builder.defineMacro("__BMI__");
2151
2152 if (HasBMI2)
2153 Builder.defineMacro("__BMI2__");
2154
Craig Toppere14e08b2011-12-29 16:10:46 +00002155 if (HasPOPCNT)
2156 Builder.defineMacro("__POPCNT__");
2157
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002158 if (HasSSE4a)
2159 Builder.defineMacro("__SSE4A__");
2160
Craig Topper6a511e12011-12-30 07:33:42 +00002161 if (HasFMA4)
2162 Builder.defineMacro("__FMA4__");
2163
Craig Topper2ae95072012-06-03 21:46:30 +00002164 if (HasFMA)
2165 Builder.defineMacro("__FMA__");
2166
Craig Topperb6af69e2012-06-09 22:24:14 +00002167 if (HasXOP)
2168 Builder.defineMacro("__XOP__");
2169
Chris Lattner84f0ea82009-03-02 22:40:39 +00002170 // Each case falls through to the previous one here.
2171 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002172 case AVX2:
2173 Builder.defineMacro("__AVX2__");
2174 case AVX:
2175 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002176 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00002177 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002178 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002179 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002180 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002181 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002182 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002183 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002184 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002185 Builder.defineMacro("__SSE2__");
2186 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002187 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002188 Builder.defineMacro("__SSE__");
2189 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002190 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002191 break;
2192 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002193
Francois Pichet62ec1f22011-09-17 17:15:52 +00002194 if (Opts.MicrosoftExt && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002195 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002196 case AVX2:
2197 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002198 case SSE42:
2199 case SSE41:
2200 case SSSE3:
2201 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002202 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002203 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002204 break;
2205 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002206 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002207 break;
2208 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002209 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002210 }
2211 }
2212
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002213 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002214 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002215 case AMD3DNowAthlon:
2216 Builder.defineMacro("__3dNOW_A__");
2217 case AMD3DNow:
2218 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002219 case MMX:
2220 Builder.defineMacro("__MMX__");
2221 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002222 break;
2223 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00002224}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002225
Douglas Gregore727d212012-01-30 06:38:25 +00002226bool X86TargetInfo::hasFeature(StringRef Feature) const {
2227 return llvm::StringSwitch<bool>(Feature)
2228 .Case("aes", HasAES)
2229 .Case("avx", SSELevel >= AVX)
2230 .Case("avx2", SSELevel >= AVX2)
2231 .Case("bmi", HasBMI)
2232 .Case("bmi2", HasBMI2)
Craig Topper2ae95072012-06-03 21:46:30 +00002233 .Case("fma", HasFMA)
Douglas Gregore727d212012-01-30 06:38:25 +00002234 .Case("fma4", HasFMA4)
2235 .Case("lzcnt", HasLZCNT)
2236 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2237 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2238 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00002239 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00002240 .Case("popcnt", HasPOPCNT)
2241 .Case("sse", SSELevel >= SSE1)
2242 .Case("sse2", SSELevel >= SSE2)
2243 .Case("sse3", SSELevel >= SSE3)
2244 .Case("ssse3", SSELevel >= SSSE3)
2245 .Case("sse41", SSELevel >= SSE41)
2246 .Case("sse42", SSELevel >= SSE42)
Craig Topper3c0bc152012-05-31 05:18:48 +00002247 .Case("sse4a", HasSSE4a)
Douglas Gregore727d212012-01-30 06:38:25 +00002248 .Case("x86", true)
2249 .Case("x86_32", PointerWidth == 32)
2250 .Case("x86_64", PointerWidth == 64)
Craig Topperb6af69e2012-06-09 22:24:14 +00002251 .Case("xop", HasXOP)
Douglas Gregore727d212012-01-30 06:38:25 +00002252 .Default(false);
2253}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002254
Eli Friedman618234a2008-08-20 02:34:37 +00002255bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002256X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002257 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002258 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002259 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002260 case 'Y': // first letter of a pair:
2261 switch (*(Name+1)) {
2262 default: return false;
2263 case '0': // First SSE register.
2264 case 't': // Any SSE register, when SSE2 is enabled.
2265 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2266 case 'm': // any MMX register, when inter-unit moves enabled.
2267 break; // falls through to setAllowsRegister.
2268 }
Eli Friedman618234a2008-08-20 02:34:37 +00002269 case 'a': // eax.
2270 case 'b': // ebx.
2271 case 'c': // ecx.
2272 case 'd': // edx.
2273 case 'S': // esi.
2274 case 'D': // edi.
2275 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002276 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002277 case 't': // top of floating point stack.
2278 case 'u': // second from top of floating point stack.
2279 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002280 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002281 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002282 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002283 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2284 case 'l': // "Index" registers: any general register that can be used as an
2285 // index in a base+index memory access.
2286 Info.setAllowsRegister();
2287 return true;
2288 case 'C': // SSE floating point constant.
2289 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002290 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002291 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002292 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002293 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002294 return true;
2295 }
2296}
2297
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002298
Eli Friedman618234a2008-08-20 02:34:37 +00002299std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002300X86TargetInfo::convertConstraint(const char *&Constraint) const {
2301 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002302 case 'a': return std::string("{ax}");
2303 case 'b': return std::string("{bx}");
2304 case 'c': return std::string("{cx}");
2305 case 'd': return std::string("{dx}");
2306 case 'S': return std::string("{si}");
2307 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002308 case 'p': // address
2309 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002310 case 't': // top of floating point stack.
2311 return std::string("{st}");
2312 case 'u': // second from top of floating point stack.
2313 return std::string("{st(1)}"); // second from top of floating point stack.
2314 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002315 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002316 }
2317}
Eli Friedman618234a2008-08-20 02:34:37 +00002318} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002319
2320namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002321// X86-32 generic target
2322class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002323public:
Eli Friedman618234a2008-08-20 02:34:37 +00002324 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2325 DoubleAlign = LongLongAlign = 32;
2326 LongDoubleWidth = 96;
2327 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002328 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002329 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2330 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002331 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002332 SizeType = UnsignedInt;
2333 PtrDiffType = SignedInt;
2334 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002335 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002336
2337 // Use fpret for all types.
2338 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2339 (1 << TargetInfo::Double) |
2340 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002341
2342 // x86-32 has atomics up to 8 bytes
2343 // FIXME: Check that we actually have cmpxchg8b before setting
2344 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2345 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002346 }
2347 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002348 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00002349 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002350
Chris Lattner21fb98e2009-09-23 06:06:36 +00002351 int getEHDataRegisterNumber(unsigned RegNo) const {
2352 if (RegNo == 0) return 0;
2353 if (RegNo == 1) return 2;
2354 return -1;
2355 }
Eli Friedman618234a2008-08-20 02:34:37 +00002356};
2357} // end anonymous namespace
2358
2359namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002360class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2361public:
2362 NetBSDI386TargetInfo(const std::string &triple) :
2363 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2364 }
2365
2366 virtual unsigned getFloatEvalMethod() const {
2367 // NetBSD defaults to "double" rounding
2368 return 1;
2369 }
2370};
2371} // end anonymous namespace
2372
2373namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002374class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2375public:
2376 OpenBSDI386TargetInfo(const std::string& triple) :
2377 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2378 SizeType = UnsignedLong;
2379 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002380 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002381 }
2382};
2383} // end anonymous namespace
2384
2385namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002386class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002387public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002388 DarwinI386TargetInfo(const std::string& triple) :
2389 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002390 LongDoubleWidth = 128;
2391 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002392 SuitableAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00002393 SizeType = UnsignedLong;
2394 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002395 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2396 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002397 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002398 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002399 }
2400
Eli Friedman618234a2008-08-20 02:34:37 +00002401};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002402} // end anonymous namespace
2403
2404namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002405// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002406class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002407public:
2408 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002409 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002410 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002411 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002412 DoubleAlign = LongLongAlign = 64;
2413 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 +00002414 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002415 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002416 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002417 virtual void getTargetDefines(const LangOptions &Opts,
2418 MacroBuilder &Builder) const {
2419 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2420 }
2421};
2422} // end anonymous namespace
2423
2424namespace {
2425
2426// x86-32 Windows Visual Studio target
2427class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2428public:
2429 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2430 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002431 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002432 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2433 }
2434 virtual void getTargetDefines(const LangOptions &Opts,
2435 MacroBuilder &Builder) const {
2436 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2437 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2438 // The value of the following reflects processor type.
2439 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2440 // We lost the original triple, so we use the default.
2441 Builder.defineMacro("_M_IX86", "600");
2442 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002443};
2444} // end anonymous namespace
2445
2446namespace {
2447// x86-32 MinGW target
2448class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2449public:
2450 MinGWX86_32TargetInfo(const std::string& triple)
2451 : WindowsX86_32TargetInfo(triple) {
2452 }
2453 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002454 MacroBuilder &Builder) const {
2455 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002456 DefineStd(Builder, "WIN32", Opts);
2457 DefineStd(Builder, "WINNT", Opts);
2458 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002459 Builder.defineMacro("__MSVCRT__");
2460 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002461
2462 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2463 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002464 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002465 // Provide "as-is" __declspec.
2466 Builder.defineMacro("__declspec", "__declspec");
2467 else
2468 // Provide alias of __attribute__ like mingw32-gcc.
2469 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002470 }
2471};
2472} // end anonymous namespace
2473
2474namespace {
2475// x86-32 Cygwin target
2476class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2477public:
2478 CygwinX86_32TargetInfo(const std::string& triple)
2479 : X86_32TargetInfo(triple) {
2480 TLSSupported = false;
2481 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002482 DoubleAlign = LongLongAlign = 64;
2483 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2484 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002485 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002486 }
2487 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002488 MacroBuilder &Builder) const {
2489 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2490 Builder.defineMacro("__CYGWIN__");
2491 Builder.defineMacro("__CYGWIN32__");
2492 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00002493 if (Opts.CPlusPlus)
2494 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00002495 }
Eli Friedman29a30502008-08-21 01:40:19 +00002496};
2497} // end anonymous namespace
2498
2499namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00002500// x86-32 Haiku target
2501class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2502public:
2503 HaikuX86_32TargetInfo(const std::string& triple)
2504 : X86_32TargetInfo(triple) {
2505 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00002506 IntPtrType = SignedLong;
2507 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00002508 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00002509 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00002510 virtual void getTargetDefines(const LangOptions &Opts,
2511 MacroBuilder &Builder) const {
2512 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2513 Builder.defineMacro("__INTEL__");
2514 Builder.defineMacro("__HAIKU__");
2515 }
2516};
2517} // end anonymous namespace
2518
Douglas Gregordca52262011-07-01 22:41:14 +00002519// RTEMS Target
2520template<typename Target>
2521class RTEMSTargetInfo : public OSTargetInfo<Target> {
2522protected:
2523 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2524 MacroBuilder &Builder) const {
2525 // RTEMS defines; list based off of gcc output
2526
Douglas Gregordca52262011-07-01 22:41:14 +00002527 Builder.defineMacro("__rtems__");
2528 Builder.defineMacro("__ELF__");
2529 }
2530public:
2531 RTEMSTargetInfo(const std::string &triple)
2532 : OSTargetInfo<Target>(triple) {
2533 this->UserLabelPrefix = "";
2534
2535 llvm::Triple Triple(triple);
2536 switch (Triple.getArch()) {
2537 default:
2538 case llvm::Triple::x86:
2539 // this->MCountName = ".mcount";
2540 break;
2541 case llvm::Triple::mips:
2542 case llvm::Triple::mipsel:
2543 case llvm::Triple::ppc:
2544 case llvm::Triple::ppc64:
2545 // this->MCountName = "_mcount";
2546 break;
2547 case llvm::Triple::arm:
2548 // this->MCountName = "__mcount";
2549 break;
2550 }
2551
2552 }
2553};
2554
2555namespace {
2556// x86-32 RTEMS target
2557class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2558public:
2559 RTEMSX86_32TargetInfo(const std::string& triple)
2560 : X86_32TargetInfo(triple) {
2561 SizeType = UnsignedLong;
2562 IntPtrType = SignedLong;
2563 PtrDiffType = SignedLong;
2564 this->UserLabelPrefix = "";
2565 }
2566 virtual void getTargetDefines(const LangOptions &Opts,
2567 MacroBuilder &Builder) const {
2568 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2569 Builder.defineMacro("__INTEL__");
2570 Builder.defineMacro("__rtems__");
2571 }
2572};
2573} // end anonymous namespace
2574
Chris Lattner86ed3a32010-04-11 19:29:39 +00002575namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002576// x86-64 generic target
2577class X86_64TargetInfo : public X86TargetInfo {
2578public:
Chris Lattner33328642009-03-20 15:52:06 +00002579 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00002580 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002581 LongDoubleWidth = 128;
2582 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00002583 LargeArrayMinWidth = 128;
2584 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002585 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00002586 IntMaxType = SignedLong;
2587 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002588 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002589 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00002590
Eli Friedmaned855cb2008-08-21 00:13:15 +00002591 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2592 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002593 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002594
2595 // Use fpret only for long double.
2596 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00002597
Anders Carlssoneea64802011-10-31 16:27:11 +00002598 // Use fp2ret for _Complex long double.
2599 ComplexLongDoubleUsesFP2Ret = true;
2600
Eli Friedman2be46072011-10-14 20:59:01 +00002601 // x86-64 has atomics up to 16 bytes.
2602 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2603 // on CPUs with cmpxchg16b
2604 MaxAtomicPromoteWidth = 128;
2605 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00002606 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00002607 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002608 return "typedef struct __va_list_tag {"
2609 " unsigned gp_offset;"
2610 " unsigned fp_offset;"
2611 " void* overflow_arg_area;"
2612 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00002613 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00002614 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00002615 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002616
Chris Lattner21fb98e2009-09-23 06:06:36 +00002617 int getEHDataRegisterNumber(unsigned RegNo) const {
2618 if (RegNo == 0) return 0;
2619 if (RegNo == 1) return 1;
2620 return -1;
2621 }
Eli Friedman618234a2008-08-20 02:34:37 +00002622};
2623} // end anonymous namespace
2624
2625namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002626// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002627class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002628public:
2629 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002630 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002631 TLSSupported = false;
2632 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00002633 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00002634 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00002635 IntMaxType = SignedLongLong;
2636 UIntMaxType = UnsignedLongLong;
2637 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00002638 SizeType = UnsignedLongLong;
2639 PtrDiffType = SignedLongLong;
2640 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00002641 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002642 }
2643 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002644 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002645 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002646 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00002647 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00002648 virtual const char *getVAListDeclaration() const {
2649 return "typedef char* __builtin_va_list;";
2650 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002651};
2652} // end anonymous namespace
2653
2654namespace {
2655// x86-64 Windows Visual Studio target
2656class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2657public:
2658 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2659 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002660 LongDoubleWidth = LongDoubleAlign = 64;
2661 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00002662 }
2663 virtual void getTargetDefines(const LangOptions &Opts,
2664 MacroBuilder &Builder) const {
2665 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2666 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00002667 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002668 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002669 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002670};
2671} // end anonymous namespace
2672
2673namespace {
2674// x86-64 MinGW target
2675class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2676public:
2677 MinGWX86_64TargetInfo(const std::string& triple)
2678 : WindowsX86_64TargetInfo(triple) {
2679 }
2680 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002681 MacroBuilder &Builder) const {
2682 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002683 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00002684 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00002685 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00002686 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002687
2688 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2689 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002690 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002691 // Provide "as-is" __declspec.
2692 Builder.defineMacro("__declspec", "__declspec");
2693 else
2694 // Provide alias of __attribute__ like mingw32-gcc.
2695 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002696 }
2697};
2698} // end anonymous namespace
2699
2700namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002701class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2702public:
Mike Stump1eb44332009-09-09 15:08:12 +00002703 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002704 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2705 Int64Type = SignedLongLong;
2706 }
2707};
2708} // end anonymous namespace
2709
2710namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00002711class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2712public:
Mike Stump1eb44332009-09-09 15:08:12 +00002713 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00002714 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2715 IntMaxType = SignedLongLong;
2716 UIntMaxType = UnsignedLongLong;
2717 Int64Type = SignedLongLong;
2718 }
2719};
2720} // end anonymous namespace
2721
2722namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00002723class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002724 // Possible FPU choices.
2725 enum FPUMode {
2726 NoFPU,
2727 VFP2FPU,
2728 VFP3FPU,
2729 NeonFPU
2730 };
2731
2732 static bool FPUModeIsVFP(FPUMode Mode) {
2733 return Mode >= VFP2FPU && Mode <= NeonFPU;
2734 }
2735
2736 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2737 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002738
Daniel Dunbareac7c532009-12-18 18:42:37 +00002739 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002740
2741 unsigned FPU : 3;
2742
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002743 unsigned IsThumb : 1;
2744
2745 // Initialized via features.
2746 unsigned SoftFloat : 1;
2747 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002748
Chris Lattner2752c012010-03-03 19:03:45 +00002749 static const Builtin::Info BuiltinInfo[];
2750
Chris Lattner393ff042008-04-21 18:56:49 +00002751public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002752 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00002753 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002754 {
Eli Friedmane6a24e82011-12-22 03:51:45 +00002755 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002756 SizeType = UnsignedInt;
2757 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00002758 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2759 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002760
Chris Lattner9bffb072010-04-23 16:29:58 +00002761 // {} in inline assembly are neon specifiers, not assembly variant
2762 // specifiers.
2763 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00002764
Daniel Dunbareac7c532009-12-18 18:42:37 +00002765 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00002766 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002767 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002768 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2769 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002770 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2771 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002772 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002773 } else {
2774 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2775 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002776 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002777 }
John McCallee79a4c2010-08-21 22:46:04 +00002778
2779 // ARM targets default to using the ARM C++ ABI.
2780 CXXABI = CXXABI_ARM;
Eli Friedman2be46072011-10-14 20:59:01 +00002781
2782 // ARM has atomics up to 8 bytes
2783 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2784 MaxAtomicPromoteWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00002785
2786 // Do force alignment of members that follow zero length bitfields. If
2787 // the alignment of the zero-length bitfield is greater than the member
2788 // that follows it, `bar', `bar' will be aligned as the type of the
2789 // zero length bitfield.
2790 UseZeroLengthBitfieldAlignment = true;
Eli Friedman61538a72008-05-20 14:21:01 +00002791 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002792 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00002793 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002794 ABI = Name;
2795
Daniel Dunbara2a41612009-09-14 00:02:24 +00002796 // The defaults (above) are for AAPCS, check if we need to change them.
2797 //
2798 // FIXME: We need support for -meabi... we could just mangle it into the
2799 // name.
2800 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002801 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002802 SizeType = UnsignedLong;
2803
James Molloya6d81f92011-11-23 13:35:08 +00002804 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2805 WCharType = SignedInt;
2806
Daniel Dunbar684de632010-04-22 16:14:54 +00002807 // Do not respect the alignment of bit-field types when laying out
2808 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2809 UseBitFieldTypeAlignment = false;
2810
Chad Rosier61a62212011-08-04 01:21:14 +00002811 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00002812 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2813 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00002814 ZeroLengthBitfieldBoundary = 32;
2815
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002816 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002817 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2818 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002819 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 +00002820 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002821 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002822 } else {
2823 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 +00002824 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002825 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002826 }
2827
Chad Rosier9f1210c2011-07-26 07:03:04 +00002828 // FIXME: Override "preferred align" for double and long long.
Daniel Dunbara2a41612009-09-14 00:02:24 +00002829 } else if (Name == "aapcs") {
2830 // FIXME: Enumerated types are variable width in straight AAPCS.
2831 } else if (Name == "aapcs-linux") {
Chad Rosier9f1210c2011-07-26 07:03:04 +00002832 ;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002833 } else
2834 return false;
2835
2836 return true;
2837 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002838
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002839 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002840 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2841 Features["vfp2"] = true;
2842 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2843 Features["neon"] = true;
2844 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002845
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002846 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00002847 StringRef Name,
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002848 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00002849 if (Name == "soft-float" || Name == "soft-float-abi" ||
Chad Rosier7a938fa2012-04-04 20:39:32 +00002850 Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16" ||
2851 Name == "neonfp") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002852 Features[Name] = Enabled;
2853 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002854 return false;
2855
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002856 return true;
2857 }
2858
2859 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002860 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002861 SoftFloat = SoftFloatABI = false;
2862 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2863 if (Features[i] == "+soft-float")
2864 SoftFloat = true;
2865 else if (Features[i] == "+soft-float-abi")
2866 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002867 else if (Features[i] == "+vfp2")
2868 FPU = VFP2FPU;
2869 else if (Features[i] == "+vfp3")
2870 FPU = VFP3FPU;
2871 else if (Features[i] == "+neon")
2872 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002873 }
2874
2875 // Remove front-end specific options which the backend handles differently.
2876 std::vector<std::string>::iterator it;
2877 it = std::find(Features.begin(), Features.end(), "+soft-float");
2878 if (it != Features.end())
2879 Features.erase(it);
2880 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2881 if (it != Features.end())
2882 Features.erase(it);
2883 }
2884
Douglas Gregore727d212012-01-30 06:38:25 +00002885 virtual bool hasFeature(StringRef Feature) const {
2886 return llvm::StringSwitch<bool>(Feature)
2887 .Case("arm", true)
2888 .Case("softfloat", SoftFloat)
2889 .Case("thumb", IsThumb)
2890 .Case("neon", FPU == NeonFPU && !SoftFloat &&
2891 StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
2892 .Default(false);
2893 }
Chris Lattner5f9e2722011-07-23 10:55:15 +00002894 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00002895 return llvm::StringSwitch<const char*>(Name)
2896 .Cases("arm8", "arm810", "4")
2897 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2898 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2899 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2900 .Case("ep9312", "4T")
2901 .Cases("arm10tdmi", "arm1020t", "5T")
2902 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2903 .Case("arm926ej-s", "5TEJ")
2904 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2905 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002906 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002907 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002908 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002909 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2910 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00002911 .Case("cortex-m3", "7M")
Jim Grosbach69033132012-03-29 19:53:34 +00002912 .Case("cortex-m4", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00002913 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002914 .Default(0);
2915 }
2916 virtual bool setCPU(const std::string &Name) {
2917 if (!getCPUDefineSuffix(Name))
2918 return false;
2919
2920 CPU = Name;
2921 return true;
2922 }
Chris Lattner33328642009-03-20 15:52:06 +00002923 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002924 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002925 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00002926 Builder.defineMacro("__arm");
2927 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002928
Chris Lattnerc0f59212009-03-02 22:27:17 +00002929 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00002930 Builder.defineMacro("__ARMEL__");
2931 Builder.defineMacro("__LITTLE_ENDIAN__");
2932 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002933
Chris Lattner5f9e2722011-07-23 10:55:15 +00002934 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00002935 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002936
Mike Stump437bb4b2009-04-08 02:07:04 +00002937 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002938
Daniel Dunbareac7c532009-12-18 18:42:37 +00002939 // FIXME: It's more complicated than this and we don't really support
2940 // interworking.
2941 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00002942 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002943
Daniel Dunbareac7c532009-12-18 18:42:37 +00002944 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00002945 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002946
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002947 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00002948 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002949
2950 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00002951 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002952
Bob Wilson84f95cf2011-05-13 18:56:03 +00002953 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002954 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002955 Builder.defineMacro("__THUMBEL__");
2956 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00002957 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002958 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002959 }
2960
2961 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00002962 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002963
2964 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00002965 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002966
2967 // This only gets set when Neon instructions are actually available, unlike
2968 // the VFP define, hence the soft float and arch check. This is subtly
2969 // different from gcc, we follow the intent which was that it should be set
2970 // when Neon instructions are actually available.
Bob Wilson84f95cf2011-05-13 18:56:03 +00002971 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002972 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00002973 }
2974 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2975 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00002976 Records = BuiltinInfo;
2977 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00002978 }
Bob Wilson8b30a932012-01-26 22:14:27 +00002979 virtual bool isCLZForZeroUndef() const { return false; }
Chris Lattner393ff042008-04-21 18:56:49 +00002980 virtual const char *getVAListDeclaration() const {
John McCall0e9972c2011-05-09 02:19:37 +00002981 return "typedef void* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00002982 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002983 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002984 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002985 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002986 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002987 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002988 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002989 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002990 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00002991 default:
Nate Begemanad487f42008-04-22 05:03:19 +00002992 case 'l': // r0-r7
2993 case 'h': // r8-r15
2994 case 'w': // VFP Floating point register single precision
2995 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00002996 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00002997 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00002998 case 'Q': // A memory address that is a single base register.
2999 Info.setAllowsMemory();
3000 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00003001 case 'U': // a memory reference...
3002 switch (Name[1]) {
3003 case 'q': // ...ARMV4 ldrsb
3004 case 'v': // ...VFP load/store (reg+constant offset)
3005 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00003006 case 't': // address valid for load/store opaque types wider
3007 // than 128-bits
3008 case 'n': // valid address for Neon doubleword vector load/store
3009 case 'm': // valid address for Neon element and structure load/store
3010 case 's': // valid address for non-offset loads/stores of quad-word
3011 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00003012 Info.setAllowsMemory();
3013 Name++;
3014 return true;
3015 }
Nate Begemanad487f42008-04-22 05:03:19 +00003016 }
Chris Lattner393ff042008-04-21 18:56:49 +00003017 return false;
3018 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00003019 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00003020 std::string R;
3021 switch (*Constraint) {
3022 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00003023 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00003024 Constraint++;
3025 break;
Eric Christopher283f4472011-06-17 00:40:18 +00003026 case 'p': // 'p' should be translated to 'r' by default.
3027 R = std::string("r");
3028 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00003029 default:
3030 return std::string(1, *Constraint);
3031 }
3032 return R;
3033 }
Chris Lattner393ff042008-04-21 18:56:49 +00003034 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00003035 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00003036 return "";
3037 }
3038};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003039
3040const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003041 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003042 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003043 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
3044
3045 // Float registers
3046 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3047 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3048 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003049 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003050
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003051 // Double registers
3052 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3053 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00003054 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3055 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003056
3057 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00003058 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3059 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003060};
3061
3062void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003063 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003064 Names = GCCRegNames;
3065 NumNames = llvm::array_lengthof(GCCRegNames);
3066}
3067
3068const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003069 { { "a1" }, "r0" },
3070 { { "a2" }, "r1" },
3071 { { "a3" }, "r2" },
3072 { { "a4" }, "r3" },
3073 { { "v1" }, "r4" },
3074 { { "v2" }, "r5" },
3075 { { "v3" }, "r6" },
3076 { { "v4" }, "r7" },
3077 { { "v5" }, "r8" },
3078 { { "v6", "rfp" }, "r9" },
3079 { { "sl" }, "r10" },
3080 { { "fp" }, "r11" },
3081 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003082 { { "r13" }, "sp" },
3083 { { "r14" }, "lr" },
3084 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003085 // The S, D and Q registers overlap, but aren't really aliases; we
3086 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003087};
3088
3089void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3090 unsigned &NumAliases) const {
3091 Aliases = GCCRegAliases;
3092 NumAliases = llvm::array_lengthof(GCCRegAliases);
3093}
Chris Lattner2752c012010-03-03 19:03:45 +00003094
3095const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00003096#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00003097#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00003098 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00003099#include "clang/Basic/BuiltinsARM.def"
3100};
Chris Lattner393ff042008-04-21 18:56:49 +00003101} // end anonymous namespace.
3102
Eli Friedmana9f54962008-08-20 07:44:10 +00003103namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00003104class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003105 public DarwinTargetInfo<ARMTargetInfo> {
3106protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00003107 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00003108 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00003109 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00003110 }
Eli Friedmana9f54962008-08-20 07:44:10 +00003111
Torok Edwin5f6c1942009-06-30 17:10:35 +00003112public:
Mike Stump1eb44332009-09-09 15:08:12 +00003113 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00003114 : DarwinTargetInfo<ARMTargetInfo>(triple) {
3115 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00003116 // iOS always has 64-bit atomic instructions.
3117 // FIXME: This should be based off of the target features in ARMTargetInfo.
3118 MaxAtomicInlineWidth = 64;
Daniel Dunbar350b9f32010-05-27 07:00:26 +00003119 }
Eli Friedmana9f54962008-08-20 07:44:10 +00003120};
3121} // end anonymous namespace.
3122
Tony Linthicum96319392011-12-12 21:14:55 +00003123
3124namespace {
3125// Hexagon abstract base class
3126class HexagonTargetInfo : public TargetInfo {
3127 static const Builtin::Info BuiltinInfo[];
3128 static const char * const GCCRegNames[];
3129 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3130 std::string CPU;
3131public:
3132 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003133 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00003134 DescriptionString = ("e-p:32:32:32-"
Sirish Pande5f9688b2012-05-10 20:19:54 +00003135 "i64:64:64-i32:32:32-i16:16:16-i1:32:32"
3136 "f64:64:64-f32:32:32-a0:0-n32");
Tony Linthicum96319392011-12-12 21:14:55 +00003137
3138 // {} in inline assembly are packet specifiers, not assembly variant
3139 // specifiers.
3140 NoAsmVariants = true;
3141 }
3142
3143 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3144 unsigned &NumRecords) const {
3145 Records = BuiltinInfo;
3146 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3147 }
3148
3149 virtual bool validateAsmConstraint(const char *&Name,
3150 TargetInfo::ConstraintInfo &Info) const {
3151 return true;
3152 }
3153
3154 virtual void getTargetDefines(const LangOptions &Opts,
3155 MacroBuilder &Builder) const;
3156
Douglas Gregore727d212012-01-30 06:38:25 +00003157 virtual bool hasFeature(StringRef Feature) const {
3158 return Feature == "hexagon";
3159 }
3160
Tony Linthicum96319392011-12-12 21:14:55 +00003161 virtual const char *getVAListDeclaration() const {
3162 return "typedef char* __builtin_va_list;";
3163 }
3164 virtual void getGCCRegNames(const char * const *&Names,
3165 unsigned &NumNames) const;
3166 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3167 unsigned &NumAliases) const;
3168 virtual const char *getClobbers() const {
3169 return "";
3170 }
Sebastian Pop43115d42012-01-13 20:37:10 +00003171
3172 static const char *getHexagonCPUSuffix(StringRef Name) {
3173 return llvm::StringSwitch<const char*>(Name)
3174 .Case("hexagonv2", "2")
3175 .Case("hexagonv3", "3")
3176 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00003177 .Case("hexagonv5", "5")
Sebastian Pop43115d42012-01-13 20:37:10 +00003178 .Default(0);
3179 }
3180
Tony Linthicum96319392011-12-12 21:14:55 +00003181 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00003182 if (!getHexagonCPUSuffix(Name))
3183 return false;
3184
Tony Linthicum96319392011-12-12 21:14:55 +00003185 CPU = Name;
3186 return true;
3187 }
3188};
3189
3190void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
3191 MacroBuilder &Builder) const {
3192 Builder.defineMacro("qdsp6");
3193 Builder.defineMacro("__qdsp6", "1");
3194 Builder.defineMacro("__qdsp6__", "1");
3195
3196 Builder.defineMacro("hexagon");
3197 Builder.defineMacro("__hexagon", "1");
3198 Builder.defineMacro("__hexagon__", "1");
3199
3200 if(CPU == "hexagonv1") {
3201 Builder.defineMacro("__HEXAGON_V1__");
3202 Builder.defineMacro("__HEXAGON_ARCH__", "1");
3203 if(Opts.HexagonQdsp6Compat) {
3204 Builder.defineMacro("__QDSP6_V1__");
3205 Builder.defineMacro("__QDSP6_ARCH__", "1");
3206 }
3207 }
3208 else if(CPU == "hexagonv2") {
3209 Builder.defineMacro("__HEXAGON_V2__");
3210 Builder.defineMacro("__HEXAGON_ARCH__", "2");
3211 if(Opts.HexagonQdsp6Compat) {
3212 Builder.defineMacro("__QDSP6_V2__");
3213 Builder.defineMacro("__QDSP6_ARCH__", "2");
3214 }
3215 }
3216 else if(CPU == "hexagonv3") {
3217 Builder.defineMacro("__HEXAGON_V3__");
3218 Builder.defineMacro("__HEXAGON_ARCH__", "3");
3219 if(Opts.HexagonQdsp6Compat) {
3220 Builder.defineMacro("__QDSP6_V3__");
3221 Builder.defineMacro("__QDSP6_ARCH__", "3");
3222 }
3223 }
3224 else if(CPU == "hexagonv4") {
3225 Builder.defineMacro("__HEXAGON_V4__");
3226 Builder.defineMacro("__HEXAGON_ARCH__", "4");
3227 if(Opts.HexagonQdsp6Compat) {
3228 Builder.defineMacro("__QDSP6_V4__");
3229 Builder.defineMacro("__QDSP6_ARCH__", "4");
3230 }
3231 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00003232 else if(CPU == "hexagonv5") {
3233 Builder.defineMacro("__HEXAGON_V5__");
3234 Builder.defineMacro("__HEXAGON_ARCH__", "5");
3235 if(Opts.HexagonQdsp6Compat) {
3236 Builder.defineMacro("__QDSP6_V5__");
3237 Builder.defineMacro("__QDSP6_ARCH__", "5");
3238 }
3239 }
Tony Linthicum96319392011-12-12 21:14:55 +00003240}
3241
3242const char * const HexagonTargetInfo::GCCRegNames[] = {
3243 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3244 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3245 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3246 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3247 "p0", "p1", "p2", "p3",
3248 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3249};
3250
3251void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3252 unsigned &NumNames) const {
3253 Names = GCCRegNames;
3254 NumNames = llvm::array_lengthof(GCCRegNames);
3255}
3256
3257
3258const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3259 { { "sp" }, "r29" },
3260 { { "fp" }, "r30" },
3261 { { "lr" }, "r31" },
3262 };
3263
3264void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3265 unsigned &NumAliases) const {
3266 Aliases = GCCRegAliases;
3267 NumAliases = llvm::array_lengthof(GCCRegAliases);
3268}
3269
3270
3271const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3272#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3273#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3274 ALL_LANGUAGES },
3275#include "clang/Basic/BuiltinsHexagon.def"
3276};
3277}
3278
3279
Reid Spencer5f016e22007-07-11 17:01:13 +00003280namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00003281class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00003282 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3283 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003284 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00003285public:
Eli Friedman01b86682008-08-20 07:28:14 +00003286 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3287 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00003288 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 +00003289 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00003290 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003291 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00003292 StringRef Name,
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003293 bool Enabled) const {
3294 if (Name == "soft-float")
3295 Features[Name] = Enabled;
3296 else
3297 return false;
3298
3299 return true;
3300 }
3301 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3302 SoftFloat = false;
3303 for (unsigned i = 0, e = Features.size(); i != e; ++i)
3304 if (Features[i] == "+soft-float")
3305 SoftFloat = true;
3306 }
Chris Lattner33328642009-03-20 15:52:06 +00003307 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003308 MacroBuilder &Builder) const {
3309 DefineStd(Builder, "sparc", Opts);
3310 Builder.defineMacro("__sparcv8");
3311 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003312
3313 if (SoftFloat)
3314 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00003315 }
Douglas Gregore727d212012-01-30 06:38:25 +00003316
3317 virtual bool hasFeature(StringRef Feature) const {
3318 return llvm::StringSwitch<bool>(Feature)
3319 .Case("softfloat", SoftFloat)
3320 .Case("sparc", true)
3321 .Default(false);
3322 }
3323
Gabor Greif26658672008-02-21 16:29:08 +00003324 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3325 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003326 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00003327 }
3328 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003329 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00003330 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003331 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003332 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003333 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003334 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003335 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00003336 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003337 // FIXME: Implement!
3338 return false;
Gabor Greif26658672008-02-21 16:29:08 +00003339 }
3340 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003341 // FIXME: Implement!
3342 return "";
Gabor Greif26658672008-02-21 16:29:08 +00003343 }
3344};
3345
Chris Lattnere957f532009-01-27 01:58:38 +00003346const char * const SparcV8TargetInfo::GCCRegNames[] = {
3347 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3348 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3349 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3350 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3351};
3352
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003353void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003354 unsigned &NumNames) const {
3355 Names = GCCRegNames;
3356 NumNames = llvm::array_lengthof(GCCRegNames);
3357}
3358
3359const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003360 { { "g0" }, "r0" },
3361 { { "g1" }, "r1" },
3362 { { "g2" }, "r2" },
3363 { { "g3" }, "r3" },
3364 { { "g4" }, "r4" },
3365 { { "g5" }, "r5" },
3366 { { "g6" }, "r6" },
3367 { { "g7" }, "r7" },
3368 { { "o0" }, "r8" },
3369 { { "o1" }, "r9" },
3370 { { "o2" }, "r10" },
3371 { { "o3" }, "r11" },
3372 { { "o4" }, "r12" },
3373 { { "o5" }, "r13" },
3374 { { "o6", "sp" }, "r14" },
3375 { { "o7" }, "r15" },
3376 { { "l0" }, "r16" },
3377 { { "l1" }, "r17" },
3378 { { "l2" }, "r18" },
3379 { { "l3" }, "r19" },
3380 { { "l4" }, "r20" },
3381 { { "l5" }, "r21" },
3382 { { "l6" }, "r22" },
3383 { { "l7" }, "r23" },
3384 { { "i0" }, "r24" },
3385 { { "i1" }, "r25" },
3386 { { "i2" }, "r26" },
3387 { { "i3" }, "r27" },
3388 { { "i4" }, "r28" },
3389 { { "i5" }, "r29" },
3390 { { "i6", "fp" }, "r30" },
3391 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00003392};
3393
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003394void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003395 unsigned &NumAliases) const {
3396 Aliases = GCCRegAliases;
3397 NumAliases = llvm::array_lengthof(GCCRegAliases);
3398}
Gabor Greif26658672008-02-21 16:29:08 +00003399} // end anonymous namespace.
3400
Eli Friedman01b86682008-08-20 07:28:14 +00003401namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003402class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3403public:
3404 AuroraUXSparcV8TargetInfo(const std::string& triple) :
3405 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3406 SizeType = UnsignedInt;
3407 PtrDiffType = SignedInt;
3408 }
3409};
Torok Edwin5f6c1942009-06-30 17:10:35 +00003410class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00003411public:
3412 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003413 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00003414 SizeType = UnsignedInt;
3415 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00003416 }
3417};
3418} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00003419
Chris Lattner2621fd12008-05-08 05:58:21 +00003420namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003421 class MSP430TargetInfo : public TargetInfo {
3422 static const char * const GCCRegNames[];
3423 public:
3424 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003425 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003426 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00003427 IntWidth = 16; IntAlign = 16;
3428 LongWidth = 32; LongLongWidth = 64;
3429 LongAlign = LongLongAlign = 16;
3430 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003431 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003432 SizeType = UnsignedInt;
3433 IntMaxType = SignedLong;
3434 UIntMaxType = UnsignedLong;
3435 IntPtrType = SignedShort;
3436 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00003437 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00003438 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003439 }
3440 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003441 MacroBuilder &Builder) const {
3442 Builder.defineMacro("MSP430");
3443 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003444 // FIXME: defines for different 'flavours' of MCU
3445 }
3446 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3447 unsigned &NumRecords) const {
3448 // FIXME: Implement.
3449 Records = 0;
3450 NumRecords = 0;
3451 }
Douglas Gregore727d212012-01-30 06:38:25 +00003452 virtual bool hasFeature(StringRef Feature) const {
3453 return Feature == "msp430";
3454 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003455 virtual void getGCCRegNames(const char * const *&Names,
3456 unsigned &NumNames) const;
3457 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3458 unsigned &NumAliases) const {
3459 // No aliases.
3460 Aliases = 0;
3461 NumAliases = 0;
3462 }
3463 virtual bool validateAsmConstraint(const char *&Name,
3464 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00003465 // No target constraints for now.
3466 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003467 }
3468 virtual const char *getClobbers() const {
3469 // FIXME: Is this really right?
3470 return "";
3471 }
3472 virtual const char *getVAListDeclaration() const {
3473 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00003474 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003475 }
3476 };
3477
3478 const char * const MSP430TargetInfo::GCCRegNames[] = {
3479 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3480 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3481 };
3482
3483 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3484 unsigned &NumNames) const {
3485 Names = GCCRegNames;
3486 NumNames = llvm::array_lengthof(GCCRegNames);
3487 }
3488}
3489
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00003490namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00003491
Mike Stump1eb44332009-09-09 15:08:12 +00003492 // LLVM and Clang cannot be used directly to output native binaries for
3493 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00003494 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00003495 //
3496 // TCE uses the llvm bitcode as input and uses it for generating customized
3497 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00003498 // publicly available in http://tce.cs.tut.fi
3499
Eli Friedman209f5bb2011-10-07 19:51:42 +00003500 static const unsigned TCEOpenCLAddrSpaceMap[] = {
3501 3, // opencl_global
3502 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00003503 5, // opencl_constant
3504 0, // cuda_device
3505 0, // cuda_constant
3506 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00003507 };
3508
Eli Friedmanb63decf2009-08-19 20:47:07 +00003509 class TCETargetInfo : public TargetInfo{
3510 public:
3511 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3512 TLSSupported = false;
3513 IntWidth = 32;
3514 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003515 PointerWidth = 32;
3516 IntAlign = 32;
3517 LongAlign = LongLongAlign = 32;
3518 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003519 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003520 SizeType = UnsignedInt;
3521 IntMaxType = SignedLong;
3522 UIntMaxType = UnsignedLong;
3523 IntPtrType = SignedInt;
3524 PtrDiffType = SignedInt;
3525 FloatWidth = 32;
3526 FloatAlign = 32;
3527 DoubleWidth = 32;
3528 DoubleAlign = 32;
3529 LongDoubleWidth = 32;
3530 LongDoubleAlign = 32;
3531 FloatFormat = &llvm::APFloat::IEEEsingle;
3532 DoubleFormat = &llvm::APFloat::IEEEsingle;
3533 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00003534 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3535 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00003536 "f32:32:32-f64:32:32-v64:32:32-"
3537 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00003538 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003539 }
3540
3541 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003542 MacroBuilder &Builder) const {
3543 DefineStd(Builder, "tce", Opts);
3544 Builder.defineMacro("__TCE__");
3545 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00003546 }
Douglas Gregore727d212012-01-30 06:38:25 +00003547 virtual bool hasFeature(StringRef Feature) const {
3548 return Feature == "tce";
3549 }
3550
Eli Friedmanb63decf2009-08-19 20:47:07 +00003551 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3552 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00003553 virtual const char *getClobbers() const {
3554 return "";
3555 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003556 virtual const char *getVAListDeclaration() const {
3557 return "typedef void* __builtin_va_list;";
3558 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003559 virtual void getGCCRegNames(const char * const *&Names,
3560 unsigned &NumNames) const {}
3561 virtual bool validateAsmConstraint(const char *&Name,
3562 TargetInfo::ConstraintInfo &info) const {
3563 return true;
3564 }
3565 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3566 unsigned &NumAliases) const {}
3567 };
3568}
3569
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003570namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003571class MipsTargetInfoBase : public TargetInfo {
3572 std::string CPU;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00003573 bool SoftFloat;
3574 bool SingleFloat;
3575
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003576protected:
3577 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00003578
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003579public:
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00003580 MipsTargetInfoBase(const std::string& triple,
3581 const std::string& ABIStr,
3582 const std::string& CPUStr)
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00003583 : TargetInfo(triple),
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00003584 CPU(CPUStr),
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00003585 SoftFloat(false), SingleFloat(false),
3586 ABI(ABIStr)
3587 {}
3588
Eric Christophered734732010-03-02 02:41:08 +00003589 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003590 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00003591 virtual bool setCPU(const std::string &Name) {
3592 CPU = Name;
3593 return true;
3594 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003595 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00003596 Features[ABI] = true;
3597 Features[CPU] = true;
3598 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00003599
Eric Christophered734732010-03-02 02:41:08 +00003600 virtual void getArchDefines(const LangOptions &Opts,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00003601 MacroBuilder &Builder) const {
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00003602 if (SoftFloat && SingleFloat)
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00003603 llvm_unreachable("Invalid float ABI for Mips.");
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00003604 else if (SoftFloat)
3605 Builder.defineMacro("__mips_soft_float", Twine(1));
3606 else {
3607 Builder.defineMacro("__mips_hard_float", Twine(1));
3608 if (SingleFloat)
3609 Builder.defineMacro("__mips_single_float", Twine(1));
3610 }
Simon Atanasyan90913892012-04-05 19:28:31 +00003611
3612 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3613 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3614 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00003615 }
3616
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003617 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003618 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003619 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3620 unsigned &NumRecords) const {
3621 // FIXME: Implement!
3622 }
Douglas Gregore727d212012-01-30 06:38:25 +00003623 virtual bool hasFeature(StringRef Feature) const {
3624 return Feature == "mips";
3625 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003626 virtual const char *getVAListDeclaration() const {
3627 return "typedef void* __builtin_va_list;";
3628 }
3629 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003630 unsigned &NumNames) const {
3631 static const char * const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00003632 // CPU register names
3633 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003634 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
3635 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
3636 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00003637 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
3638 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003639 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
3640 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3641 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3642 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00003643 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003644 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3645 "$fcc5","$fcc6","$fcc7"
3646 };
3647 Names = GCCRegNames;
3648 NumNames = llvm::array_lengthof(GCCRegNames);
3649 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003650 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003651 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003652 virtual bool validateAsmConstraint(const char *&Name,
3653 TargetInfo::ConstraintInfo &Info) const {
3654 switch (*Name) {
3655 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00003656 return false;
3657
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003658 case 'r': // CPU registers.
3659 case 'd': // Equivalent to "r" unless generating MIPS16 code.
3660 case 'y': // Equivalent to "r", backwards compatibility only.
3661 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00003662 case 'c': // $25 for indirect jumps
3663 case 'l': // lo register
3664 case 'x': // hilo register pair
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003665 Info.setAllowsRegister();
3666 return true;
3667 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003668 }
3669
3670 virtual const char *getClobbers() const {
3671 // FIXME: Implement!
3672 return "";
3673 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00003674
3675 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3676 StringRef Name,
3677 bool Enabled) const {
Simon Atanasyan8b2a5d22012-04-18 12:00:11 +00003678 if (Name == "soft-float" || Name == "single-float" ||
3679 Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
3680 Name == "mips32" || Name == "mips32r2" ||
3681 Name == "mips64" || Name == "mips64r2") {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00003682 Features[Name] = Enabled;
3683 return true;
3684 }
3685 return false;
3686 }
3687
3688 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3689 SoftFloat = false;
3690 SingleFloat = false;
3691
3692 for (std::vector<std::string>::iterator it = Features.begin(),
3693 ie = Features.end(); it != ie; ++it) {
3694 if (*it == "+single-float") {
3695 SingleFloat = true;
3696 break;
3697 }
3698
3699 if (*it == "+soft-float") {
3700 SoftFloat = true;
3701 // This option is front-end specific.
3702 // Do not need to pass it to the backend.
3703 Features.erase(it);
3704 break;
3705 }
3706 }
3707 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003708};
3709
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003710class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003711public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003712 Mips32TargetInfoBase(const std::string& triple) :
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00003713 MipsTargetInfoBase(triple, "o32", "mips32") {
Akira Hatanaka148735e2011-11-05 01:48:34 +00003714 SizeType = UnsignedInt;
3715 PtrDiffType = SignedInt;
3716 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003717 virtual bool setABI(const std::string &Name) {
3718 if ((Name == "o32") || (Name == "eabi")) {
3719 ABI = Name;
3720 return true;
3721 } else
3722 return false;
3723 }
3724 virtual void getArchDefines(const LangOptions &Opts,
3725 MacroBuilder &Builder) const {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00003726 MipsTargetInfoBase::getArchDefines(Opts, Builder);
3727
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003728 if (ABI == "o32") {
3729 Builder.defineMacro("__mips_o32");
3730 Builder.defineMacro("_ABIO32", "1");
3731 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3732 }
3733 else if (ABI == "eabi")
3734 Builder.defineMacro("__mips_eabi");
3735 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003736 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003737 }
3738 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3739 unsigned &NumAliases) const {
3740 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3741 { { "at" }, "$1" },
3742 { { "v0" }, "$2" },
3743 { { "v1" }, "$3" },
3744 { { "a0" }, "$4" },
3745 { { "a1" }, "$5" },
3746 { { "a2" }, "$6" },
3747 { { "a3" }, "$7" },
3748 { { "t0" }, "$8" },
3749 { { "t1" }, "$9" },
3750 { { "t2" }, "$10" },
3751 { { "t3" }, "$11" },
3752 { { "t4" }, "$12" },
3753 { { "t5" }, "$13" },
3754 { { "t6" }, "$14" },
3755 { { "t7" }, "$15" },
3756 { { "s0" }, "$16" },
3757 { { "s1" }, "$17" },
3758 { { "s2" }, "$18" },
3759 { { "s3" }, "$19" },
3760 { { "s4" }, "$20" },
3761 { { "s5" }, "$21" },
3762 { { "s6" }, "$22" },
3763 { { "s7" }, "$23" },
3764 { { "t8" }, "$24" },
3765 { { "t9" }, "$25" },
3766 { { "k0" }, "$26" },
3767 { { "k1" }, "$27" },
3768 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00003769 { { "sp","$sp" }, "$29" },
3770 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003771 { { "ra" }, "$31" }
3772 };
3773 Aliases = GCCRegAliases;
3774 NumAliases = llvm::array_lengthof(GCCRegAliases);
3775 }
3776};
3777
3778class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3779public:
3780 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3781 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3782 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3783 }
3784 virtual void getTargetDefines(const LangOptions &Opts,
3785 MacroBuilder &Builder) const {
3786 DefineStd(Builder, "mips", Opts);
3787 Builder.defineMacro("_mips");
3788 DefineStd(Builder, "MIPSEB", Opts);
3789 Builder.defineMacro("_MIPSEB");
3790 Builder.defineMacro("__REGISTER_PREFIX__", "");
3791 getArchDefines(Opts, Builder);
3792 }
3793};
3794
3795class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3796public:
3797 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003798 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003799 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 +00003800 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003801 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003802 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003803 MacroBuilder &Builder) const {
3804 DefineStd(Builder, "mips", Opts);
3805 Builder.defineMacro("_mips");
3806 DefineStd(Builder, "MIPSEL", Opts);
3807 Builder.defineMacro("_MIPSEL");
3808 Builder.defineMacro("__REGISTER_PREFIX__", "");
3809 getArchDefines(Opts, Builder);
3810 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003811};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003812
3813class Mips64TargetInfoBase : public MipsTargetInfoBase {
3814 virtual void SetDescriptionString(const std::string &Name) = 0;
3815public:
3816 Mips64TargetInfoBase(const std::string& triple) :
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00003817 MipsTargetInfoBase(triple, "n64", "mips64") {
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003818 LongWidth = LongAlign = 64;
3819 PointerWidth = PointerAlign = 64;
3820 LongDoubleWidth = LongDoubleAlign = 128;
3821 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003822 SuitableAlign = 128;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003823 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003824 virtual bool setABI(const std::string &Name) {
3825 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003826
3827 if (Name != "n32" && Name != "n64")
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003828 return false;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003829
3830 ABI = Name;
3831
3832 if (Name == "n32") {
3833 LongWidth = LongAlign = 32;
3834 PointerWidth = PointerAlign = 32;
3835 }
3836
3837 return true;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003838 }
3839 virtual void getArchDefines(const LangOptions &Opts,
3840 MacroBuilder &Builder) const {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00003841 MipsTargetInfoBase::getArchDefines(Opts, Builder);
3842
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003843 if (ABI == "n32") {
3844 Builder.defineMacro("__mips_n32");
3845 Builder.defineMacro("_ABIN32", "2");
3846 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3847 }
3848 else if (ABI == "n64") {
3849 Builder.defineMacro("__mips_n64");
3850 Builder.defineMacro("_ABI64", "3");
3851 Builder.defineMacro("_MIPS_SIM", "_ABI64");
3852 }
3853 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003854 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003855 }
3856 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3857 unsigned &NumAliases) const {
3858 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3859 { { "at" }, "$1" },
3860 { { "v0" }, "$2" },
3861 { { "v1" }, "$3" },
3862 { { "a0" }, "$4" },
3863 { { "a1" }, "$5" },
3864 { { "a2" }, "$6" },
3865 { { "a3" }, "$7" },
3866 { { "a4" }, "$8" },
3867 { { "a5" }, "$9" },
3868 { { "a6" }, "$10" },
3869 { { "a7" }, "$11" },
3870 { { "t0" }, "$12" },
3871 { { "t1" }, "$13" },
3872 { { "t2" }, "$14" },
3873 { { "t3" }, "$15" },
3874 { { "s0" }, "$16" },
3875 { { "s1" }, "$17" },
3876 { { "s2" }, "$18" },
3877 { { "s3" }, "$19" },
3878 { { "s4" }, "$20" },
3879 { { "s5" }, "$21" },
3880 { { "s6" }, "$22" },
3881 { { "s7" }, "$23" },
3882 { { "t8" }, "$24" },
3883 { { "t9" }, "$25" },
3884 { { "k0" }, "$26" },
3885 { { "k1" }, "$27" },
3886 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00003887 { { "sp","$sp" }, "$29" },
3888 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003889 { { "ra" }, "$31" }
3890 };
3891 Aliases = GCCRegAliases;
3892 NumAliases = llvm::array_lengthof(GCCRegAliases);
3893 }
3894};
3895
3896class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3897 virtual void SetDescriptionString(const std::string &Name) {
3898 // Change DescriptionString only if ABI is n32.
3899 if (Name == "n32")
3900 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 +00003901 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3902 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003903 }
3904public:
3905 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3906 // Default ABI is n64.
3907 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 +00003908 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3909 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003910 }
3911 virtual void getTargetDefines(const LangOptions &Opts,
3912 MacroBuilder &Builder) const {
3913 DefineStd(Builder, "mips", Opts);
3914 Builder.defineMacro("_mips");
3915 DefineStd(Builder, "MIPSEB", Opts);
3916 Builder.defineMacro("_MIPSEB");
3917 Builder.defineMacro("__REGISTER_PREFIX__", "");
3918 getArchDefines(Opts, Builder);
3919 }
3920};
3921
3922class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3923 virtual void SetDescriptionString(const std::string &Name) {
3924 // Change DescriptionString only if ABI is n32.
3925 if (Name == "n32")
3926 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 +00003927 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
3928 "-v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003929 }
3930public:
3931 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003932 // Default ABI is n64.
3933 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003934 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 +00003935 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3936 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003937 }
3938 virtual void getTargetDefines(const LangOptions &Opts,
3939 MacroBuilder &Builder) const {
3940 DefineStd(Builder, "mips", Opts);
3941 Builder.defineMacro("_mips");
3942 DefineStd(Builder, "MIPSEL", Opts);
3943 Builder.defineMacro("_MIPSEL");
3944 Builder.defineMacro("__REGISTER_PREFIX__", "");
3945 getArchDefines(Opts, Builder);
3946 }
3947};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003948} // end anonymous namespace.
3949
Ivan Krasinef05abd2011-08-24 20:22:22 +00003950namespace {
3951class PNaClTargetInfo : public TargetInfo {
3952public:
3953 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003954 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003955 this->UserLabelPrefix = "";
3956 this->LongAlign = 32;
3957 this->LongWidth = 32;
3958 this->PointerAlign = 32;
3959 this->PointerWidth = 32;
3960 this->IntMaxType = TargetInfo::SignedLongLong;
3961 this->UIntMaxType = TargetInfo::UnsignedLongLong;
3962 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003963 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003964 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003965 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003966 this->SizeType = TargetInfo::UnsignedInt;
3967 this->PtrDiffType = TargetInfo::SignedInt;
3968 this->IntPtrType = TargetInfo::SignedInt;
David Meyerdd4a8892011-10-11 03:12:01 +00003969 this->RegParmMax = 2;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003970 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3971 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3972 }
3973
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003974 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00003975 }
3976 virtual void getArchDefines(const LangOptions &Opts,
3977 MacroBuilder &Builder) const {
3978 Builder.defineMacro("__le32__");
3979 Builder.defineMacro("__pnacl__");
3980 }
3981 virtual void getTargetDefines(const LangOptions &Opts,
3982 MacroBuilder &Builder) const {
Ivan Krasin089ee112011-08-25 23:49:20 +00003983 DefineStd(Builder, "unix", Opts);
3984 Builder.defineMacro("__ELF__");
3985 if (Opts.POSIXThreads)
3986 Builder.defineMacro("_REENTRANT");
3987 if (Opts.CPlusPlus)
3988 Builder.defineMacro("_GNU_SOURCE");
3989
Jan Wen Voungdde3bdb2012-03-29 00:05:59 +00003990 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasinef05abd2011-08-24 20:22:22 +00003991 Builder.defineMacro("__native_client__");
3992 getArchDefines(Opts, Builder);
3993 }
Douglas Gregore727d212012-01-30 06:38:25 +00003994 virtual bool hasFeature(StringRef Feature) const {
3995 return Feature == "pnacl";
3996 }
Ivan Krasinef05abd2011-08-24 20:22:22 +00003997 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3998 unsigned &NumRecords) const {
3999 }
4000 virtual const char *getVAListDeclaration() const {
Ivan Krasin68018db2011-09-20 14:56:54 +00004001 return "typedef int __builtin_va_list[4];";
Ivan Krasinef05abd2011-08-24 20:22:22 +00004002 }
4003 virtual void getGCCRegNames(const char * const *&Names,
4004 unsigned &NumNames) const;
4005 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4006 unsigned &NumAliases) const;
4007 virtual bool validateAsmConstraint(const char *&Name,
4008 TargetInfo::ConstraintInfo &Info) const {
4009 return false;
4010 }
4011
4012 virtual const char *getClobbers() const {
4013 return "";
4014 }
4015};
4016
4017void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
4018 unsigned &NumNames) const {
4019 Names = NULL;
4020 NumNames = 0;
4021}
4022
4023void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4024 unsigned &NumAliases) const {
4025 Aliases = NULL;
4026 NumAliases = 0;
4027}
4028} // end anonymous namespace.
4029
4030
Reid Spencer5f016e22007-07-11 17:01:13 +00004031//===----------------------------------------------------------------------===//
4032// Driver code
4033//===----------------------------------------------------------------------===//
4034
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004035static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004036 llvm::Triple Triple(T);
4037 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00004038
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004039 switch (Triple.getArch()) {
4040 default:
4041 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00004042
Tony Linthicum96319392011-12-12 21:14:55 +00004043 case llvm::Triple::hexagon:
4044 return new HexagonTargetInfo(T);
4045
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004046 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00004047 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004048 if (Triple.isOSDarwin())
4049 return new DarwinARMTargetInfo(T);
4050
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004051 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00004052 case llvm::Triple::Linux:
4053 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004054 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00004055 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004056 case llvm::Triple::NetBSD:
4057 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00004058 case llvm::Triple::RTEMS:
4059 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004060 default:
4061 return new ARMTargetInfo(T);
4062 }
Eli Friedman61538a72008-05-20 14:21:01 +00004063
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004064 case llvm::Triple::msp430:
4065 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00004066
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004067 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004068 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004069 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004070 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004071 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004072 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004073 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004074 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004075 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004076 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004077 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004078 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004079 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004080
4081 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004082 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004083 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004084 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004085 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004086 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004087 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004088 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004089 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004090 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004091 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004092 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004093 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004094
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004095 case llvm::Triple::mips64:
4096 switch (os) {
4097 case llvm::Triple::Linux:
4098 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
4099 case llvm::Triple::RTEMS:
4100 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
4101 case llvm::Triple::FreeBSD:
4102 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
4103 case llvm::Triple::NetBSD:
4104 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
4105 default:
4106 return new Mips64EBTargetInfo(T);
4107 }
4108
4109 case llvm::Triple::mips64el:
4110 switch (os) {
4111 case llvm::Triple::Linux:
4112 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
4113 case llvm::Triple::RTEMS:
4114 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
4115 case llvm::Triple::FreeBSD:
4116 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
4117 case llvm::Triple::NetBSD:
4118 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
4119 default:
4120 return new Mips64ELTargetInfo(T);
4121 }
4122
Ivan Krasinef05abd2011-08-24 20:22:22 +00004123 case llvm::Triple::le32:
4124 switch (os) {
4125 case llvm::Triple::NativeClient:
4126 return new PNaClTargetInfo(T);
4127 default:
4128 return NULL;
4129 }
4130
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004131 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004132 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00004133 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004134 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00004135 case llvm::Triple::Linux:
4136 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004137 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00004138 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004139 case llvm::Triple::NetBSD:
4140 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
4141 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00004142 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004143 default:
4144 return new PPC32TargetInfo(T);
4145 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004146
4147 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004148 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00004149 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004150 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00004151 case llvm::Triple::Linux:
4152 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004153 case llvm::Triple::Lv2:
John Thompson3f6918a2009-11-19 17:18:50 +00004154 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004155 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00004156 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004157 case llvm::Triple::NetBSD:
4158 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
4159 default:
4160 return new PPC64TargetInfo(T);
4161 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004162
Peter Collingbourneedb66f32012-05-20 23:28:41 +00004163 case llvm::Triple::nvptx:
4164 return new NVPTX32TargetInfo(T);
4165 case llvm::Triple::nvptx64:
4166 return new NVPTX64TargetInfo(T);
4167
Chris Lattner9cbeb632010-03-06 21:21:27 +00004168 case llvm::Triple::mblaze:
4169 return new MBlazeTargetInfo(T);
4170
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004171 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004172 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00004173 case llvm::Triple::Linux:
4174 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004175 case llvm::Triple::AuroraUX:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004176 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004177 case llvm::Triple::Solaris:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004178 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004179 case llvm::Triple::NetBSD:
4180 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
4181 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00004182 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004183 default:
4184 return new SparcV8TargetInfo(T);
4185 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004186
John Thompson3f6918a2009-11-19 17:18:50 +00004187 // FIXME: Need a real SPU target.
4188 case llvm::Triple::cellspu:
4189 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
4190
Eli Friedmanb63decf2009-08-19 20:47:07 +00004191 case llvm::Triple::tce:
4192 return new TCETargetInfo(T);
4193
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004194 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004195 if (Triple.isOSDarwin())
4196 return new DarwinI386TargetInfo(T);
4197
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004198 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004199 case llvm::Triple::AuroraUX:
4200 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004201 case llvm::Triple::Linux:
4202 return new LinuxTargetInfo<X86_32TargetInfo>(T);
4203 case llvm::Triple::DragonFly:
4204 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
4205 case llvm::Triple::NetBSD:
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00004206 return new NetBSDI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004207 case llvm::Triple::OpenBSD:
4208 return new OpenBSDI386TargetInfo(T);
4209 case llvm::Triple::FreeBSD:
4210 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00004211 case llvm::Triple::Minix:
4212 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004213 case llvm::Triple::Solaris:
4214 return new SolarisTargetInfo<X86_32TargetInfo>(T);
4215 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00004216 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004217 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00004218 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004219 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00004220 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00004221 case llvm::Triple::Haiku:
4222 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00004223 case llvm::Triple::RTEMS:
4224 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004225 default:
4226 return new X86_32TargetInfo(T);
4227 }
4228
4229 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004230 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
4231 return new DarwinX86_64TargetInfo(T);
4232
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004233 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004234 case llvm::Triple::AuroraUX:
4235 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004236 case llvm::Triple::Linux:
4237 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00004238 case llvm::Triple::DragonFly:
4239 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004240 case llvm::Triple::NetBSD:
4241 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
4242 case llvm::Triple::OpenBSD:
4243 return new OpenBSDX86_64TargetInfo(T);
4244 case llvm::Triple::FreeBSD:
4245 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
4246 case llvm::Triple::Solaris:
4247 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00004248 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00004249 return new MinGWX86_64TargetInfo(T);
4250 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004251 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004252 default:
4253 return new X86_64TargetInfo(T);
4254 }
4255 }
Reid Spencer5f016e22007-07-11 17:01:13 +00004256}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004257
4258/// CreateTargetInfo - Return the target info object for the specified target
4259/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00004260TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004261 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004262 llvm::Triple Triple(Opts.Triple);
4263
4264 // Construct the target
Dylan Noblesmith6f42b622012-02-05 02:12:40 +00004265 OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004266 if (!Target) {
4267 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
4268 return 0;
4269 }
4270
Daniel Dunbareac7c532009-12-18 18:42:37 +00004271 // Set the target CPU if specified.
4272 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
4273 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
4274 return 0;
4275 }
4276
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004277 // Set the target ABI if specified.
4278 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
4279 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
4280 return 0;
4281 }
4282
Charles Davis98b7c5c2010-06-11 01:06:47 +00004283 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00004284 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00004285 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
4286 return 0;
4287 }
4288
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004289 // Compute the default target features, we need the target to handle this
4290 // because features may have dependencies on one another.
4291 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004292 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004293
4294 // Apply the user specified deltas.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00004295 // First the enables.
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004296 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4297 ie = Opts.Features.end(); it != ie; ++it) {
4298 const char *Name = it->c_str();
4299
Rafael Espindola53ac3d82011-11-27 20:00:43 +00004300 if (Name[0] != '+')
4301 continue;
4302
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004303 // Apply the feature via the target.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00004304 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
4305 Diags.Report(diag::err_target_invalid_feature) << Name;
4306 return 0;
4307 }
4308 }
4309
4310 // Then the disables.
4311 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4312 ie = Opts.Features.end(); it != ie; ++it) {
4313 const char *Name = it->c_str();
4314
4315 if (Name[0] == '+')
4316 continue;
4317
4318 // Apply the feature via the target.
4319 if (Name[0] != '-' ||
4320 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004321 Diags.Report(diag::err_target_invalid_feature) << Name;
4322 return 0;
4323 }
4324 }
4325
4326 // Add the features to the compile options.
4327 //
4328 // FIXME: If we are completely confident that we have the right set, we only
4329 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004330 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004331 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
4332 ie = Features.end(); it != ie; ++it)
Benjamin Kramer713575a2012-03-05 15:10:44 +00004333 Opts.Features.push_back((it->second ? "+" : "-") + it->first().str());
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004334 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004335
4336 return Target.take();
4337}