blob: a55714229063d40e49d1b6746c1a29a909f30257 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Dale Johannesen182addf2010-10-29 23:24:33 +000030#include "llvm/Type.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Chris Lattner5ba61f02006-10-14 07:39:34 +000032using namespace clang;
33
Chris Lattner5ba61f02006-10-14 07:39:34 +000034//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000035// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
37
Chris Lattner1e1c0b92009-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 Lattner0e62c1c2011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000044
Chris Lattner1e1c0b92009-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 Kramer2d6fda32010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055}
56
Benjamin Kramere3b442d2012-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 Lattner09d98f52008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000068
Torok Edwinb2b37c62009-06-30 17:10:35 +000069namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000072protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000075public:
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwinb2b37c62009-06-30 17:10:35 +000077 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000078 MacroBuilder &Builder) const {
79 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Benjamin Kramer2d6fda32010-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 Korobeynikov9d026dd2009-05-03 13:42:53 +000095
John McCall5d36a8c2011-06-16 00:03:19 +000096 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-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 Korobeynikov9d026dd2009-05-03 13:42:53 +000099
John McCall31168b02011-06-15 23:02:42 +0000100 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000101 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000102 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
103 else
104 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000105
John McCall31168b02011-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 McCall31168b02011-06-15 23:02:42 +0000110 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000111
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000112 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000113 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000114 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000116
117 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000119
Daniel Dunbarecf13562011-04-19 21:40:34 +0000120 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000121 unsigned Maj, Min, Rev;
Mike Stump11289f42009-09-09 15:08:12 +0000122
Daniel Dunbard86666f2010-01-26 01:44:04 +0000123 // If no version was given, default to to 10.4.0, for simplifying tests.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000124 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
125 PlatformName = "macosx";
Daniel Dunbard86666f2010-01-26 01:44:04 +0000126 Min = Rev = 0;
127 Maj = 8;
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
129 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
130 // "-osxNNN", and "-iosNNN").
131
132 if (Triple.getOS() == llvm::Triple::Darwin) {
133 // For historical reasons that make little sense, the version passed here
134 // is the "darwin" version, which drops the 10 and offsets by 4.
135 Triple.getOSVersion(Maj, Min, Rev);
136
137 if (Triple.getEnvironmentName() == "iphoneos") {
138 PlatformName = "ios";
139 } else {
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 PlatformName = "macosx";
141 Rev = Min;
142 Min = Maj - 4;
143 Maj = 10;
144 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 } else {
Daniel Dunbarecf13562011-04-19 21:40:34 +0000146 Triple.getOSVersion(Maj, Min, Rev);
Daniel Dunbarfcd23892011-04-19 23:34:21 +0000147 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000148 }
149 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000150
Sebastian Pop422377c2012-01-20 22:01:23 +0000151 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000152 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000153 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
154 if (PlatformName == "win32") {
155 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
156 return;
157 }
158
Daniel Dunbard86666f2010-01-26 01:44:04 +0000159 // Set the appropriate OS version define.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000160 if (PlatformName == "ios") {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000161 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000162 char Str[6];
163 Str[0] = '0' + Maj;
164 Str[1] = '0' + (Min / 10);
165 Str[2] = '0' + (Min % 10);
166 Str[3] = '0' + (Rev / 10);
167 Str[4] = '0' + (Rev % 10);
168 Str[5] = '\0';
169 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
170 } else {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000171 // Note that the Driver allows versions which aren't representable in the
172 // define (because we only get a single digit for the minor and micro
173 // revision numbers). So, we limit them to the maximum representable
174 // version.
Daniel Dunbard86666f2010-01-26 01:44:04 +0000175 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000176 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000177 char Str[5];
178 Str[0] = '0' + (Maj / 10);
179 Str[1] = '0' + (Maj % 10);
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000180 Str[2] = '0' + std::min(Min, 9U);
181 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbard86666f2010-01-26 01:44:04 +0000182 Str[4] = '\0';
183 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000184 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000185
186 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000187}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000188
Chris Lattner30ba6742009-08-10 19:03:04 +0000189namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000190template<typename Target>
191class DarwinTargetInfo : public OSTargetInfo<Target> {
192protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000193 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000194 MacroBuilder &Builder) const {
Eric Christopher0c912c52011-07-07 22:55:26 +0000195 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000196 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000197 }
Mike Stump11289f42009-09-09 15:08:12 +0000198
Torok Edwinb2b37c62009-06-30 17:10:35 +0000199public:
200 DarwinTargetInfo(const std::string& triple) :
201 OSTargetInfo<Target>(triple) {
Eric Christopherbf15d2b2011-07-02 00:20:22 +0000202 llvm::Triple T = llvm::Triple(triple);
203 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbar13adc7f2011-02-21 23:12:51 +0000204 this->MCountName = "\01mcount";
Torok Edwinb2b37c62009-06-30 17:10:35 +0000205 }
206
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000207 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000208 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000209 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000210 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000211 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000212 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000213 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000214 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000215
Anders Carlsson851318a2010-06-08 22:47:50 +0000216 virtual const char *getStaticInitSectionSpecifier() const {
217 // FIXME: We should return 0 when building kexts.
218 return "__TEXT,__StaticInit,regular,pure_instructions";
219 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000220
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221};
222
Chris Lattner30ba6742009-08-10 19:03:04 +0000223
Torok Edwinb2b37c62009-06-30 17:10:35 +0000224// DragonFlyBSD Target
225template<typename Target>
226class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
227protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000228 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000229 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000230 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000231 Builder.defineMacro("__DragonFly__");
232 Builder.defineMacro("__DragonFly_cc_version", "100001");
233 Builder.defineMacro("__ELF__");
234 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
235 Builder.defineMacro("__tune_i386__");
236 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000237 }
238public:
Mike Stump11289f42009-09-09 15:08:12 +0000239 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000240 : OSTargetInfo<Target>(triple) {}
241};
242
243// FreeBSD Target
244template<typename Target>
245class FreeBSDTargetInfo : public OSTargetInfo<Target> {
246protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000247 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000248 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000249 // FreeBSD defines; list based off of gcc output
250
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000251 unsigned Release = Triple.getOSMajorVersion();
252 if (Release == 0U)
253 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000254
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000255 Builder.defineMacro("__FreeBSD__", Twine(Release));
256 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000257 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
258 DefineStd(Builder, "unix", Opts);
259 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000260 }
261public:
Mike Stump11289f42009-09-09 15:08:12 +0000262 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000263 : OSTargetInfo<Target>(triple) {
264 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000265
266 llvm::Triple Triple(triple);
267 switch (Triple.getArch()) {
268 default:
269 case llvm::Triple::x86:
270 case llvm::Triple::x86_64:
271 this->MCountName = ".mcount";
272 break;
273 case llvm::Triple::mips:
274 case llvm::Triple::mipsel:
275 case llvm::Triple::ppc:
276 case llvm::Triple::ppc64:
277 this->MCountName = "_mcount";
278 break;
279 case llvm::Triple::arm:
280 this->MCountName = "__mcount";
281 break;
282 }
283
Duncan Sands9cb27e92009-07-08 13:55:08 +0000284 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000285};
286
Chris Lattner3e2ee142010-07-07 16:01:42 +0000287// Minix Target
288template<typename Target>
289class MinixTargetInfo : public OSTargetInfo<Target> {
290protected:
291 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
292 MacroBuilder &Builder) const {
293 // Minix defines
294
295 Builder.defineMacro("__minix", "3");
296 Builder.defineMacro("_EM_WSIZE", "4");
297 Builder.defineMacro("_EM_PSIZE", "4");
298 Builder.defineMacro("_EM_SSIZE", "2");
299 Builder.defineMacro("_EM_LSIZE", "4");
300 Builder.defineMacro("_EM_FSIZE", "4");
301 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000302 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000303 DefineStd(Builder, "unix", Opts);
304 }
305public:
306 MinixTargetInfo(const std::string &triple)
307 : OSTargetInfo<Target>(triple) {
308 this->UserLabelPrefix = "";
309 }
310};
311
Torok Edwinb2b37c62009-06-30 17:10:35 +0000312// Linux target
313template<typename Target>
314class LinuxTargetInfo : public OSTargetInfo<Target> {
315protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000316 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000317 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000318 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000319 DefineStd(Builder, "unix", Opts);
320 DefineStd(Builder, "linux", Opts);
321 Builder.defineMacro("__gnu_linux__");
322 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000323 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000324 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000325 if (Opts.CPlusPlus)
326 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000327 }
328public:
Mike Stump11289f42009-09-09 15:08:12 +0000329 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000330 : OSTargetInfo<Target>(triple) {
331 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000332 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000333 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000334
335 virtual const char *getStaticInitSectionSpecifier() const {
336 return ".text.startup";
337 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000338};
339
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000340// NetBSD Target
341template<typename Target>
342class NetBSDTargetInfo : public OSTargetInfo<Target> {
343protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000344 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000346 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000347 Builder.defineMacro("__NetBSD__");
348 Builder.defineMacro("__unix__");
349 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000350 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000351 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000352 }
353public:
Mike Stump11289f42009-09-09 15:08:12 +0000354 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000355 : OSTargetInfo<Target>(triple) {
356 this->UserLabelPrefix = "";
357 }
358};
359
Torok Edwinb2b37c62009-06-30 17:10:35 +0000360// OpenBSD Target
361template<typename Target>
362class OpenBSDTargetInfo : public OSTargetInfo<Target> {
363protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000364 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000365 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000366 // OpenBSD defines; list based off of gcc output
367
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000368 Builder.defineMacro("__OpenBSD__");
369 DefineStd(Builder, "unix", Opts);
370 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000371 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000372 Builder.defineMacro("_POSIX_THREADS");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000373 }
374public:
Mike Stump11289f42009-09-09 15:08:12 +0000375 OpenBSDTargetInfo(const std::string &triple)
Eli Friedman3715d1f2011-12-15 02:15:56 +0000376 : OSTargetInfo<Target>(triple) {
377 this->UserLabelPrefix = "";
378
379 llvm::Triple Triple(triple);
380 switch (Triple.getArch()) {
381 default:
382 case llvm::Triple::x86:
383 case llvm::Triple::x86_64:
384 case llvm::Triple::arm:
385 case llvm::Triple::sparc:
386 this->MCountName = "__mcount";
387 break;
388 case llvm::Triple::mips64:
389 case llvm::Triple::mips64el:
390 case llvm::Triple::ppc:
391 case llvm::Triple::sparcv9:
392 this->MCountName = "_mcount";
393 break;
394 }
395 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000396};
397
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000398// PSP Target
399template<typename Target>
400class PSPTargetInfo : public OSTargetInfo<Target> {
401protected:
402 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000403 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000404 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000405 Builder.defineMacro("PSP");
406 Builder.defineMacro("_PSP");
407 Builder.defineMacro("__psp__");
408 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000409 }
410public:
411 PSPTargetInfo(const std::string& triple)
412 : OSTargetInfo<Target>(triple) {
413 this->UserLabelPrefix = "";
414 }
415};
416
John Thompsone467e192009-11-19 17:18:50 +0000417// PS3 PPU Target
418template<typename Target>
419class PS3PPUTargetInfo : public OSTargetInfo<Target> {
420protected:
421 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000422 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000423 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000424 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000425 Builder.defineMacro("__PPU__");
426 Builder.defineMacro("__CELLOS_LV2__");
427 Builder.defineMacro("__ELF__");
428 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000429 Builder.defineMacro("_ARCH_PPC64");
430 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000431 }
432public:
433 PS3PPUTargetInfo(const std::string& triple)
434 : OSTargetInfo<Target>(triple) {
435 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000436 this->LongWidth = this->LongAlign = 32;
437 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000438 this->IntMaxType = TargetInfo::SignedLongLong;
439 this->UIntMaxType = TargetInfo::UnsignedLongLong;
440 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000441 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000442 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000443 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000444 }
445};
446
447// FIXME: Need a real SPU target.
448// PS3 SPU Target
449template<typename Target>
450class PS3SPUTargetInfo : public OSTargetInfo<Target> {
451protected:
452 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000453 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000454 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000455 Builder.defineMacro("__SPU__");
456 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000457 }
458public:
459 PS3SPUTargetInfo(const std::string& triple)
460 : OSTargetInfo<Target>(triple) {
461 this->UserLabelPrefix = "";
462 }
463};
464
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000465// AuroraUX target
466template<typename Target>
467class AuroraUXTargetInfo : public OSTargetInfo<Target> {
468protected:
469 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 MacroBuilder &Builder) const {
471 DefineStd(Builder, "sun", Opts);
472 DefineStd(Builder, "unix", Opts);
473 Builder.defineMacro("__ELF__");
474 Builder.defineMacro("__svr4__");
475 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000476 }
477public:
478 AuroraUXTargetInfo(const std::string& triple)
479 : OSTargetInfo<Target>(triple) {
480 this->UserLabelPrefix = "";
481 this->WCharType = this->SignedLong;
482 // FIXME: WIntType should be SignedLong
483 }
484};
485
Torok Edwinb2b37c62009-06-30 17:10:35 +0000486// Solaris target
487template<typename Target>
488class SolarisTargetInfo : public OSTargetInfo<Target> {
489protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000490 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000491 MacroBuilder &Builder) const {
492 DefineStd(Builder, "sun", Opts);
493 DefineStd(Builder, "unix", Opts);
494 Builder.defineMacro("__ELF__");
495 Builder.defineMacro("__svr4__");
496 Builder.defineMacro("__SVR4");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000497 }
498public:
Mike Stump11289f42009-09-09 15:08:12 +0000499 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500 : OSTargetInfo<Target>(triple) {
501 this->UserLabelPrefix = "";
502 this->WCharType = this->SignedLong;
503 // FIXME: WIntType should be SignedLong
504 }
505};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000506
507// Windows target
508template<typename Target>
509class WindowsTargetInfo : public OSTargetInfo<Target> {
510protected:
511 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
512 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000513 Builder.defineMacro("_WIN32");
514 }
515 void getVisualStudioDefines(const LangOptions &Opts,
516 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000517 if (Opts.CPlusPlus) {
518 if (Opts.RTTI)
519 Builder.defineMacro("_CPPRTTI");
520
521 if (Opts.Exceptions)
522 Builder.defineMacro("_CPPUNWIND");
523 }
524
525 if (!Opts.CharIsSigned)
526 Builder.defineMacro("_CHAR_UNSIGNED");
527
528 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
529 // but it works for now.
530 if (Opts.POSIXThreads)
531 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000532
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000533 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000534 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000535
Francois Pichet0706d202011-09-17 17:15:52 +0000536 if (Opts.MicrosoftExt) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000537 Builder.defineMacro("_MSC_EXTENSIONS");
538
539 if (Opts.CPlusPlus0x) {
540 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
541 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
542 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
543 }
544 }
545
546 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000547 }
548
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000549public:
550 WindowsTargetInfo(const std::string &triple)
551 : OSTargetInfo<Target>(triple) {}
552};
553
Mike Stump11289f42009-09-09 15:08:12 +0000554} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000555
Chris Lattner09d98f52008-10-05 21:50:58 +0000556//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000557// Specific target implementations.
558//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000559
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000560namespace {
561// PPC abstract base class
562class PPCTargetInfo : public TargetInfo {
563 static const Builtin::Info BuiltinInfo[];
564 static const char * const GCCRegNames[];
565 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000566public:
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000567 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
568
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000569 virtual void getTargetBuiltins(const Builtin::Info *&Records,
570 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000571 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000572 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000573 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000574
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000575 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000576 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000577
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000578 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000579 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000580 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000581 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000582 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000583 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000584 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000585 default: return false;
586 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000587 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000588 case 'b': // Base register
589 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000590 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000591 break;
592 // FIXME: The following are added to allow parsing.
593 // I just took a guess at what the actions should be.
594 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000595 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000596 case 'v': // Altivec vector register
597 Info.setAllowsRegister();
598 break;
599 case 'w':
600 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000601 case 'd':// VSX vector register to hold vector double data
602 case 'f':// VSX vector register to hold vector float data
603 case 's':// VSX vector register to hold scalar float data
604 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000605 break;
606 default:
607 return false;
608 }
609 Info.setAllowsRegister();
610 Name++; // Skip over 'w'.
611 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000612 case 'h': // `MQ', `CTR', or `LINK' register
613 case 'q': // `MQ' register
614 case 'c': // `CTR' register
615 case 'l': // `LINK' register
616 case 'x': // `CR' register (condition register) number 0
617 case 'y': // `CR' register (condition register)
618 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000619 Info.setAllowsRegister();
620 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000621 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000622 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000623 // (use `L' instead for SImode constants)
624 case 'K': // Unsigned 16-bit constant
625 case 'L': // Signed 16-bit constant shifted left 16 bits
626 case 'M': // Constant larger than 31
627 case 'N': // Exact power of 2
628 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000629 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000630 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000631 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000632 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000633 break;
634 case 'm': // Memory operand. Note that on PowerPC targets, m can
635 // include addresses that update the base register. It
636 // is therefore only safe to use `m' in an asm statement
637 // if that asm statement accesses the operand exactly once.
638 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000639 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000640 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000641 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000642 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000643 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
644 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000645 // register to be updated.
646 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000647 if (Name[1] != 's')
648 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000649 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000650 // include any automodification of the base register. Unlike
651 // `m', this constraint can be used in asm statements that
652 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000653 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000654 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000655 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000656 break;
657 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000658 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000659 case 'Z': // Memory operand that is an indexed or indirect from a
660 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000661 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000662 Info.setAllowsMemory();
663 Info.setAllowsRegister();
664 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000665 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000666 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000667 // register (`p' is preferable for asm statements)
668 case 'S': // Constant suitable as a 64-bit mask operand
669 case 'T': // Constant suitable as a 32-bit mask operand
670 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000671 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000672 // instructions
673 case 'W': // Vector constant that does not require memory
674 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000675 break;
676 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000677 }
John Thompson07a61a42010-06-24 22:44:13 +0000678 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000679 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000680 virtual const char *getClobbers() const {
681 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000682 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000683};
Anders Carlssonf511f642007-11-27 04:11:28 +0000684
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000685const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000686#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000687#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000688 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000689#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000690};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000691
692
Chris Lattnerecd49032009-03-02 22:27:17 +0000693/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
694/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000695void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000696 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000697 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000698 Builder.defineMacro("__ppc__");
699 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000700 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000701 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000702 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000703 Builder.defineMacro("_ARCH_PPC64");
704 Builder.defineMacro("_LP64");
705 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000706 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000707 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000708 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000709 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000710 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000711
Chris Lattnerecd49032009-03-02 22:27:17 +0000712 // Target properties.
Joerg Sonnenberger870b3c52011-07-05 14:56:12 +0000713 if (getTriple().getOS() != llvm::Triple::NetBSD)
714 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000715 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000716
Chris Lattnerecd49032009-03-02 22:27:17 +0000717 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000718 Builder.defineMacro("__NATURAL_ALIGNMENT__");
719 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000720
Chris Lattnerecd49032009-03-02 22:27:17 +0000721 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000722 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000723
John Thompsone467e192009-11-19 17:18:50 +0000724 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000725 Builder.defineMacro("__VEC__", "10206");
726 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000727 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000728}
729
Chris Lattner17df24e2008-04-21 18:56:49 +0000730
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000731const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000732 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
733 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
734 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
735 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
736 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
737 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
738 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
739 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000740 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000741 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000742 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000743 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
744 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
745 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
746 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000747 "vrsave", "vscr",
748 "spe_acc", "spefscr",
749 "sfp"
750};
Chris Lattner10a5b382007-01-29 05:24:35 +0000751
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000752void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000753 unsigned &NumNames) const {
754 Names = GCCRegNames;
755 NumNames = llvm::array_lengthof(GCCRegNames);
756}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000757
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000758const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
759 // While some of these aliases do map to different registers
760 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000761 { { "0" }, "r0" },
762 { { "1"}, "r1" },
763 { { "2" }, "r2" },
764 { { "3" }, "r3" },
765 { { "4" }, "r4" },
766 { { "5" }, "r5" },
767 { { "6" }, "r6" },
768 { { "7" }, "r7" },
769 { { "8" }, "r8" },
770 { { "9" }, "r9" },
771 { { "10" }, "r10" },
772 { { "11" }, "r11" },
773 { { "12" }, "r12" },
774 { { "13" }, "r13" },
775 { { "14" }, "r14" },
776 { { "15" }, "r15" },
777 { { "16" }, "r16" },
778 { { "17" }, "r17" },
779 { { "18" }, "r18" },
780 { { "19" }, "r19" },
781 { { "20" }, "r20" },
782 { { "21" }, "r21" },
783 { { "22" }, "r22" },
784 { { "23" }, "r23" },
785 { { "24" }, "r24" },
786 { { "25" }, "r25" },
787 { { "26" }, "r26" },
788 { { "27" }, "r27" },
789 { { "28" }, "r28" },
790 { { "29" }, "r29" },
791 { { "30" }, "r30" },
792 { { "31" }, "r31" },
793 { { "fr0" }, "f0" },
794 { { "fr1" }, "f1" },
795 { { "fr2" }, "f2" },
796 { { "fr3" }, "f3" },
797 { { "fr4" }, "f4" },
798 { { "fr5" }, "f5" },
799 { { "fr6" }, "f6" },
800 { { "fr7" }, "f7" },
801 { { "fr8" }, "f8" },
802 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000803 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000804 { { "fr11" }, "f11" },
805 { { "fr12" }, "f12" },
806 { { "fr13" }, "f13" },
807 { { "fr14" }, "f14" },
808 { { "fr15" }, "f15" },
809 { { "fr16" }, "f16" },
810 { { "fr17" }, "f17" },
811 { { "fr18" }, "f18" },
812 { { "fr19" }, "f19" },
813 { { "fr20" }, "f20" },
814 { { "fr21" }, "f21" },
815 { { "fr22" }, "f22" },
816 { { "fr23" }, "f23" },
817 { { "fr24" }, "f24" },
818 { { "fr25" }, "f25" },
819 { { "fr26" }, "f26" },
820 { { "fr27" }, "f27" },
821 { { "fr28" }, "f28" },
822 { { "fr29" }, "f29" },
823 { { "fr30" }, "f30" },
824 { { "fr31" }, "f31" },
825 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000826};
827
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000828void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000829 unsigned &NumAliases) const {
830 Aliases = GCCRegAliases;
831 NumAliases = llvm::array_lengthof(GCCRegAliases);
832}
833} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000834
Chris Lattner5ba61f02006-10-14 07:39:34 +0000835namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000836class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000837public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000838 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000839 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +0000840 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000841
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +0000842 switch (getTriple().getOS()) {
843 case llvm::Triple::FreeBSD:
844 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +0000845 SizeType = UnsignedInt;
846 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +0000847 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +0000848 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +0000849 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000850 }
851
852 virtual const char *getVAListDeclaration() const {
853 // This is the ELF definition, and is overridden by the Darwin sub-target
854 return "typedef struct __va_list_tag {"
855 " unsigned char gpr;"
856 " unsigned char fpr;"
857 " unsigned short reserved;"
858 " void* overflow_arg_area;"
859 " void* reg_save_area;"
860 "} __builtin_va_list[1];";
Eli Friedman873f65a2008-08-21 00:13:15 +0000861 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000862};
863} // end anonymous namespace.
864
865namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000866class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000867public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000868 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000869 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000870 IntMaxType = SignedLong;
871 UIntMaxType = UnsignedLong;
872 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000873 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +0000874 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000875 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000876 virtual const char *getVAListDeclaration() const {
877 return "typedef char* __builtin_va_list;";
878 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000879};
880} // end anonymous namespace.
881
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000882
883namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +0000884class DarwinPPC32TargetInfo :
885 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000886public:
Roman Divacky965b0b72011-01-06 08:27:10 +0000887 DarwinPPC32TargetInfo(const std::string& triple)
888 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000889 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +0000890 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Anton Yartsev68d773c2012-01-17 22:40:00 +0000891 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +0000892 SuitableAlign = 128;
Anton Yartsev68d773c2012-01-17 22:40:00 +0000893 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
894 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +0000895 }
896 virtual const char *getVAListDeclaration() const {
897 return "typedef char* __builtin_va_list;";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000898 }
899};
900
901class DarwinPPC64TargetInfo :
902 public DarwinTargetInfo<PPC64TargetInfo> {
903public:
904 DarwinPPC64TargetInfo(const std::string& triple)
905 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
906 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +0000907 SuitableAlign = 128;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000908 }
909};
910} // end anonymous namespace.
911
Chris Lattner5ba61f02006-10-14 07:39:34 +0000912namespace {
Justin Holewinski794c2052011-10-03 17:28:37 +0000913 static const unsigned PTXAddrSpaceMap[] = {
914 0, // opencl_global
915 4, // opencl_local
916 1 // opencl_constant
917 };
Justin Holewinski514cce82011-04-20 19:34:15 +0000918 class PTXTargetInfo : public TargetInfo {
919 static const char * const GCCRegNames[];
920 static const Builtin::Info BuiltinInfo[];
Justin Holewinski0542df52011-09-22 17:57:40 +0000921 std::vector<llvm::StringRef> AvailableFeatures;
Justin Holewinski514cce82011-04-20 19:34:15 +0000922 public:
923 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +0000924 BigEndian = false;
Justin Holewinski514cce82011-04-20 19:34:15 +0000925 TLSSupported = false;
926 LongWidth = LongAlign = 64;
Justin Holewinski794c2052011-10-03 17:28:37 +0000927 AddrSpaceMap = &PTXAddrSpaceMap;
Justin Holewinski0542df52011-09-22 17:57:40 +0000928 // Define available target features
929 // These must be defined in sorted order!
930 AvailableFeatures.push_back("compute10");
931 AvailableFeatures.push_back("compute11");
932 AvailableFeatures.push_back("compute12");
933 AvailableFeatures.push_back("compute13");
934 AvailableFeatures.push_back("compute20");
935 AvailableFeatures.push_back("double");
936 AvailableFeatures.push_back("no-fma");
937 AvailableFeatures.push_back("ptx20");
938 AvailableFeatures.push_back("ptx21");
939 AvailableFeatures.push_back("ptx22");
940 AvailableFeatures.push_back("ptx23");
941 AvailableFeatures.push_back("sm10");
942 AvailableFeatures.push_back("sm11");
943 AvailableFeatures.push_back("sm12");
944 AvailableFeatures.push_back("sm13");
945 AvailableFeatures.push_back("sm20");
946 AvailableFeatures.push_back("sm21");
947 AvailableFeatures.push_back("sm22");
948 AvailableFeatures.push_back("sm23");
Justin Holewinski514cce82011-04-20 19:34:15 +0000949 }
950 virtual void getTargetDefines(const LangOptions &Opts,
951 MacroBuilder &Builder) const {
952 Builder.defineMacro("__PTX__");
953 }
954 virtual void getTargetBuiltins(const Builtin::Info *&Records,
955 unsigned &NumRecords) const {
956 Records = BuiltinInfo;
957 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
958 }
959
960 virtual void getGCCRegNames(const char * const *&Names,
961 unsigned &NumNames) const;
962 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
963 unsigned &NumAliases) const {
964 // No aliases.
965 Aliases = 0;
966 NumAliases = 0;
967 }
968 virtual bool validateAsmConstraint(const char *&Name,
969 TargetInfo::ConstraintInfo &info) const {
970 // FIXME: implement
971 return true;
972 }
973 virtual const char *getClobbers() const {
974 // FIXME: Is this really right?
975 return "";
976 }
977 virtual const char *getVAListDeclaration() const {
978 // FIXME: implement
979 return "typedef char* __builtin_va_list;";
980 }
Justin Holewinskiaa78b232011-09-15 12:13:38 +0000981
982 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
983 const std::string &Name,
984 bool Enabled) const;
Justin Holewinski514cce82011-04-20 19:34:15 +0000985 };
986
987 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000988#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski514cce82011-04-20 19:34:15 +0000989#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000990 ALL_LANGUAGES },
Justin Holewinski514cce82011-04-20 19:34:15 +0000991#include "clang/Basic/BuiltinsPTX.def"
992 };
993
994 const char * const PTXTargetInfo::GCCRegNames[] = {
995 "r0"
996 };
997
998 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
999 unsigned &NumNames) const {
1000 Names = GCCRegNames;
1001 NumNames = llvm::array_lengthof(GCCRegNames);
1002 }
1003
Justin Holewinskiaa78b232011-09-15 12:13:38 +00001004 bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1005 const std::string &Name,
1006 bool Enabled) const {
Justin Holewinski0542df52011-09-22 17:57:40 +00001007 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1008 Name)) {
1009 Features[Name] = Enabled;
1010 return true;
Justin Holewinskiaa78b232011-09-15 12:13:38 +00001011 } else {
Justin Holewinski0542df52011-09-22 17:57:40 +00001012 return false;
Justin Holewinskiaa78b232011-09-15 12:13:38 +00001013 }
Justin Holewinskiaa78b232011-09-15 12:13:38 +00001014 }
Justin Holewinski514cce82011-04-20 19:34:15 +00001015
1016 class PTX32TargetInfo : public PTXTargetInfo {
1017 public:
1018 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1019 PointerWidth = PointerAlign = 32;
1020 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1021 DescriptionString
1022 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
1023 }
1024 };
1025
1026 class PTX64TargetInfo : public PTXTargetInfo {
1027 public:
1028 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1029 PointerWidth = PointerAlign = 64;
1030 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1031 DescriptionString
1032 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
1033 }
1034 };
1035}
1036
1037namespace {
Chris Lattner5178f562010-03-06 21:21:27 +00001038// MBlaze abstract base class
1039class MBlazeTargetInfo : public TargetInfo {
1040 static const char * const GCCRegNames[];
1041 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1042
1043public:
1044 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +00001045 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +00001046 }
1047
1048 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1049 unsigned &NumRecords) const {
1050 // FIXME: Implement.
1051 Records = 0;
1052 NumRecords = 0;
1053 }
1054
1055 virtual void getTargetDefines(const LangOptions &Opts,
1056 MacroBuilder &Builder) const;
1057
1058 virtual const char *getVAListDeclaration() const {
1059 return "typedef char* __builtin_va_list;";
1060 }
1061 virtual const char *getTargetPrefix() const {
1062 return "mblaze";
1063 }
1064 virtual void getGCCRegNames(const char * const *&Names,
1065 unsigned &NumNames) const;
1066 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1067 unsigned &NumAliases) const;
1068 virtual bool validateAsmConstraint(const char *&Name,
1069 TargetInfo::ConstraintInfo &Info) const {
1070 switch (*Name) {
1071 default: return false;
1072 case 'O': // Zero
1073 return true;
1074 case 'b': // Base register
1075 case 'f': // Floating point register
1076 Info.setAllowsRegister();
1077 return true;
1078 }
1079 }
1080 virtual const char *getClobbers() const {
1081 return "";
1082 }
1083};
1084
1085/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1086/// #defines that are not tied to a specific subtarget.
1087void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1088 MacroBuilder &Builder) const {
1089 // Target identification.
1090 Builder.defineMacro("__microblaze__");
1091 Builder.defineMacro("_ARCH_MICROBLAZE");
1092 Builder.defineMacro("__MICROBLAZE__");
1093
1094 // Target properties.
1095 Builder.defineMacro("_BIG_ENDIAN");
1096 Builder.defineMacro("__BIG_ENDIAN__");
1097
1098 // Subtarget options.
1099 Builder.defineMacro("__REGISTER_PREFIX__", "");
1100}
1101
1102
1103const char * const MBlazeTargetInfo::GCCRegNames[] = {
1104 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1105 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1106 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1107 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1108 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1109 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1110 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1111 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1112 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1113 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1114};
1115
1116void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1117 unsigned &NumNames) const {
1118 Names = GCCRegNames;
1119 NumNames = llvm::array_lengthof(GCCRegNames);
1120}
1121
1122const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1123 { {"f0"}, "r0" },
1124 { {"f1"}, "r1" },
1125 { {"f2"}, "r2" },
1126 { {"f3"}, "r3" },
1127 { {"f4"}, "r4" },
1128 { {"f5"}, "r5" },
1129 { {"f6"}, "r6" },
1130 { {"f7"}, "r7" },
1131 { {"f8"}, "r8" },
1132 { {"f9"}, "r9" },
1133 { {"f10"}, "r10" },
1134 { {"f11"}, "r11" },
1135 { {"f12"}, "r12" },
1136 { {"f13"}, "r13" },
1137 { {"f14"}, "r14" },
1138 { {"f15"}, "r15" },
1139 { {"f16"}, "r16" },
1140 { {"f17"}, "r17" },
1141 { {"f18"}, "r18" },
1142 { {"f19"}, "r19" },
1143 { {"f20"}, "r20" },
1144 { {"f21"}, "r21" },
1145 { {"f22"}, "r22" },
1146 { {"f23"}, "r23" },
1147 { {"f24"}, "r24" },
1148 { {"f25"}, "r25" },
1149 { {"f26"}, "r26" },
1150 { {"f27"}, "r27" },
1151 { {"f28"}, "r28" },
1152 { {"f29"}, "r29" },
1153 { {"f30"}, "r30" },
1154 { {"f31"}, "r31" },
1155};
1156
1157void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1158 unsigned &NumAliases) const {
1159 Aliases = GCCRegAliases;
1160 NumAliases = llvm::array_lengthof(GCCRegAliases);
1161}
1162} // end anonymous namespace.
1163
1164namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001165// Namespace for x86 abstract base class
1166const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001167#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001168#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001169 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001170#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001171};
Eli Friedmanb5366062008-05-20 14:21:01 +00001172
Nuno Lopescfca1f02009-12-23 17:49:57 +00001173static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001174 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1175 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001176 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001177 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1178 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1179 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001180 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001181 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1182 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001183};
1184
Eric Christophercdd36352011-06-21 00:05:20 +00001185const TargetInfo::AddlRegName AddlRegNames[] = {
1186 { { "al", "ah", "eax", "rax" }, 0 },
1187 { { "bl", "bh", "ebx", "rbx" }, 3 },
1188 { { "cl", "ch", "ecx", "rcx" }, 2 },
1189 { { "dl", "dh", "edx", "rdx" }, 1 },
1190 { { "esi", "rsi" }, 4 },
1191 { { "edi", "rdi" }, 5 },
1192 { { "esp", "rsp" }, 7 },
1193 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001194};
1195
1196// X86 target abstract base class; x86-32 and x86-64 are very close, so
1197// most of the implementation can be shared.
1198class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001199 enum X86SSEEnum {
Craig Topper23b92192012-01-09 09:19:09 +00001200 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner96e43572009-03-02 22:40:39 +00001201 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001202 enum MMX3DNowEnum {
1203 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1204 } MMX3DNowLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001205
Eric Christophere1ddaf92010-04-02 23:50:19 +00001206 bool HasAES;
Craig Topper22967d42011-12-25 05:06:45 +00001207 bool HasLZCNT;
1208 bool HasBMI;
1209 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001210 bool HasPOPCNT;
Craig Topperffdb46c2011-12-30 07:33:42 +00001211 bool HasFMA4;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001212
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001213 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1214 ///
1215 /// Each enumeration represents a particular CPU supported by Clang. These
1216 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1217 enum CPUKind {
1218 CK_Generic,
1219
1220 /// \name i386
1221 /// i386-generation processors.
1222 //@{
1223 CK_i386,
1224 //@}
1225
1226 /// \name i486
1227 /// i486-generation processors.
1228 //@{
1229 CK_i486,
1230 CK_WinChipC6,
1231 CK_WinChip2,
1232 CK_C3,
1233 //@}
1234
1235 /// \name i586
1236 /// i586-generation processors, P5 microarchitecture based.
1237 //@{
1238 CK_i586,
1239 CK_Pentium,
1240 CK_PentiumMMX,
1241 //@}
1242
1243 /// \name i686
1244 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1245 //@{
1246 CK_i686,
1247 CK_PentiumPro,
1248 CK_Pentium2,
1249 CK_Pentium3,
1250 CK_Pentium3M,
1251 CK_PentiumM,
1252 CK_C3_2,
1253
1254 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1255 /// Clang however has some logic to suport this.
1256 // FIXME: Warn, deprecate, and potentially remove this.
1257 CK_Yonah,
1258 //@}
1259
1260 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001261 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001262 //@{
1263 CK_Pentium4,
1264 CK_Pentium4M,
1265 CK_Prescott,
1266 CK_Nocona,
1267 //@}
1268
1269 /// \name Core
1270 /// Core microarchitecture based processors.
1271 //@{
1272 CK_Core2,
1273
1274 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1275 /// codename which GCC no longer accepts as an option to -march, but Clang
1276 /// has some logic for recognizing it.
1277 // FIXME: Warn, deprecate, and potentially remove this.
1278 CK_Penryn,
1279 //@}
1280
1281 /// \name Atom
1282 /// Atom processors
1283 //@{
1284 CK_Atom,
1285 //@}
1286
1287 /// \name Nehalem
1288 /// Nehalem microarchitecture based processors.
1289 //@{
1290 CK_Corei7,
1291 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001292 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001293 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001294 //@}
1295
1296 /// \name K6
1297 /// K6 architecture processors.
1298 //@{
1299 CK_K6,
1300 CK_K6_2,
1301 CK_K6_3,
1302 //@}
1303
1304 /// \name K7
1305 /// K7 architecture processors.
1306 //@{
1307 CK_Athlon,
1308 CK_AthlonThunderbird,
1309 CK_Athlon4,
1310 CK_AthlonXP,
1311 CK_AthlonMP,
1312 //@}
1313
1314 /// \name K8
1315 /// K8 architecture processors.
1316 //@{
1317 CK_Athlon64,
1318 CK_Athlon64SSE3,
1319 CK_AthlonFX,
1320 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001321 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001322 CK_Opteron,
1323 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001324 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001325 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001326
Benjamin Kramer569f2152012-01-10 11:50:18 +00001327 /// \name Bobcat
1328 /// Bobcat architecture processors.
1329 //@{
1330 CK_BTVER1,
1331 //@}
1332
1333 /// \name Bulldozer
1334 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001335 //@{
1336 CK_BDVER1,
1337 CK_BDVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001338 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001339
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001340 /// This specification is deprecated and will be removed in the future.
1341 /// Users should prefer \see CK_K8.
1342 // FIXME: Warn on this when the CPU is set to it.
1343 CK_x86_64,
1344 //@}
1345
1346 /// \name Geode
1347 /// Geode processors.
1348 //@{
1349 CK_Geode
1350 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001351 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001352
Eli Friedman3fd920a2008-08-20 02:34:37 +00001353public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001354 X86TargetInfo(const std::string& triple)
Eli Friedman33465822011-07-08 23:31:17 +00001355 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Craig Topper23b92192012-01-09 09:19:09 +00001356 HasAES(false), HasLZCNT(false), HasBMI(false), HasBMI2(false),
1357 HasPOPCNT(false), HasFMA4(false), CPU(CK_Generic) {
Eli Friedman803acb32011-12-22 03:51:45 +00001358 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001359 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001360 }
Benjamin Kramercf501472011-12-28 15:47:06 +00001361 virtual unsigned getFloatEvalMethod() const {
1362 // X87 evaluates with 80 bits "long double" precision.
1363 return SSELevel == NoSSE ? 2 : 0;
1364 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001365 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1366 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001367 Records = BuiltinInfo;
1368 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001369 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001370 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001371 unsigned &NumNames) const {
1372 Names = GCCRegNames;
1373 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001374 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001375 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001376 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001377 Aliases = 0;
1378 NumAliases = 0;
1379 }
1380 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1381 unsigned &NumNames) const {
1382 Names = AddlRegNames;
1383 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001384 }
Anders Carlsson58436352009-02-28 17:11:49 +00001385 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001386 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001387 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001388 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001389 return "~{dirflag},~{fpsr},~{flags}";
1390 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001391 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001392 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001393 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1394 const std::string &Name,
1395 bool Enabled) const;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001396 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001397 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedman33465822011-07-08 23:31:17 +00001398 virtual const char* getABI() const {
Craig Topper23b92192012-01-09 09:19:09 +00001399 if (PointerWidth == 64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001400 return "avx";
1401 else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1402 return "no-mmx";
1403 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001404 }
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001405 virtual bool setCPU(const std::string &Name) {
Chandler Carruth212334f2011-09-28 08:55:37 +00001406 CPU = llvm::StringSwitch<CPUKind>(Name)
1407 .Case("i386", CK_i386)
1408 .Case("i486", CK_i486)
1409 .Case("winchip-c6", CK_WinChipC6)
1410 .Case("winchip2", CK_WinChip2)
1411 .Case("c3", CK_C3)
1412 .Case("i586", CK_i586)
1413 .Case("pentium", CK_Pentium)
1414 .Case("pentium-mmx", CK_PentiumMMX)
1415 .Case("i686", CK_i686)
1416 .Case("pentiumpro", CK_PentiumPro)
1417 .Case("pentium2", CK_Pentium2)
1418 .Case("pentium3", CK_Pentium3)
1419 .Case("pentium3m", CK_Pentium3M)
1420 .Case("pentium-m", CK_PentiumM)
1421 .Case("c3-2", CK_C3_2)
1422 .Case("yonah", CK_Yonah)
1423 .Case("pentium4", CK_Pentium4)
1424 .Case("pentium4m", CK_Pentium4M)
1425 .Case("prescott", CK_Prescott)
1426 .Case("nocona", CK_Nocona)
1427 .Case("core2", CK_Core2)
1428 .Case("penryn", CK_Penryn)
1429 .Case("atom", CK_Atom)
1430 .Case("corei7", CK_Corei7)
1431 .Case("corei7-avx", CK_Corei7AVX)
1432 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001433 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruth212334f2011-09-28 08:55:37 +00001434 .Case("k6", CK_K6)
1435 .Case("k6-2", CK_K6_2)
1436 .Case("k6-3", CK_K6_3)
1437 .Case("athlon", CK_Athlon)
1438 .Case("athlon-tbird", CK_AthlonThunderbird)
1439 .Case("athlon-4", CK_Athlon4)
1440 .Case("athlon-xp", CK_AthlonXP)
1441 .Case("athlon-mp", CK_AthlonMP)
1442 .Case("athlon64", CK_Athlon64)
1443 .Case("athlon64-sse3", CK_Athlon64SSE3)
1444 .Case("athlon-fx", CK_AthlonFX)
1445 .Case("k8", CK_K8)
1446 .Case("k8-sse3", CK_K8SSE3)
1447 .Case("opteron", CK_Opteron)
1448 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001449 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001450 .Case("btver1", CK_BTVER1)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001451 .Case("bdver1", CK_BDVER1)
1452 .Case("bdver2", CK_BDVER2)
Chandler Carruth212334f2011-09-28 08:55:37 +00001453 .Case("x86-64", CK_x86_64)
1454 .Case("geode", CK_Geode)
1455 .Default(CK_Generic);
1456
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001457 // Perform any per-CPU checks necessary to determine if this CPU is
1458 // acceptable.
1459 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1460 // invalid without explaining *why*.
1461 switch (CPU) {
1462 case CK_Generic:
1463 // No processor selected!
1464 return false;
1465
1466 case CK_i386:
1467 case CK_i486:
1468 case CK_WinChipC6:
1469 case CK_WinChip2:
1470 case CK_C3:
1471 case CK_i586:
1472 case CK_Pentium:
1473 case CK_PentiumMMX:
1474 case CK_i686:
1475 case CK_PentiumPro:
1476 case CK_Pentium2:
1477 case CK_Pentium3:
1478 case CK_Pentium3M:
1479 case CK_PentiumM:
1480 case CK_Yonah:
1481 case CK_C3_2:
1482 case CK_Pentium4:
1483 case CK_Pentium4M:
1484 case CK_Prescott:
1485 case CK_K6:
1486 case CK_K6_2:
1487 case CK_K6_3:
1488 case CK_Athlon:
1489 case CK_AthlonThunderbird:
1490 case CK_Athlon4:
1491 case CK_AthlonXP:
1492 case CK_AthlonMP:
1493 case CK_Geode:
1494 // Only accept certain architectures when compiling in 32-bit mode.
1495 if (PointerWidth != 32)
1496 return false;
1497
1498 // Fallthrough
1499 case CK_Nocona:
1500 case CK_Core2:
1501 case CK_Penryn:
1502 case CK_Atom:
1503 case CK_Corei7:
1504 case CK_Corei7AVX:
1505 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001506 case CK_CoreAVX2:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001507 case CK_Athlon64:
1508 case CK_Athlon64SSE3:
1509 case CK_AthlonFX:
1510 case CK_K8:
1511 case CK_K8SSE3:
1512 case CK_Opteron:
1513 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001514 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001515 case CK_BTVER1:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001516 case CK_BDVER1:
1517 case CK_BDVER2:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001518 case CK_x86_64:
1519 return true;
1520 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001521 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001522 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001523};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001524
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001525void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001526 // FIXME: This should not be here.
1527 Features["3dnow"] = false;
1528 Features["3dnowa"] = false;
1529 Features["mmx"] = false;
1530 Features["sse"] = false;
1531 Features["sse2"] = false;
1532 Features["sse3"] = false;
1533 Features["ssse3"] = false;
1534 Features["sse41"] = false;
1535 Features["sse42"] = false;
Roman Divackyce253d82011-10-30 13:47:56 +00001536 Features["sse4a"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001537 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001538 Features["avx"] = false;
Craig Topper865fff52011-12-17 19:55:21 +00001539 Features["avx2"] = false;
Craig Topper22967d42011-12-25 05:06:45 +00001540 Features["lzcnt"] = false;
1541 Features["bmi"] = false;
1542 Features["bmi2"] = false;
Craig Topper1de83482011-12-29 16:10:46 +00001543 Features["popcnt"] = false;
Craig Topperffdb46c2011-12-30 07:33:42 +00001544 Features["fma4"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001545
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001546 // FIXME: This *really* should not be here.
1547
1548 // X86_64 always has SSE2.
1549 if (PointerWidth == 64)
1550 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1551
Chandler Carruth212334f2011-09-28 08:55:37 +00001552 switch (CPU) {
1553 case CK_Generic:
1554 case CK_i386:
1555 case CK_i486:
1556 case CK_i586:
1557 case CK_Pentium:
1558 case CK_i686:
1559 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00001560 break;
1561 case CK_PentiumMMX:
1562 case CK_Pentium2:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001563 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001564 break;
1565 case CK_Pentium3:
1566 case CK_Pentium3M:
Eli Friedman33465822011-07-08 23:31:17 +00001567 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001568 setFeatureEnabled(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001569 break;
1570 case CK_PentiumM:
1571 case CK_Pentium4:
1572 case CK_Pentium4M:
1573 case CK_x86_64:
Eli Friedman33465822011-07-08 23:31:17 +00001574 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001575 setFeatureEnabled(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001576 break;
1577 case CK_Yonah:
1578 case CK_Prescott:
1579 case CK_Nocona:
Eli Friedman33465822011-07-08 23:31:17 +00001580 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001581 setFeatureEnabled(Features, "sse3", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001582 break;
1583 case CK_Core2:
Eli Friedman33465822011-07-08 23:31:17 +00001584 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001585 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001586 break;
1587 case CK_Penryn:
Eli Friedman33465822011-07-08 23:31:17 +00001588 setFeatureEnabled(Features, "mmx", true);
Benjamin Kramer6dced3b2012-01-04 14:36:57 +00001589 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001590 break;
1591 case CK_Atom:
Eli Friedman33465822011-07-08 23:31:17 +00001592 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00001593 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001594 break;
1595 case CK_Corei7:
Eli Friedman33465822011-07-08 23:31:17 +00001596 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001597 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001598 setFeatureEnabled(Features, "aes", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001599 break;
1600 case CK_Corei7AVX:
1601 case CK_CoreAVXi:
Eli Friedman33465822011-07-08 23:31:17 +00001602 setFeatureEnabled(Features, "mmx", true);
Roman Divacky27ec14f2011-04-05 20:32:44 +00001603 setFeatureEnabled(Features, "sse4", true);
1604 setFeatureEnabled(Features, "aes", true);
Bruno Cardoso Lopes34728382011-07-11 23:33:46 +00001605 //setFeatureEnabled(Features, "avx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001606 break;
Craig Topper865fff52011-12-17 19:55:21 +00001607 case CK_CoreAVX2:
1608 setFeatureEnabled(Features, "mmx", true);
1609 setFeatureEnabled(Features, "sse4", true);
1610 setFeatureEnabled(Features, "aes", true);
Craig Topper22967d42011-12-25 05:06:45 +00001611 setFeatureEnabled(Features, "lzcnt", true);
1612 setFeatureEnabled(Features, "bmi", true);
1613 setFeatureEnabled(Features, "bmi2", true);
Craig Topper865fff52011-12-17 19:55:21 +00001614 //setFeatureEnabled(Features, "avx2", true);
1615 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001616 case CK_K6:
1617 case CK_WinChipC6:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001618 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001619 break;
1620 case CK_K6_2:
1621 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00001622 case CK_WinChip2:
1623 case CK_C3:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001624 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001625 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00001626 case CK_Athlon:
1627 case CK_AthlonThunderbird:
1628 case CK_Geode:
1629 setFeatureEnabled(Features, "3dnowa", true);
1630 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001631 case CK_Athlon4:
1632 case CK_AthlonXP:
1633 case CK_AthlonMP:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001634 setFeatureEnabled(Features, "sse", true);
1635 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001636 break;
1637 case CK_K8:
1638 case CK_Opteron:
1639 case CK_Athlon64:
1640 case CK_AthlonFX:
Mike Stump11289f42009-09-09 15:08:12 +00001641 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001642 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001643 break;
1644 case CK_K8SSE3:
1645 case CK_OpteronSSE3:
1646 case CK_Athlon64SSE3:
Roman Divackyce253d82011-10-30 13:47:56 +00001647 setFeatureEnabled(Features, "sse3", true);
1648 setFeatureEnabled(Features, "3dnowa", true);
1649 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00001650 case CK_AMDFAM10:
Roman Divackydacbfe42010-12-29 13:28:29 +00001651 setFeatureEnabled(Features, "sse3", true);
Roman Divackyce253d82011-10-30 13:47:56 +00001652 setFeatureEnabled(Features, "sse4a", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001653 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001654 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00001655 case CK_BTVER1:
1656 setFeatureEnabled(Features, "ssse3", true);
1657 setFeatureEnabled(Features, "sse4a", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001658 case CK_BDVER1:
1659 case CK_BDVER2:
1660 setFeatureEnabled(Features, "sse4", true);
1661 setFeatureEnabled(Features, "sse4a", true);
1662 setFeatureEnabled(Features, "aes", true);
1663 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001664 case CK_C3_2:
Eli Friedman33465822011-07-08 23:31:17 +00001665 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001666 setFeatureEnabled(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001667 break;
Eli Friedman33465822011-07-08 23:31:17 +00001668 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001669}
1670
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001671bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001672 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001673 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001674 // FIXME: This *really* should not be here. We need some way of translating
1675 // options into llvm subtarget features.
1676 if (!Features.count(Name) &&
1677 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001678 return false;
1679
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001680 // FIXME: this should probably use a switch with fall through.
1681
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001682 if (Enabled) {
1683 if (Name == "mmx")
1684 Features["mmx"] = true;
1685 else if (Name == "sse")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001686 Features["mmx"] = Features["sse"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001687 else if (Name == "sse2")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001688 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001689 else if (Name == "sse3")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001690 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1691 true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001692 else if (Name == "ssse3")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001693 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001694 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001695 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001696 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper1de83482011-12-29 16:10:46 +00001697 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1698 Features["popcnt"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001699 else if (Name == "sse4.1")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001700 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopher399ffa52010-03-04 02:26:37 +00001701 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001702 else if (Name == "3dnow")
Eli Friedman33465822011-07-08 23:31:17 +00001703 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001704 else if (Name == "3dnowa")
Eli Friedman33465822011-07-08 23:31:17 +00001705 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001706 else if (Name == "aes")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001707 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001708 else if (Name == "avx")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001709 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1710 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper1de83482011-12-29 16:10:46 +00001711 Features["popcnt"] = Features["avx"] = true;
Craig Topper865fff52011-12-17 19:55:21 +00001712 else if (Name == "avx2")
1713 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1714 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper1de83482011-12-29 16:10:46 +00001715 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topperffdb46c2011-12-30 07:33:42 +00001716 else if (Name == "fma4")
1717 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1718 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1719 Features["popcnt"] = Features["avx"] = Features["fma4"] = true;
Roman Divackyce253d82011-10-30 13:47:56 +00001720 else if (Name == "sse4a")
Craig Topperffdb46c2011-12-30 07:33:42 +00001721 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Benjamin Krameredbc59a2012-01-10 11:50:13 +00001722 Features["lzcnt"] = Features["popcnt"] = Features["sse4a"] = true;
Craig Topper22967d42011-12-25 05:06:45 +00001723 else if (Name == "lzcnt")
1724 Features["lzcnt"] = true;
1725 else if (Name == "bmi")
1726 Features["bmi"] = true;
1727 else if (Name == "bmi2")
1728 Features["bmi2"] = true;
Craig Topper1de83482011-12-29 16:10:46 +00001729 else if (Name == "popcnt")
1730 Features["popcnt"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001731 } else {
1732 if (Name == "mmx")
Eli Friedman33465822011-07-08 23:31:17 +00001733 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001734 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001735 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topperffdb46c2011-12-30 07:33:42 +00001736 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1737 Features["sse4a"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001738 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001739 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Topperffdb46c2011-12-30 07:33:42 +00001740 Features["sse41"] = Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001741 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001742 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topperffdb46c2011-12-30 07:33:42 +00001743 Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001744 else if (Name == "ssse3")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001745 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencera9e41172011-04-17 19:22:03 +00001746 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001747 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001748 else if (Name == "sse4.2")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001749 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001750 else if (Name == "3dnow")
1751 Features["3dnow"] = Features["3dnowa"] = false;
1752 else if (Name == "3dnowa")
1753 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001754 else if (Name == "aes")
1755 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001756 else if (Name == "avx")
Craig Topperffdb46c2011-12-30 07:33:42 +00001757 Features["avx"] = Features["avx2"] = Features["fma4"] = false;
Craig Topper865fff52011-12-17 19:55:21 +00001758 else if (Name == "avx2")
1759 Features["avx2"] = false;
Roman Divackyce253d82011-10-30 13:47:56 +00001760 else if (Name == "sse4a")
1761 Features["sse4a"] = false;
Craig Topper22967d42011-12-25 05:06:45 +00001762 else if (Name == "lzcnt")
1763 Features["lzcnt"] = false;
1764 else if (Name == "bmi")
1765 Features["bmi"] = false;
1766 else if (Name == "bmi2")
1767 Features["bmi2"] = false;
Craig Topper1de83482011-12-29 16:10:46 +00001768 else if (Name == "popcnt")
1769 Features["popcnt"] = false;
Craig Topperffdb46c2011-12-30 07:33:42 +00001770 else if (Name == "fma4")
1771 Features["fma4"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001772 }
1773
1774 return true;
1775}
1776
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001777/// HandleTargetOptions - Perform initialization based on the user
1778/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001779void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001780 // Remember the maximum enabled sselevel.
1781 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1782 // Ignore disabled features.
1783 if (Features[i][0] == '-')
1784 continue;
1785
Eric Christophere1ddaf92010-04-02 23:50:19 +00001786 if (Features[i].substr(1) == "aes") {
1787 HasAES = true;
1788 continue;
1789 }
1790
Craig Topper22967d42011-12-25 05:06:45 +00001791 if (Features[i].substr(1) == "lzcnt") {
1792 HasLZCNT = true;
1793 continue;
1794 }
1795
1796 if (Features[i].substr(1) == "bmi") {
1797 HasBMI = true;
1798 continue;
1799 }
1800
1801 if (Features[i].substr(1) == "bmi2") {
1802 HasBMI2 = true;
1803 continue;
1804 }
1805
Craig Topper1de83482011-12-29 16:10:46 +00001806 if (Features[i].substr(1) == "popcnt") {
1807 HasPOPCNT = true;
1808 continue;
1809 }
1810
Craig Topperffdb46c2011-12-30 07:33:42 +00001811 if (Features[i].substr(1) == "fma4") {
1812 HasFMA4 = true;
1813 continue;
1814 }
1815
Daniel Dunbar979586e2009-11-11 09:38:56 +00001816 assert(Features[i][0] == '+' && "Invalid target feature!");
1817 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
Craig Topper23b92192012-01-09 09:19:09 +00001818 .Case("avx2", AVX2)
1819 .Case("avx", AVX)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001820 .Case("sse42", SSE42)
1821 .Case("sse41", SSE41)
1822 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001823 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001824 .Case("sse2", SSE2)
1825 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00001826 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001827 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001828
Eli Friedman33465822011-07-08 23:31:17 +00001829 MMX3DNowEnum ThreeDNowLevel =
1830 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
Anders Carlssone437c682010-01-27 03:47:49 +00001831 .Case("3dnowa", AMD3DNowAthlon)
1832 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00001833 .Case("mmx", MMX)
1834 .Default(NoMMX3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001835
Eli Friedman33465822011-07-08 23:31:17 +00001836 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001837 }
Eli Friedman33465822011-07-08 23:31:17 +00001838
1839 // Don't tell the backend if we're turning off mmx; it will end up disabling
1840 // SSE, which we don't want.
1841 std::vector<std::string>::iterator it;
1842 it = std::find(Features.begin(), Features.end(), "-mmx");
1843 if (it != Features.end())
1844 Features.erase(it);
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001845}
Chris Lattnerecd49032009-03-02 22:27:17 +00001846
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001847/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1848/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001849void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001850 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001851 // Target identification.
1852 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001853 Builder.defineMacro("_LP64");
1854 Builder.defineMacro("__LP64__");
1855 Builder.defineMacro("__amd64__");
1856 Builder.defineMacro("__amd64");
1857 Builder.defineMacro("__x86_64");
1858 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001859 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001860 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001861 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001862
Chris Lattnerecd49032009-03-02 22:27:17 +00001863 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001864 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
1865 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00001866 switch (CPU) {
1867 case CK_Generic:
1868 break;
1869 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001870 // The rest are coming from the i386 define above.
1871 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00001872 break;
1873 case CK_i486:
1874 case CK_WinChipC6:
1875 case CK_WinChip2:
1876 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001877 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00001878 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00001879 case CK_PentiumMMX:
1880 Builder.defineMacro("__pentium_mmx__");
1881 Builder.defineMacro("__tune_pentium_mmx__");
1882 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00001883 case CK_i586:
1884 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001885 defineCPUMacros(Builder, "i586");
1886 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00001887 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001888 case CK_Pentium3:
1889 case CK_Pentium3M:
1890 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00001891 Builder.defineMacro("__tune_pentium3__");
1892 // Fallthrough
1893 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00001894 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00001895 Builder.defineMacro("__tune_pentium2__");
1896 // Fallthrough
1897 case CK_PentiumPro:
1898 Builder.defineMacro("__tune_i686__");
1899 Builder.defineMacro("__tune_pentiumpro__");
1900 // Fallthrough
1901 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001902 Builder.defineMacro("__i686");
1903 Builder.defineMacro("__i686__");
1904 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
1905 Builder.defineMacro("__pentiumpro");
1906 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00001907 break;
1908 case CK_Pentium4:
1909 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001910 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00001911 break;
1912 case CK_Yonah:
1913 case CK_Prescott:
1914 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001915 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00001916 break;
1917 case CK_Core2:
1918 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001919 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00001920 break;
1921 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001922 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00001923 break;
1924 case CK_Corei7:
1925 case CK_Corei7AVX:
1926 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001927 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001928 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00001929 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001930 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00001931 Builder.defineMacro("__k6_2__");
1932 Builder.defineMacro("__tune_k6_2__");
1933 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00001934 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00001935 if (CPU != CK_K6_2) { // In case of fallthrough
1936 // FIXME: GCC may be enabling these in cases where some other k6
1937 // architecture is specified but -m3dnow is explicitly provided. The
1938 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001939 Builder.defineMacro("__k6_3__");
1940 Builder.defineMacro("__tune_k6_3__");
1941 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00001942 // Fallthrough
1943 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001944 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00001945 break;
1946 case CK_Athlon:
1947 case CK_AthlonThunderbird:
1948 case CK_Athlon4:
1949 case CK_AthlonXP:
1950 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001951 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00001952 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001953 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00001954 Builder.defineMacro("__tune_athlon_sse__");
1955 }
Chandler Carruth212334f2011-09-28 08:55:37 +00001956 break;
1957 case CK_K8:
1958 case CK_K8SSE3:
1959 case CK_x86_64:
1960 case CK_Opteron:
1961 case CK_OpteronSSE3:
1962 case CK_Athlon64:
1963 case CK_Athlon64SSE3:
1964 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001965 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00001966 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00001967 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001968 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00001969 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00001970 case CK_BTVER1:
1971 defineCPUMacros(Builder, "btver1");
1972 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001973 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001974 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001975 break;
1976 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001977 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001978 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001979 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001980 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00001981 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001982 }
Chris Lattner96e43572009-03-02 22:40:39 +00001983
Chandler Carruth3f7ed952011-09-28 09:54:07 +00001984 // Target properties.
1985 Builder.defineMacro("__LITTLE_ENDIAN__");
1986 Builder.defineMacro("__REGISTER_PREFIX__", "");
1987
Chris Lattner6df41af2009-04-19 17:32:33 +00001988 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1989 // functions in glibc header files that use FP Stack inline asm which the
1990 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001991 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001992
Chandler Carruth3f7ed952011-09-28 09:54:07 +00001993 if (HasAES)
1994 Builder.defineMacro("__AES__");
1995
Craig Topper22967d42011-12-25 05:06:45 +00001996 if (HasLZCNT)
1997 Builder.defineMacro("__LZCNT__");
1998
1999 if (HasBMI)
2000 Builder.defineMacro("__BMI__");
2001
2002 if (HasBMI2)
2003 Builder.defineMacro("__BMI2__");
2004
Craig Topper1de83482011-12-29 16:10:46 +00002005 if (HasPOPCNT)
2006 Builder.defineMacro("__POPCNT__");
2007
Craig Topperffdb46c2011-12-30 07:33:42 +00002008 if (HasFMA4)
2009 Builder.defineMacro("__FMA4__");
2010
Chris Lattner96e43572009-03-02 22:40:39 +00002011 // Each case falls through to the previous one here.
2012 switch (SSELevel) {
Craig Topper23b92192012-01-09 09:19:09 +00002013 case AVX2:
2014 Builder.defineMacro("__AVX2__");
2015 case AVX:
2016 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002017 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002018 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002019 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002020 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002021 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002022 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002023 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002024 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002025 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002026 Builder.defineMacro("__SSE2__");
2027 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002028 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002029 Builder.defineMacro("__SSE__");
2030 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002031 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002032 break;
2033 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002034
Francois Pichet0706d202011-09-17 17:15:52 +00002035 if (Opts.MicrosoftExt && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002036 switch (SSELevel) {
Craig Topper23b92192012-01-09 09:19:09 +00002037 case AVX2:
2038 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002039 case SSE42:
2040 case SSE41:
2041 case SSSE3:
2042 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002043 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002044 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002045 break;
2046 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002047 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002048 break;
2049 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002050 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002051 }
2052 }
2053
Anders Carlssone437c682010-01-27 03:47:49 +00002054 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002055 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002056 case AMD3DNowAthlon:
2057 Builder.defineMacro("__3dNOW_A__");
2058 case AMD3DNow:
2059 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002060 case MMX:
2061 Builder.defineMacro("__MMX__");
2062 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002063 break;
2064 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002065}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002066
2067
Eli Friedman3fd920a2008-08-20 02:34:37 +00002068bool
Anders Carlsson58436352009-02-28 17:11:49 +00002069X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002070 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002071 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002072 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002073 case 'Y': // first letter of a pair:
2074 switch (*(Name+1)) {
2075 default: return false;
2076 case '0': // First SSE register.
2077 case 't': // Any SSE register, when SSE2 is enabled.
2078 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2079 case 'm': // any MMX register, when inter-unit moves enabled.
2080 break; // falls through to setAllowsRegister.
2081 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002082 case 'a': // eax.
2083 case 'b': // ebx.
2084 case 'c': // ecx.
2085 case 'd': // edx.
2086 case 'S': // esi.
2087 case 'D': // edi.
2088 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002089 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002090 case 't': // top of floating point stack.
2091 case 'u': // second from top of floating point stack.
2092 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002093 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002094 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002095 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002096 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2097 case 'l': // "Index" registers: any general register that can be used as an
2098 // index in a base+index memory access.
2099 Info.setAllowsRegister();
2100 return true;
2101 case 'C': // SSE floating point constant.
2102 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002103 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002104 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002105 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002106 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002107 return true;
2108 }
2109}
2110
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002111
Eli Friedman3fd920a2008-08-20 02:34:37 +00002112std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002113X86TargetInfo::convertConstraint(const char *&Constraint) const {
2114 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002115 case 'a': return std::string("{ax}");
2116 case 'b': return std::string("{bx}");
2117 case 'c': return std::string("{cx}");
2118 case 'd': return std::string("{dx}");
2119 case 'S': return std::string("{si}");
2120 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002121 case 'p': // address
2122 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002123 case 't': // top of floating point stack.
2124 return std::string("{st}");
2125 case 'u': // second from top of floating point stack.
2126 return std::string("{st(1)}"); // second from top of floating point stack.
2127 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002128 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002129 }
2130}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002131} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002132
2133namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002134// X86-32 generic target
2135class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002136public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00002137 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2138 DoubleAlign = LongLongAlign = 32;
2139 LongDoubleWidth = 96;
2140 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002141 SuitableAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +00002142 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2143 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames4f4aa1a2011-10-11 00:52:51 +00002144 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002145 SizeType = UnsignedInt;
2146 PtrDiffType = SignedInt;
2147 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002148 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002149
2150 // Use fpret for all types.
2151 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2152 (1 << TargetInfo::Double) |
2153 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002154
2155 // x86-32 has atomics up to 8 bytes
2156 // FIXME: Check that we actually have cmpxchg8b before setting
2157 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2158 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002159 }
2160 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002161 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00002162 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002163
Chris Lattnerd545ad12009-09-23 06:06:36 +00002164 int getEHDataRegisterNumber(unsigned RegNo) const {
2165 if (RegNo == 0) return 0;
2166 if (RegNo == 1) return 2;
2167 return -1;
2168 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002169};
2170} // end anonymous namespace
2171
2172namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002173class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2174public:
2175 NetBSDI386TargetInfo(const std::string &triple) :
2176 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2177 }
2178
2179 virtual unsigned getFloatEvalMethod() const {
2180 // NetBSD defaults to "double" rounding
2181 return 1;
2182 }
2183};
2184} // end anonymous namespace
2185
2186namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002187class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2188public:
2189 OpenBSDI386TargetInfo(const std::string& triple) :
2190 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2191 SizeType = UnsignedLong;
2192 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00002193 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00002194 }
2195};
2196} // end anonymous namespace
2197
2198namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00002199class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002200public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002201 DarwinI386TargetInfo(const std::string& triple) :
2202 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002203 LongDoubleWidth = 128;
2204 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00002205 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00002206 SizeType = UnsignedLong;
2207 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00002208 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2209 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002210 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00002211 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00002212 }
2213
Eli Friedman3fd920a2008-08-20 02:34:37 +00002214};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002215} // end anonymous namespace
2216
2217namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002218// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002219class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002220public:
2221 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002222 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00002223 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00002224 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00002225 DoubleAlign = LongLongAlign = 64;
2226 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Anton Korobeynikovd7e4a092009-12-19 02:05:07 +00002227 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002228 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002229 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002230 virtual void getTargetDefines(const LangOptions &Opts,
2231 MacroBuilder &Builder) const {
2232 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2233 }
2234};
2235} // end anonymous namespace
2236
2237namespace {
2238
2239// x86-32 Windows Visual Studio target
2240class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2241public:
2242 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2243 : WindowsX86_32TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00002244 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002245 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2246 }
2247 virtual void getTargetDefines(const LangOptions &Opts,
2248 MacroBuilder &Builder) const {
2249 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2250 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2251 // The value of the following reflects processor type.
2252 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2253 // We lost the original triple, so we use the default.
2254 Builder.defineMacro("_M_IX86", "600");
2255 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002256};
2257} // end anonymous namespace
2258
2259namespace {
2260// x86-32 MinGW target
2261class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2262public:
2263 MinGWX86_32TargetInfo(const std::string& triple)
2264 : WindowsX86_32TargetInfo(triple) {
2265 }
2266 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002267 MacroBuilder &Builder) const {
2268 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002269 DefineStd(Builder, "WIN32", Opts);
2270 DefineStd(Builder, "WINNT", Opts);
2271 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002272 Builder.defineMacro("__MSVCRT__");
2273 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002274
2275 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2276 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00002277 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002278 // Provide "as-is" __declspec.
2279 Builder.defineMacro("__declspec", "__declspec");
2280 else
2281 // Provide alias of __attribute__ like mingw32-gcc.
2282 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002283 }
2284};
2285} // end anonymous namespace
2286
2287namespace {
2288// x86-32 Cygwin target
2289class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2290public:
2291 CygwinX86_32TargetInfo(const std::string& triple)
2292 : X86_32TargetInfo(triple) {
2293 TLSSupported = false;
2294 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002295 DoubleAlign = LongLongAlign = 64;
2296 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2297 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002298 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002299 }
2300 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002301 MacroBuilder &Builder) const {
2302 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2303 Builder.defineMacro("__CYGWIN__");
2304 Builder.defineMacro("__CYGWIN32__");
2305 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00002306 if (Opts.CPlusPlus)
2307 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00002308 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002309};
2310} // end anonymous namespace
2311
2312namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00002313// x86-32 Haiku target
2314class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2315public:
2316 HaikuX86_32TargetInfo(const std::string& triple)
2317 : X86_32TargetInfo(triple) {
2318 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00002319 IntPtrType = SignedLong;
2320 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00002321 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00002322 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00002323 virtual void getTargetDefines(const LangOptions &Opts,
2324 MacroBuilder &Builder) const {
2325 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2326 Builder.defineMacro("__INTEL__");
2327 Builder.defineMacro("__HAIKU__");
2328 }
2329};
2330} // end anonymous namespace
2331
Douglas Gregor9fabd852011-07-01 22:41:14 +00002332// RTEMS Target
2333template<typename Target>
2334class RTEMSTargetInfo : public OSTargetInfo<Target> {
2335protected:
2336 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2337 MacroBuilder &Builder) const {
2338 // RTEMS defines; list based off of gcc output
2339
Douglas Gregor9fabd852011-07-01 22:41:14 +00002340 Builder.defineMacro("__rtems__");
2341 Builder.defineMacro("__ELF__");
2342 }
2343public:
2344 RTEMSTargetInfo(const std::string &triple)
2345 : OSTargetInfo<Target>(triple) {
2346 this->UserLabelPrefix = "";
2347
2348 llvm::Triple Triple(triple);
2349 switch (Triple.getArch()) {
2350 default:
2351 case llvm::Triple::x86:
2352 // this->MCountName = ".mcount";
2353 break;
2354 case llvm::Triple::mips:
2355 case llvm::Triple::mipsel:
2356 case llvm::Triple::ppc:
2357 case llvm::Triple::ppc64:
2358 // this->MCountName = "_mcount";
2359 break;
2360 case llvm::Triple::arm:
2361 // this->MCountName = "__mcount";
2362 break;
2363 }
2364
2365 }
2366};
2367
2368namespace {
2369// x86-32 RTEMS target
2370class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2371public:
2372 RTEMSX86_32TargetInfo(const std::string& triple)
2373 : X86_32TargetInfo(triple) {
2374 SizeType = UnsignedLong;
2375 IntPtrType = SignedLong;
2376 PtrDiffType = SignedLong;
2377 this->UserLabelPrefix = "";
2378 }
2379 virtual void getTargetDefines(const LangOptions &Opts,
2380 MacroBuilder &Builder) const {
2381 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2382 Builder.defineMacro("__INTEL__");
2383 Builder.defineMacro("__rtems__");
2384 }
2385};
2386} // end anonymous namespace
2387
Chris Lattnerb986aba2010-04-11 19:29:39 +00002388namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002389// x86-64 generic target
2390class X86_64TargetInfo : public X86TargetInfo {
2391public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002392 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00002393 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00002394 LongDoubleWidth = 128;
2395 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00002396 LargeArrayMinWidth = 128;
2397 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00002398 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00002399 IntMaxType = SignedLong;
2400 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00002401 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002402 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00002403
Eli Friedman873f65a2008-08-21 00:13:15 +00002404 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2405 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002406 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002407
2408 // Use fpret only for long double.
2409 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002410
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00002411 // Use fp2ret for _Complex long double.
2412 ComplexLongDoubleUsesFP2Ret = true;
2413
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002414 // x86-64 has atomics up to 16 bytes.
2415 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2416 // on CPUs with cmpxchg16b
2417 MaxAtomicPromoteWidth = 128;
2418 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00002419 }
Anders Carlssona7408e72007-10-13 00:45:48 +00002420 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002421 return "typedef struct __va_list_tag {"
2422 " unsigned gp_offset;"
2423 " unsigned fp_offset;"
2424 " void* overflow_arg_area;"
2425 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00002426 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00002427 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002428 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002429
Chris Lattnerd545ad12009-09-23 06:06:36 +00002430 int getEHDataRegisterNumber(unsigned RegNo) const {
2431 if (RegNo == 0) return 0;
2432 if (RegNo == 1) return 1;
2433 return -1;
2434 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002435};
2436} // end anonymous namespace
2437
2438namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002439// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002440class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002441public:
2442 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002443 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002444 TLSSupported = false;
2445 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00002446 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002447 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00002448 IntMaxType = SignedLongLong;
2449 UIntMaxType = UnsignedLongLong;
2450 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00002451 SizeType = UnsignedLongLong;
2452 PtrDiffType = SignedLongLong;
2453 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00002454 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002455 }
2456 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002457 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002458 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002459 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002460 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00002461 virtual const char *getVAListDeclaration() const {
2462 return "typedef char* __builtin_va_list;";
2463 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002464};
2465} // end anonymous namespace
2466
2467namespace {
2468// x86-64 Windows Visual Studio target
2469class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2470public:
2471 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2472 : WindowsX86_64TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00002473 LongDoubleWidth = LongDoubleAlign = 64;
2474 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002475 }
2476 virtual void getTargetDefines(const LangOptions &Opts,
2477 MacroBuilder &Builder) const {
2478 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2479 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002480 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002481 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002482 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002483};
2484} // end anonymous namespace
2485
2486namespace {
2487// x86-64 MinGW target
2488class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2489public:
2490 MinGWX86_64TargetInfo(const std::string& triple)
2491 : WindowsX86_64TargetInfo(triple) {
2492 }
2493 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002494 MacroBuilder &Builder) const {
2495 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002496 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002497 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00002498 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002499 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002500
2501 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2502 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00002503 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002504 // Provide "as-is" __declspec.
2505 Builder.defineMacro("__declspec", "__declspec");
2506 else
2507 // Provide alias of __attribute__ like mingw32-gcc.
2508 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002509 }
2510};
2511} // end anonymous namespace
2512
2513namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00002514class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2515public:
Mike Stump11289f42009-09-09 15:08:12 +00002516 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00002517 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2518 Int64Type = SignedLongLong;
2519 }
2520};
2521} // end anonymous namespace
2522
2523namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00002524class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2525public:
Mike Stump11289f42009-09-09 15:08:12 +00002526 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00002527 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2528 IntMaxType = SignedLongLong;
2529 UIntMaxType = UnsignedLongLong;
2530 Int64Type = SignedLongLong;
2531 }
2532};
2533} // end anonymous namespace
2534
2535namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002536class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002537 // Possible FPU choices.
2538 enum FPUMode {
2539 NoFPU,
2540 VFP2FPU,
2541 VFP3FPU,
2542 NeonFPU
2543 };
2544
2545 static bool FPUModeIsVFP(FPUMode Mode) {
2546 return Mode >= VFP2FPU && Mode <= NeonFPU;
2547 }
2548
2549 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2550 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002551
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002552 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002553
2554 unsigned FPU : 3;
2555
Daniel Dunbar893d4752009-12-19 04:15:38 +00002556 unsigned IsThumb : 1;
2557
2558 // Initialized via features.
2559 unsigned SoftFloat : 1;
2560 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002561
Chris Lattner5cc15e02010-03-03 19:03:45 +00002562 static const Builtin::Info BuiltinInfo[];
2563
Chris Lattner17df24e2008-04-21 18:56:49 +00002564public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002565 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002566 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002567 {
Eli Friedman803acb32011-12-22 03:51:45 +00002568 BigEndian = false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002569 SizeType = UnsignedInt;
2570 PtrDiffType = SignedInt;
James Molloyc445be42011-11-23 13:35:08 +00002571 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2572 WCharType = UnsignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002573
Chris Lattner1a8f3942010-04-23 16:29:58 +00002574 // {} in inline assembly are neon specifiers, not assembly variant
2575 // specifiers.
2576 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002577
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002578 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00002579 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00002580 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00002581 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2582 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00002583 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2584 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002585 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00002586 } else {
2587 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2588 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002589 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00002590 }
John McCall86353412010-08-21 22:46:04 +00002591
2592 // ARM targets default to using the ARM C++ ABI.
2593 CXXABI = CXXABI_ARM;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002594
2595 // ARM has atomics up to 8 bytes
2596 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2597 MaxAtomicPromoteWidth = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00002598 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002599 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002600 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002601 ABI = Name;
2602
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002603 // The defaults (above) are for AAPCS, check if we need to change them.
2604 //
2605 // FIXME: We need support for -meabi... we could just mangle it into the
2606 // name.
2607 if (Name == "apcs-gnu") {
Nick Lewyckyf59e1292011-12-16 22:34:14 +00002608 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002609 SizeType = UnsignedLong;
2610
James Molloyc445be42011-11-23 13:35:08 +00002611 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2612 WCharType = SignedInt;
2613
Daniel Dunbarf8125062010-04-22 16:14:54 +00002614 // Do not respect the alignment of bit-field types when laying out
2615 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2616 UseBitFieldTypeAlignment = false;
2617
Chad Rosier18903ee2011-08-04 01:21:14 +00002618 /// Do force alignment of members that follow zero length bitfields. If
2619 /// the alignment of the zero-length bitfield is greater than the member
2620 /// that follows it, `bar', `bar' will be aligned as the type of the
2621 /// zero length bitfield.
2622 UseZeroLengthBitfieldAlignment = true;
2623
2624 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosiera336c6f2011-08-04 17:52:43 +00002625 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2626 /// gcc.
Chad Rosier18903ee2011-08-04 01:21:14 +00002627 ZeroLengthBitfieldBoundary = 32;
2628
Daniel Dunbar03184792009-09-22 21:44:58 +00002629 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00002630 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2631 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00002632 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
Bob Wilson1957a2f2011-06-29 16:09:20 +00002633 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002634 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00002635 } else {
2636 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00002637 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002638 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00002639 }
2640
Chad Rosier99ee7822011-07-26 07:03:04 +00002641 // FIXME: Override "preferred align" for double and long long.
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002642 } else if (Name == "aapcs") {
2643 // FIXME: Enumerated types are variable width in straight AAPCS.
2644 } else if (Name == "aapcs-linux") {
Chad Rosier99ee7822011-07-26 07:03:04 +00002645 ;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002646 } else
2647 return false;
2648
2649 return true;
2650 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00002651
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002652 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002653 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2654 Features["vfp2"] = true;
2655 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2656 Features["neon"] = true;
2657 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002658
Daniel Dunbar893d4752009-12-19 04:15:38 +00002659 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2660 const std::string &Name,
2661 bool Enabled) const {
Evan Cheng491f56d2011-07-08 06:40:11 +00002662 if (Name == "soft-float" || Name == "soft-float-abi" ||
Evgeniy Stepanov48af2a92012-01-11 11:21:31 +00002663 Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16") {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002664 Features[Name] = Enabled;
2665 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00002666 return false;
2667
Daniel Dunbar893d4752009-12-19 04:15:38 +00002668 return true;
2669 }
2670
2671 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002672 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00002673 SoftFloat = SoftFloatABI = false;
2674 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2675 if (Features[i] == "+soft-float")
2676 SoftFloat = true;
2677 else if (Features[i] == "+soft-float-abi")
2678 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002679 else if (Features[i] == "+vfp2")
2680 FPU = VFP2FPU;
2681 else if (Features[i] == "+vfp3")
2682 FPU = VFP3FPU;
2683 else if (Features[i] == "+neon")
2684 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00002685 }
2686
2687 // Remove front-end specific options which the backend handles differently.
2688 std::vector<std::string>::iterator it;
2689 it = std::find(Features.begin(), Features.end(), "+soft-float");
2690 if (it != Features.end())
2691 Features.erase(it);
2692 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2693 if (it != Features.end())
2694 Features.erase(it);
2695 }
2696
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002697 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002698 return llvm::StringSwitch<const char*>(Name)
2699 .Cases("arm8", "arm810", "4")
2700 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2701 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2702 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2703 .Case("ep9312", "4T")
2704 .Cases("arm10tdmi", "arm1020t", "5T")
2705 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2706 .Case("arm926ej-s", "5TEJ")
2707 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2708 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002709 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002710 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002711 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002712 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2713 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00002714 .Case("cortex-m3", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00002715 .Case("cortex-m0", "6M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002716 .Default(0);
2717 }
2718 virtual bool setCPU(const std::string &Name) {
2719 if (!getCPUDefineSuffix(Name))
2720 return false;
2721
2722 CPU = Name;
2723 return true;
2724 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002725 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002726 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002727 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002728 Builder.defineMacro("__arm");
2729 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002730
Chris Lattnerecd49032009-03-02 22:27:17 +00002731 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002732 Builder.defineMacro("__ARMEL__");
2733 Builder.defineMacro("__LITTLE_ENDIAN__");
2734 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002735
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002736 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002737 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002738
Mike Stump9d54bd72009-04-08 02:07:04 +00002739 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002740
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002741 // FIXME: It's more complicated than this and we don't really support
2742 // interworking.
2743 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002744 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002745
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002746 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002747 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002748
Daniel Dunbar893d4752009-12-19 04:15:38 +00002749 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002750 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002751
2752 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002753 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002754
Bob Wilson19c1b882011-05-13 18:56:03 +00002755 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002756 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002757 Builder.defineMacro("__THUMBEL__");
2758 Builder.defineMacro("__thumb__");
Bob Wilson19c1b882011-05-13 18:56:03 +00002759 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002760 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002761 }
2762
2763 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002764 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002765
2766 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002767 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002768
2769 // This only gets set when Neon instructions are actually available, unlike
2770 // the VFP define, hence the soft float and arch check. This is subtly
2771 // different from gcc, we follow the intent which was that it should be set
2772 // when Neon instructions are actually available.
Bob Wilson19c1b882011-05-13 18:56:03 +00002773 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002774 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00002775 }
2776 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2777 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00002778 Records = BuiltinInfo;
2779 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00002780 }
Bob Wilsona7a61e22012-01-26 22:14:27 +00002781 virtual bool isCLZForZeroUndef() const { return false; }
Chris Lattner17df24e2008-04-21 18:56:49 +00002782 virtual const char *getVAListDeclaration() const {
John McCalle155a3d2011-05-09 02:19:37 +00002783 return "typedef void* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00002784 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002785 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002786 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002787 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002788 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002789 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002790 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002791 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00002792 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002793 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00002794 case 'l': // r0-r7
2795 case 'h': // r8-r15
2796 case 'w': // VFP Floating point register single precision
2797 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00002798 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00002799 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00002800 case 'Q': // A memory address that is a single base register.
2801 Info.setAllowsMemory();
2802 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002803 case 'U': // a memory reference...
2804 switch (Name[1]) {
2805 case 'q': // ...ARMV4 ldrsb
2806 case 'v': // ...VFP load/store (reg+constant offset)
2807 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00002808 case 't': // address valid for load/store opaque types wider
2809 // than 128-bits
2810 case 'n': // valid address for Neon doubleword vector load/store
2811 case 'm': // valid address for Neon element and structure load/store
2812 case 's': // valid address for non-offset loads/stores of quad-word
2813 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002814 Info.setAllowsMemory();
2815 Name++;
2816 return true;
2817 }
Nate Begeman2908fa02008-04-22 05:03:19 +00002818 }
Chris Lattner17df24e2008-04-21 18:56:49 +00002819 return false;
2820 }
Evan Chengd863adb2011-06-16 19:13:15 +00002821 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002822 std::string R;
2823 switch (*Constraint) {
2824 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00002825 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002826 Constraint++;
2827 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00002828 case 'p': // 'p' should be translated to 'r' by default.
2829 R = std::string("r");
2830 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002831 default:
2832 return std::string(1, *Constraint);
2833 }
2834 return R;
2835 }
Chris Lattner17df24e2008-04-21 18:56:49 +00002836 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002837 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00002838 return "";
2839 }
2840};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002841
2842const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002843 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002844 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002845 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2846
2847 // Float registers
2848 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2849 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2850 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002851 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002852
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002853 // Double registers
2854 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2855 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002856 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2857 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002858
2859 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002860 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2861 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002862};
2863
2864void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002865 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002866 Names = GCCRegNames;
2867 NumNames = llvm::array_lengthof(GCCRegNames);
2868}
2869
2870const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002871 { { "a1" }, "r0" },
2872 { { "a2" }, "r1" },
2873 { { "a3" }, "r2" },
2874 { { "a4" }, "r3" },
2875 { { "v1" }, "r4" },
2876 { { "v2" }, "r5" },
2877 { { "v3" }, "r6" },
2878 { { "v4" }, "r7" },
2879 { { "v5" }, "r8" },
2880 { { "v6", "rfp" }, "r9" },
2881 { { "sl" }, "r10" },
2882 { { "fp" }, "r11" },
2883 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002884 { { "r13" }, "sp" },
2885 { { "r14" }, "lr" },
2886 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002887 // The S, D and Q registers overlap, but aren't really aliases; we
2888 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002889};
2890
2891void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2892 unsigned &NumAliases) const {
2893 Aliases = GCCRegAliases;
2894 NumAliases = llvm::array_lengthof(GCCRegAliases);
2895}
Chris Lattner5cc15e02010-03-03 19:03:45 +00002896
2897const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00002898#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00002899#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00002900 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00002901#include "clang/Basic/BuiltinsARM.def"
2902};
Chris Lattner17df24e2008-04-21 18:56:49 +00002903} // end anonymous namespace.
2904
Eli Friedmanf05b7722008-08-20 07:44:10 +00002905namespace {
Mike Stump11289f42009-09-09 15:08:12 +00002906class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002907 public DarwinTargetInfo<ARMTargetInfo> {
2908protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00002909 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002910 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00002911 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00002912 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002913
Torok Edwinb2b37c62009-06-30 17:10:35 +00002914public:
Mike Stump11289f42009-09-09 15:08:12 +00002915 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002916 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2917 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002918 // iOS always has 64-bit atomic instructions.
2919 // FIXME: This should be based off of the target features in ARMTargetInfo.
2920 MaxAtomicInlineWidth = 64;
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002921 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002922};
2923} // end anonymous namespace.
2924
Tony Linthicum76329bf2011-12-12 21:14:55 +00002925
2926namespace {
2927// Hexagon abstract base class
2928class HexagonTargetInfo : public TargetInfo {
2929 static const Builtin::Info BuiltinInfo[];
2930 static const char * const GCCRegNames[];
2931 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2932 std::string CPU;
2933public:
2934 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002935 BigEndian = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002936 DescriptionString = ("e-p:32:32:32-"
2937 "i64:64:64-i32:32:32-"
2938 "i16:16:16-i1:32:32-a:0:0");
2939
2940 // {} in inline assembly are packet specifiers, not assembly variant
2941 // specifiers.
2942 NoAsmVariants = true;
2943 }
2944
2945 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2946 unsigned &NumRecords) const {
2947 Records = BuiltinInfo;
2948 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
2949 }
2950
2951 virtual bool validateAsmConstraint(const char *&Name,
2952 TargetInfo::ConstraintInfo &Info) const {
2953 return true;
2954 }
2955
2956 virtual void getTargetDefines(const LangOptions &Opts,
2957 MacroBuilder &Builder) const;
2958
2959 virtual const char *getVAListDeclaration() const {
2960 return "typedef char* __builtin_va_list;";
2961 }
2962 virtual void getGCCRegNames(const char * const *&Names,
2963 unsigned &NumNames) const;
2964 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2965 unsigned &NumAliases) const;
2966 virtual const char *getClobbers() const {
2967 return "";
2968 }
Sebastian Pop86500282012-01-13 20:37:10 +00002969
2970 static const char *getHexagonCPUSuffix(StringRef Name) {
2971 return llvm::StringSwitch<const char*>(Name)
2972 .Case("hexagonv2", "2")
2973 .Case("hexagonv3", "3")
2974 .Case("hexagonv4", "4")
2975 .Default(0);
2976 }
2977
Tony Linthicum76329bf2011-12-12 21:14:55 +00002978 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00002979 if (!getHexagonCPUSuffix(Name))
2980 return false;
2981
Tony Linthicum76329bf2011-12-12 21:14:55 +00002982 CPU = Name;
2983 return true;
2984 }
2985};
2986
2987void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
2988 MacroBuilder &Builder) const {
2989 Builder.defineMacro("qdsp6");
2990 Builder.defineMacro("__qdsp6", "1");
2991 Builder.defineMacro("__qdsp6__", "1");
2992
2993 Builder.defineMacro("hexagon");
2994 Builder.defineMacro("__hexagon", "1");
2995 Builder.defineMacro("__hexagon__", "1");
2996
2997 if(CPU == "hexagonv1") {
2998 Builder.defineMacro("__HEXAGON_V1__");
2999 Builder.defineMacro("__HEXAGON_ARCH__", "1");
3000 if(Opts.HexagonQdsp6Compat) {
3001 Builder.defineMacro("__QDSP6_V1__");
3002 Builder.defineMacro("__QDSP6_ARCH__", "1");
3003 }
3004 }
3005 else if(CPU == "hexagonv2") {
3006 Builder.defineMacro("__HEXAGON_V2__");
3007 Builder.defineMacro("__HEXAGON_ARCH__", "2");
3008 if(Opts.HexagonQdsp6Compat) {
3009 Builder.defineMacro("__QDSP6_V2__");
3010 Builder.defineMacro("__QDSP6_ARCH__", "2");
3011 }
3012 }
3013 else if(CPU == "hexagonv3") {
3014 Builder.defineMacro("__HEXAGON_V3__");
3015 Builder.defineMacro("__HEXAGON_ARCH__", "3");
3016 if(Opts.HexagonQdsp6Compat) {
3017 Builder.defineMacro("__QDSP6_V3__");
3018 Builder.defineMacro("__QDSP6_ARCH__", "3");
3019 }
3020 }
3021 else if(CPU == "hexagonv4") {
3022 Builder.defineMacro("__HEXAGON_V4__");
3023 Builder.defineMacro("__HEXAGON_ARCH__", "4");
3024 if(Opts.HexagonQdsp6Compat) {
3025 Builder.defineMacro("__QDSP6_V4__");
3026 Builder.defineMacro("__QDSP6_ARCH__", "4");
3027 }
3028 }
3029}
3030
3031const char * const HexagonTargetInfo::GCCRegNames[] = {
3032 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3033 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3034 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3035 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3036 "p0", "p1", "p2", "p3",
3037 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3038};
3039
3040void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3041 unsigned &NumNames) const {
3042 Names = GCCRegNames;
3043 NumNames = llvm::array_lengthof(GCCRegNames);
3044}
3045
3046
3047const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3048 { { "sp" }, "r29" },
3049 { { "fp" }, "r30" },
3050 { { "lr" }, "r31" },
3051 };
3052
3053void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3054 unsigned &NumAliases) const {
3055 Aliases = GCCRegAliases;
3056 NumAliases = llvm::array_lengthof(GCCRegAliases);
3057}
3058
3059
3060const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3061#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3062#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3063 ALL_LANGUAGES },
3064#include "clang/Basic/BuiltinsHexagon.def"
3065};
3066}
3067
3068
Chris Lattner5ba61f02006-10-14 07:39:34 +00003069namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003070class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00003071 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3072 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003073 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00003074public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003075 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3076 // FIXME: Support Sparc quad-precision long double?
Eli Friedman803acb32011-12-22 03:51:45 +00003077 BigEndian = false;
Eli Friedman873f65a2008-08-21 00:13:15 +00003078 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00003079 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003080 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003081 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3082 const std::string &Name,
3083 bool Enabled) const {
3084 if (Name == "soft-float")
3085 Features[Name] = Enabled;
3086 else
3087 return false;
3088
3089 return true;
3090 }
3091 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3092 SoftFloat = false;
3093 for (unsigned i = 0, e = Features.size(); i != e; ++i)
3094 if (Features[i] == "+soft-float")
3095 SoftFloat = true;
3096 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003097 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003098 MacroBuilder &Builder) const {
3099 DefineStd(Builder, "sparc", Opts);
3100 Builder.defineMacro("__sparcv8");
3101 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003102
3103 if (SoftFloat)
3104 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00003105 }
3106 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3107 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003108 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00003109 }
3110 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003111 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00003112 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003113 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00003114 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003115 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00003116 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00003117 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00003118 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003119 // FIXME: Implement!
3120 return false;
Gabor Greif49991682008-02-21 16:29:08 +00003121 }
3122 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003123 // FIXME: Implement!
3124 return "";
Gabor Greif49991682008-02-21 16:29:08 +00003125 }
3126};
3127
Chris Lattner9b415d62009-01-27 01:58:38 +00003128const char * const SparcV8TargetInfo::GCCRegNames[] = {
3129 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3130 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3131 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3132 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3133};
3134
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003135void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00003136 unsigned &NumNames) const {
3137 Names = GCCRegNames;
3138 NumNames = llvm::array_lengthof(GCCRegNames);
3139}
3140
3141const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003142 { { "g0" }, "r0" },
3143 { { "g1" }, "r1" },
3144 { { "g2" }, "r2" },
3145 { { "g3" }, "r3" },
3146 { { "g4" }, "r4" },
3147 { { "g5" }, "r5" },
3148 { { "g6" }, "r6" },
3149 { { "g7" }, "r7" },
3150 { { "o0" }, "r8" },
3151 { { "o1" }, "r9" },
3152 { { "o2" }, "r10" },
3153 { { "o3" }, "r11" },
3154 { { "o4" }, "r12" },
3155 { { "o5" }, "r13" },
3156 { { "o6", "sp" }, "r14" },
3157 { { "o7" }, "r15" },
3158 { { "l0" }, "r16" },
3159 { { "l1" }, "r17" },
3160 { { "l2" }, "r18" },
3161 { { "l3" }, "r19" },
3162 { { "l4" }, "r20" },
3163 { { "l5" }, "r21" },
3164 { { "l6" }, "r22" },
3165 { { "l7" }, "r23" },
3166 { { "i0" }, "r24" },
3167 { { "i1" }, "r25" },
3168 { { "i2" }, "r26" },
3169 { { "i3" }, "r27" },
3170 { { "i4" }, "r28" },
3171 { { "i5" }, "r29" },
3172 { { "i6", "fp" }, "r30" },
3173 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00003174};
3175
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003176void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00003177 unsigned &NumAliases) const {
3178 Aliases = GCCRegAliases;
3179 NumAliases = llvm::array_lengthof(GCCRegAliases);
3180}
Gabor Greif49991682008-02-21 16:29:08 +00003181} // end anonymous namespace.
3182
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003183namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003184class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3185public:
3186 AuroraUXSparcV8TargetInfo(const std::string& triple) :
3187 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3188 SizeType = UnsignedInt;
3189 PtrDiffType = SignedInt;
3190 }
3191};
Torok Edwinb2b37c62009-06-30 17:10:35 +00003192class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003193public:
3194 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00003195 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00003196 SizeType = UnsignedInt;
3197 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003198 }
3199};
3200} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00003201
Chris Lattnerb781dc792008-05-08 05:58:21 +00003202namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003203 class MSP430TargetInfo : public TargetInfo {
3204 static const char * const GCCRegNames[];
3205 public:
3206 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003207 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003208 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00003209 IntWidth = 16; IntAlign = 16;
3210 LongWidth = 32; LongLongWidth = 64;
3211 LongAlign = LongLongAlign = 16;
3212 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003213 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003214 SizeType = UnsignedInt;
3215 IntMaxType = SignedLong;
3216 UIntMaxType = UnsignedLong;
3217 IntPtrType = SignedShort;
3218 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00003219 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00003220 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003221 }
3222 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003223 MacroBuilder &Builder) const {
3224 Builder.defineMacro("MSP430");
3225 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003226 // FIXME: defines for different 'flavours' of MCU
3227 }
3228 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3229 unsigned &NumRecords) const {
3230 // FIXME: Implement.
3231 Records = 0;
3232 NumRecords = 0;
3233 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003234 virtual void getGCCRegNames(const char * const *&Names,
3235 unsigned &NumNames) const;
3236 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3237 unsigned &NumAliases) const {
3238 // No aliases.
3239 Aliases = 0;
3240 NumAliases = 0;
3241 }
3242 virtual bool validateAsmConstraint(const char *&Name,
3243 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00003244 // No target constraints for now.
3245 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003246 }
3247 virtual const char *getClobbers() const {
3248 // FIXME: Is this really right?
3249 return "";
3250 }
3251 virtual const char *getVAListDeclaration() const {
3252 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00003253 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003254 }
3255 };
3256
3257 const char * const MSP430TargetInfo::GCCRegNames[] = {
3258 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3259 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3260 };
3261
3262 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3263 unsigned &NumNames) const {
3264 Names = GCCRegNames;
3265 NumNames = llvm::array_lengthof(GCCRegNames);
3266 }
3267}
3268
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00003269namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00003270
Mike Stump11289f42009-09-09 15:08:12 +00003271 // LLVM and Clang cannot be used directly to output native binaries for
3272 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00003273 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00003274 //
3275 // TCE uses the llvm bitcode as input and uses it for generating customized
3276 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00003277 // publicly available in http://tce.cs.tut.fi
3278
Eli Friedman1f191002011-10-07 19:51:42 +00003279 static const unsigned TCEOpenCLAddrSpaceMap[] = {
3280 3, // opencl_global
3281 4, // opencl_local
3282 5 // opencl_constant
3283 };
3284
Eli Friedmana9c3d712009-08-19 20:47:07 +00003285 class TCETargetInfo : public TargetInfo{
3286 public:
3287 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3288 TLSSupported = false;
3289 IntWidth = 32;
3290 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00003291 PointerWidth = 32;
3292 IntAlign = 32;
3293 LongAlign = LongLongAlign = 32;
3294 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003295 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00003296 SizeType = UnsignedInt;
3297 IntMaxType = SignedLong;
3298 UIntMaxType = UnsignedLong;
3299 IntPtrType = SignedInt;
3300 PtrDiffType = SignedInt;
3301 FloatWidth = 32;
3302 FloatAlign = 32;
3303 DoubleWidth = 32;
3304 DoubleAlign = 32;
3305 LongDoubleWidth = 32;
3306 LongDoubleAlign = 32;
3307 FloatFormat = &llvm::APFloat::IEEEsingle;
3308 DoubleFormat = &llvm::APFloat::IEEEsingle;
3309 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00003310 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3311 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00003312 "f32:32:32-f64:32:32-v64:32:32-"
3313 "v128:32:32-a0:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00003314 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmana9c3d712009-08-19 20:47:07 +00003315 }
3316
3317 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003318 MacroBuilder &Builder) const {
3319 DefineStd(Builder, "tce", Opts);
3320 Builder.defineMacro("__TCE__");
3321 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00003322 }
3323 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3324 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00003325 virtual const char *getClobbers() const {
3326 return "";
3327 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00003328 virtual const char *getVAListDeclaration() const {
3329 return "typedef void* __builtin_va_list;";
3330 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00003331 virtual void getGCCRegNames(const char * const *&Names,
3332 unsigned &NumNames) const {}
3333 virtual bool validateAsmConstraint(const char *&Name,
3334 TargetInfo::ConstraintInfo &info) const {
3335 return true;
3336 }
3337 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3338 unsigned &NumAliases) const {}
3339 };
3340}
3341
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003342namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003343class MipsTargetInfoBase : public TargetInfo {
3344 std::string CPU;
3345protected:
3346 std::string ABI;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003347public:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003348 MipsTargetInfoBase(const std::string& triple, const std::string& ABIStr)
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00003349 : TargetInfo(triple), ABI(ABIStr) {}
Eric Christopher0b26a612010-03-02 02:41:08 +00003350 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003351 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00003352 virtual bool setCPU(const std::string &Name) {
3353 CPU = Name;
3354 return true;
3355 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003356 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christopher0b26a612010-03-02 02:41:08 +00003357 Features[ABI] = true;
3358 Features[CPU] = true;
3359 }
3360 virtual void getArchDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003361 MacroBuilder &Builder) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003362 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003363 MacroBuilder &Builder) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003364 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3365 unsigned &NumRecords) const {
3366 // FIXME: Implement!
3367 }
3368 virtual const char *getVAListDeclaration() const {
3369 return "typedef void* __builtin_va_list;";
3370 }
3371 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003372 unsigned &NumNames) const {
3373 static const char * const GCCRegNames[] = {
3374 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
3375 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
3376 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
3377 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
3378 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
3379 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3380 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3381 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3382 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3383 "$fcc5","$fcc6","$fcc7"
3384 };
3385 Names = GCCRegNames;
3386 NumNames = llvm::array_lengthof(GCCRegNames);
3387 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003388 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003389 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003390 virtual bool validateAsmConstraint(const char *&Name,
3391 TargetInfo::ConstraintInfo &Info) const {
3392 switch (*Name) {
3393 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00003394 return false;
3395
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003396 case 'r': // CPU registers.
3397 case 'd': // Equivalent to "r" unless generating MIPS16 code.
3398 case 'y': // Equivalent to "r", backwards compatibility only.
3399 case 'f': // floating-point registers.
3400 Info.setAllowsRegister();
3401 return true;
3402 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003403 }
3404
3405 virtual const char *getClobbers() const {
3406 // FIXME: Implement!
3407 return "";
3408 }
3409};
3410
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003411class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003412public:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003413 Mips32TargetInfoBase(const std::string& triple) :
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00003414 MipsTargetInfoBase(triple, "o32") {
3415 SizeType = UnsignedInt;
3416 PtrDiffType = SignedInt;
3417 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003418 virtual bool setABI(const std::string &Name) {
3419 if ((Name == "o32") || (Name == "eabi")) {
3420 ABI = Name;
3421 return true;
3422 } else
3423 return false;
3424 }
3425 virtual void getArchDefines(const LangOptions &Opts,
3426 MacroBuilder &Builder) const {
Douglas Gregor7240a952011-11-09 15:17:16 +00003427 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3428 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3429 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
3430
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003431 if (ABI == "o32") {
3432 Builder.defineMacro("__mips_o32");
3433 Builder.defineMacro("_ABIO32", "1");
3434 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3435 }
3436 else if (ABI == "eabi")
3437 Builder.defineMacro("__mips_eabi");
3438 else
David Blaikie83d382b2011-09-23 05:06:16 +00003439 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003440 }
3441 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3442 unsigned &NumAliases) const {
3443 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3444 { { "at" }, "$1" },
3445 { { "v0" }, "$2" },
3446 { { "v1" }, "$3" },
3447 { { "a0" }, "$4" },
3448 { { "a1" }, "$5" },
3449 { { "a2" }, "$6" },
3450 { { "a3" }, "$7" },
3451 { { "t0" }, "$8" },
3452 { { "t1" }, "$9" },
3453 { { "t2" }, "$10" },
3454 { { "t3" }, "$11" },
3455 { { "t4" }, "$12" },
3456 { { "t5" }, "$13" },
3457 { { "t6" }, "$14" },
3458 { { "t7" }, "$15" },
3459 { { "s0" }, "$16" },
3460 { { "s1" }, "$17" },
3461 { { "s2" }, "$18" },
3462 { { "s3" }, "$19" },
3463 { { "s4" }, "$20" },
3464 { { "s5" }, "$21" },
3465 { { "s6" }, "$22" },
3466 { { "s7" }, "$23" },
3467 { { "t8" }, "$24" },
3468 { { "t9" }, "$25" },
3469 { { "k0" }, "$26" },
3470 { { "k1" }, "$27" },
3471 { { "gp" }, "$28" },
3472 { { "sp" }, "$29" },
3473 { { "fp" }, "$30" },
3474 { { "ra" }, "$31" }
3475 };
3476 Aliases = GCCRegAliases;
3477 NumAliases = llvm::array_lengthof(GCCRegAliases);
3478 }
3479};
3480
3481class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3482public:
3483 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3484 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3485 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3486 }
3487 virtual void getTargetDefines(const LangOptions &Opts,
3488 MacroBuilder &Builder) const {
3489 DefineStd(Builder, "mips", Opts);
3490 Builder.defineMacro("_mips");
3491 DefineStd(Builder, "MIPSEB", Opts);
3492 Builder.defineMacro("_MIPSEB");
3493 Builder.defineMacro("__REGISTER_PREFIX__", "");
3494 getArchDefines(Opts, Builder);
3495 }
3496};
3497
3498class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3499public:
3500 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003501 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003502 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakab579fe52011-06-02 00:09:17 +00003503 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003504 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003505 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003506 MacroBuilder &Builder) const {
3507 DefineStd(Builder, "mips", Opts);
3508 Builder.defineMacro("_mips");
3509 DefineStd(Builder, "MIPSEL", Opts);
3510 Builder.defineMacro("_MIPSEL");
3511 Builder.defineMacro("__REGISTER_PREFIX__", "");
3512 getArchDefines(Opts, Builder);
3513 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003514};
Akira Hatanakabef17452011-09-20 19:21:49 +00003515
3516class Mips64TargetInfoBase : public MipsTargetInfoBase {
3517 virtual void SetDescriptionString(const std::string &Name) = 0;
3518public:
3519 Mips64TargetInfoBase(const std::string& triple) :
Akira Hatanakac12a2712011-10-22 00:07:27 +00003520 MipsTargetInfoBase(triple, "n64") {
3521 LongWidth = LongAlign = 64;
3522 PointerWidth = PointerAlign = 64;
3523 LongDoubleWidth = LongDoubleAlign = 128;
3524 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003525 SuitableAlign = 128;
Akira Hatanakac12a2712011-10-22 00:07:27 +00003526 }
Akira Hatanakabef17452011-09-20 19:21:49 +00003527 virtual bool setABI(const std::string &Name) {
3528 SetDescriptionString(Name);
Akira Hatanakac12a2712011-10-22 00:07:27 +00003529
3530 if (Name != "n32" && Name != "n64")
Akira Hatanakabef17452011-09-20 19:21:49 +00003531 return false;
Akira Hatanakac12a2712011-10-22 00:07:27 +00003532
3533 ABI = Name;
3534
3535 if (Name == "n32") {
3536 LongWidth = LongAlign = 32;
3537 PointerWidth = PointerAlign = 32;
3538 }
3539
3540 return true;
Akira Hatanakabef17452011-09-20 19:21:49 +00003541 }
3542 virtual void getArchDefines(const LangOptions &Opts,
3543 MacroBuilder &Builder) const {
3544 if (ABI == "n32") {
3545 Builder.defineMacro("__mips_n32");
3546 Builder.defineMacro("_ABIN32", "2");
3547 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3548 }
3549 else if (ABI == "n64") {
3550 Builder.defineMacro("__mips_n64");
3551 Builder.defineMacro("_ABI64", "3");
3552 Builder.defineMacro("_MIPS_SIM", "_ABI64");
3553 }
3554 else
David Blaikie83d382b2011-09-23 05:06:16 +00003555 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00003556 }
3557 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3558 unsigned &NumAliases) const {
3559 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3560 { { "at" }, "$1" },
3561 { { "v0" }, "$2" },
3562 { { "v1" }, "$3" },
3563 { { "a0" }, "$4" },
3564 { { "a1" }, "$5" },
3565 { { "a2" }, "$6" },
3566 { { "a3" }, "$7" },
3567 { { "a4" }, "$8" },
3568 { { "a5" }, "$9" },
3569 { { "a6" }, "$10" },
3570 { { "a7" }, "$11" },
3571 { { "t0" }, "$12" },
3572 { { "t1" }, "$13" },
3573 { { "t2" }, "$14" },
3574 { { "t3" }, "$15" },
3575 { { "s0" }, "$16" },
3576 { { "s1" }, "$17" },
3577 { { "s2" }, "$18" },
3578 { { "s3" }, "$19" },
3579 { { "s4" }, "$20" },
3580 { { "s5" }, "$21" },
3581 { { "s6" }, "$22" },
3582 { { "s7" }, "$23" },
3583 { { "t8" }, "$24" },
3584 { { "t9" }, "$25" },
3585 { { "k0" }, "$26" },
3586 { { "k1" }, "$27" },
3587 { { "gp" }, "$28" },
3588 { { "sp" }, "$29" },
3589 { { "fp" }, "$30" },
3590 { { "ra" }, "$31" }
3591 };
3592 Aliases = GCCRegAliases;
3593 NumAliases = llvm::array_lengthof(GCCRegAliases);
3594 }
3595};
3596
3597class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3598 virtual void SetDescriptionString(const std::string &Name) {
3599 // Change DescriptionString only if ABI is n32.
3600 if (Name == "n32")
3601 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac12a2712011-10-22 00:07:27 +00003602 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3603 "v64:64:64-n32";
Akira Hatanakabef17452011-09-20 19:21:49 +00003604 }
3605public:
3606 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3607 // Default ABI is n64.
3608 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac12a2712011-10-22 00:07:27 +00003609 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3610 "v64:64:64-n32";
Akira Hatanakabef17452011-09-20 19:21:49 +00003611 }
3612 virtual void getTargetDefines(const LangOptions &Opts,
3613 MacroBuilder &Builder) const {
3614 DefineStd(Builder, "mips", Opts);
3615 Builder.defineMacro("_mips");
3616 DefineStd(Builder, "MIPSEB", Opts);
3617 Builder.defineMacro("_MIPSEB");
3618 Builder.defineMacro("__REGISTER_PREFIX__", "");
3619 getArchDefines(Opts, Builder);
3620 }
3621};
3622
3623class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3624 virtual void SetDescriptionString(const std::string &Name) {
3625 // Change DescriptionString only if ABI is n32.
3626 if (Name == "n32")
3627 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac12a2712011-10-22 00:07:27 +00003628 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
3629 "-v64:64:64-n32";
Akira Hatanakabef17452011-09-20 19:21:49 +00003630 }
3631public:
3632 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003633 // Default ABI is n64.
3634 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00003635 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac12a2712011-10-22 00:07:27 +00003636 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3637 "v64:64:64-n32";
Akira Hatanakabef17452011-09-20 19:21:49 +00003638 }
3639 virtual void getTargetDefines(const LangOptions &Opts,
3640 MacroBuilder &Builder) const {
3641 DefineStd(Builder, "mips", Opts);
3642 Builder.defineMacro("_mips");
3643 DefineStd(Builder, "MIPSEL", Opts);
3644 Builder.defineMacro("_MIPSEL");
3645 Builder.defineMacro("__REGISTER_PREFIX__", "");
3646 getArchDefines(Opts, Builder);
3647 }
3648};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003649} // end anonymous namespace.
3650
Ivan Krasindd7403e2011-08-24 20:22:22 +00003651namespace {
3652class PNaClTargetInfo : public TargetInfo {
3653public:
3654 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003655 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00003656 this->UserLabelPrefix = "";
3657 this->LongAlign = 32;
3658 this->LongWidth = 32;
3659 this->PointerAlign = 32;
3660 this->PointerWidth = 32;
3661 this->IntMaxType = TargetInfo::SignedLongLong;
3662 this->UIntMaxType = TargetInfo::UnsignedLongLong;
3663 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00003664 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00003665 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00003666 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00003667 this->SizeType = TargetInfo::UnsignedInt;
3668 this->PtrDiffType = TargetInfo::SignedInt;
3669 this->IntPtrType = TargetInfo::SignedInt;
David Meyerbfdbb252011-10-11 03:12:01 +00003670 this->RegParmMax = 2;
Ivan Krasindd7403e2011-08-24 20:22:22 +00003671 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3672 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3673 }
3674
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003675 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00003676 }
3677 virtual void getArchDefines(const LangOptions &Opts,
3678 MacroBuilder &Builder) const {
3679 Builder.defineMacro("__le32__");
3680 Builder.defineMacro("__pnacl__");
3681 }
3682 virtual void getTargetDefines(const LangOptions &Opts,
3683 MacroBuilder &Builder) const {
Ivan Krasin9b2cbdf2011-08-25 23:49:20 +00003684 DefineStd(Builder, "unix", Opts);
3685 Builder.defineMacro("__ELF__");
3686 if (Opts.POSIXThreads)
3687 Builder.defineMacro("_REENTRANT");
3688 if (Opts.CPlusPlus)
3689 Builder.defineMacro("_GNU_SOURCE");
3690
Ivan Krasindd7403e2011-08-24 20:22:22 +00003691 Builder.defineMacro("__native_client__");
3692 getArchDefines(Opts, Builder);
3693 }
3694 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3695 unsigned &NumRecords) const {
3696 }
3697 virtual const char *getVAListDeclaration() const {
Ivan Krasin96a80612011-09-20 14:56:54 +00003698 return "typedef int __builtin_va_list[4];";
Ivan Krasindd7403e2011-08-24 20:22:22 +00003699 }
3700 virtual void getGCCRegNames(const char * const *&Names,
3701 unsigned &NumNames) const;
3702 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3703 unsigned &NumAliases) const;
3704 virtual bool validateAsmConstraint(const char *&Name,
3705 TargetInfo::ConstraintInfo &Info) const {
3706 return false;
3707 }
3708
3709 virtual const char *getClobbers() const {
3710 return "";
3711 }
3712};
3713
3714void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
3715 unsigned &NumNames) const {
3716 Names = NULL;
3717 NumNames = 0;
3718}
3719
3720void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3721 unsigned &NumAliases) const {
3722 Aliases = NULL;
3723 NumAliases = 0;
3724}
3725} // end anonymous namespace.
3726
3727
Chris Lattner5ba61f02006-10-14 07:39:34 +00003728//===----------------------------------------------------------------------===//
3729// Driver code
3730//===----------------------------------------------------------------------===//
3731
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003732static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00003733 llvm::Triple Triple(T);
3734 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00003735
Daniel Dunbar52322032009-08-18 05:47:58 +00003736 switch (Triple.getArch()) {
3737 default:
3738 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00003739
Tony Linthicum76329bf2011-12-12 21:14:55 +00003740 case llvm::Triple::hexagon:
3741 return new HexagonTargetInfo(T);
3742
Daniel Dunbar52322032009-08-18 05:47:58 +00003743 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00003744 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003745 if (Triple.isOSDarwin())
3746 return new DarwinARMTargetInfo(T);
3747
Daniel Dunbar52322032009-08-18 05:47:58 +00003748 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00003749 case llvm::Triple::Linux:
3750 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003751 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00003752 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003753 case llvm::Triple::NetBSD:
3754 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00003755 case llvm::Triple::RTEMS:
3756 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003757 default:
3758 return new ARMTargetInfo(T);
3759 }
Eli Friedmanb5366062008-05-20 14:21:01 +00003760
Daniel Dunbar52322032009-08-18 05:47:58 +00003761 case llvm::Triple::msp430:
3762 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00003763
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003764 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003765 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003766 case llvm::Triple::Linux:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003767 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003768 case llvm::Triple::RTEMS:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003769 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003770 case llvm::Triple::FreeBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003771 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003772 case llvm::Triple::NetBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003773 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003774 default:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003775 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003776 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003777
3778 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003779 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003780 case llvm::Triple::Linux:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003781 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003782 case llvm::Triple::RTEMS:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003783 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003784 case llvm::Triple::FreeBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003785 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003786 case llvm::Triple::NetBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003787 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003788 default:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003789 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003790 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003791
Akira Hatanakabef17452011-09-20 19:21:49 +00003792 case llvm::Triple::mips64:
3793 switch (os) {
3794 case llvm::Triple::Linux:
3795 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
3796 case llvm::Triple::RTEMS:
3797 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
3798 case llvm::Triple::FreeBSD:
3799 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
3800 case llvm::Triple::NetBSD:
3801 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
3802 default:
3803 return new Mips64EBTargetInfo(T);
3804 }
3805
3806 case llvm::Triple::mips64el:
3807 switch (os) {
3808 case llvm::Triple::Linux:
3809 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
3810 case llvm::Triple::RTEMS:
3811 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
3812 case llvm::Triple::FreeBSD:
3813 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
3814 case llvm::Triple::NetBSD:
3815 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
3816 default:
3817 return new Mips64ELTargetInfo(T);
3818 }
3819
Ivan Krasindd7403e2011-08-24 20:22:22 +00003820 case llvm::Triple::le32:
3821 switch (os) {
3822 case llvm::Triple::NativeClient:
3823 return new PNaClTargetInfo(T);
3824 default:
3825 return NULL;
3826 }
3827
Daniel Dunbar52322032009-08-18 05:47:58 +00003828 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003829 if (Triple.isOSDarwin())
Roman Divacky965b0b72011-01-06 08:27:10 +00003830 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003831 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00003832 case llvm::Triple::Linux:
3833 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003834 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00003835 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003836 case llvm::Triple::NetBSD:
3837 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
3838 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00003839 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003840 default:
3841 return new PPC32TargetInfo(T);
3842 }
Daniel Dunbar52322032009-08-18 05:47:58 +00003843
3844 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003845 if (Triple.isOSDarwin())
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00003846 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003847 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00003848 case llvm::Triple::Linux:
3849 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003850 case llvm::Triple::Lv2:
John Thompsone467e192009-11-19 17:18:50 +00003851 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003852 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00003853 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003854 case llvm::Triple::NetBSD:
3855 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
3856 default:
3857 return new PPC64TargetInfo(T);
3858 }
Daniel Dunbar52322032009-08-18 05:47:58 +00003859
Justin Holewinski514cce82011-04-20 19:34:15 +00003860 case llvm::Triple::ptx32:
3861 return new PTX32TargetInfo(T);
3862 case llvm::Triple::ptx64:
3863 return new PTX64TargetInfo(T);
3864
Chris Lattner5178f562010-03-06 21:21:27 +00003865 case llvm::Triple::mblaze:
3866 return new MBlazeTargetInfo(T);
3867
Daniel Dunbar52322032009-08-18 05:47:58 +00003868 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003869 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00003870 case llvm::Triple::Linux:
3871 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003872 case llvm::Triple::AuroraUX:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003873 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003874 case llvm::Triple::Solaris:
Daniel Dunbar52322032009-08-18 05:47:58 +00003875 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003876 case llvm::Triple::NetBSD:
3877 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
3878 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00003879 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003880 default:
3881 return new SparcV8TargetInfo(T);
3882 }
Daniel Dunbar52322032009-08-18 05:47:58 +00003883
John Thompsone467e192009-11-19 17:18:50 +00003884 // FIXME: Need a real SPU target.
3885 case llvm::Triple::cellspu:
3886 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
3887
Eli Friedmana9c3d712009-08-19 20:47:07 +00003888 case llvm::Triple::tce:
3889 return new TCETargetInfo(T);
3890
Daniel Dunbar52322032009-08-18 05:47:58 +00003891 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003892 if (Triple.isOSDarwin())
3893 return new DarwinI386TargetInfo(T);
3894
Daniel Dunbar52322032009-08-18 05:47:58 +00003895 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003896 case llvm::Triple::AuroraUX:
3897 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003898 case llvm::Triple::Linux:
3899 return new LinuxTargetInfo<X86_32TargetInfo>(T);
3900 case llvm::Triple::DragonFly:
3901 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
3902 case llvm::Triple::NetBSD:
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003903 return new NetBSDI386TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003904 case llvm::Triple::OpenBSD:
3905 return new OpenBSDI386TargetInfo(T);
3906 case llvm::Triple::FreeBSD:
3907 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00003908 case llvm::Triple::Minix:
3909 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003910 case llvm::Triple::Solaris:
3911 return new SolarisTargetInfo<X86_32TargetInfo>(T);
3912 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003913 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003914 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003915 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003916 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003917 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00003918 case llvm::Triple::Haiku:
3919 return new HaikuX86_32TargetInfo(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00003920 case llvm::Triple::RTEMS:
3921 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003922 default:
3923 return new X86_32TargetInfo(T);
3924 }
3925
3926 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003927 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
3928 return new DarwinX86_64TargetInfo(T);
3929
Daniel Dunbar52322032009-08-18 05:47:58 +00003930 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003931 case llvm::Triple::AuroraUX:
3932 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003933 case llvm::Triple::Linux:
3934 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00003935 case llvm::Triple::DragonFly:
3936 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003937 case llvm::Triple::NetBSD:
3938 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
3939 case llvm::Triple::OpenBSD:
3940 return new OpenBSDX86_64TargetInfo(T);
3941 case llvm::Triple::FreeBSD:
3942 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
3943 case llvm::Triple::Solaris:
3944 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00003945 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003946 return new MinGWX86_64TargetInfo(T);
3947 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003948 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003949 default:
3950 return new X86_64TargetInfo(T);
3951 }
3952 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003953}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003954
3955/// CreateTargetInfo - Return the target info object for the specified target
3956/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00003957TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00003958 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003959 llvm::Triple Triple(Opts.Triple);
3960
3961 // Construct the target
3962 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3963 if (!Target) {
3964 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3965 return 0;
3966 }
3967
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003968 // Set the target CPU if specified.
3969 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3970 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3971 return 0;
3972 }
3973
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003974 // Set the target ABI if specified.
3975 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3976 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3977 return 0;
3978 }
3979
Charles Davis95a546e2010-06-11 01:06:47 +00003980 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00003981 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00003982 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3983 return 0;
3984 }
3985
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003986 // Compute the default target features, we need the target to handle this
3987 // because features may have dependencies on one another.
3988 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003989 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003990
3991 // Apply the user specified deltas.
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003992 // First the enables.
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003993 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3994 ie = Opts.Features.end(); it != ie; ++it) {
3995 const char *Name = it->c_str();
3996
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003997 if (Name[0] != '+')
3998 continue;
3999
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004000 // Apply the feature via the target.
Rafael Espindolaa6416a72011-11-27 20:00:43 +00004001 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
4002 Diags.Report(diag::err_target_invalid_feature) << Name;
4003 return 0;
4004 }
4005 }
4006
4007 // Then the disables.
4008 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4009 ie = Opts.Features.end(); it != ie; ++it) {
4010 const char *Name = it->c_str();
4011
4012 if (Name[0] == '+')
4013 continue;
4014
4015 // Apply the feature via the target.
4016 if (Name[0] != '-' ||
4017 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004018 Diags.Report(diag::err_target_invalid_feature) << Name;
4019 return 0;
4020 }
4021 }
4022
4023 // Add the features to the compile options.
4024 //
4025 // FIXME: If we are completely confident that we have the right set, we only
4026 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00004027 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004028 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
4029 ie = Features.end(); it != ie; ++it)
Chris Lattnerd386df42011-07-14 18:24:21 +00004030 Opts.Features.push_back(std::string(it->second ? "+" : "-") +
Chris Lattner2dc4b552011-07-14 18:45:41 +00004031 it->first().str());
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00004032 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004033
4034 return Target.take();
4035}