blob: 47598f8152cf3570ba9f52335c370068a5e6d82b [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 Pop9a8d5282012-01-13 20:37:02 +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?
Nick Lewyckyf243e0d2011-12-21 04:25:47 +0000891 SuitableAlign = 128;
Roman Divacky965b0b72011-01-06 08:27:10 +0000892 }
893 virtual const char *getVAListDeclaration() const {
894 return "typedef char* __builtin_va_list;";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000895 }
896};
897
898class DarwinPPC64TargetInfo :
899 public DarwinTargetInfo<PPC64TargetInfo> {
900public:
901 DarwinPPC64TargetInfo(const std::string& triple)
902 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
903 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +0000904 SuitableAlign = 128;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000905 }
906};
907} // end anonymous namespace.
908
Chris Lattner5ba61f02006-10-14 07:39:34 +0000909namespace {
Justin Holewinski794c2052011-10-03 17:28:37 +0000910 static const unsigned PTXAddrSpaceMap[] = {
911 0, // opencl_global
912 4, // opencl_local
913 1 // opencl_constant
914 };
Justin Holewinski514cce82011-04-20 19:34:15 +0000915 class PTXTargetInfo : public TargetInfo {
916 static const char * const GCCRegNames[];
917 static const Builtin::Info BuiltinInfo[];
Justin Holewinski0542df52011-09-22 17:57:40 +0000918 std::vector<llvm::StringRef> AvailableFeatures;
Justin Holewinski514cce82011-04-20 19:34:15 +0000919 public:
920 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +0000921 BigEndian = false;
Justin Holewinski514cce82011-04-20 19:34:15 +0000922 TLSSupported = false;
923 LongWidth = LongAlign = 64;
Justin Holewinski794c2052011-10-03 17:28:37 +0000924 AddrSpaceMap = &PTXAddrSpaceMap;
Justin Holewinski0542df52011-09-22 17:57:40 +0000925 // Define available target features
926 // These must be defined in sorted order!
927 AvailableFeatures.push_back("compute10");
928 AvailableFeatures.push_back("compute11");
929 AvailableFeatures.push_back("compute12");
930 AvailableFeatures.push_back("compute13");
931 AvailableFeatures.push_back("compute20");
932 AvailableFeatures.push_back("double");
933 AvailableFeatures.push_back("no-fma");
934 AvailableFeatures.push_back("ptx20");
935 AvailableFeatures.push_back("ptx21");
936 AvailableFeatures.push_back("ptx22");
937 AvailableFeatures.push_back("ptx23");
938 AvailableFeatures.push_back("sm10");
939 AvailableFeatures.push_back("sm11");
940 AvailableFeatures.push_back("sm12");
941 AvailableFeatures.push_back("sm13");
942 AvailableFeatures.push_back("sm20");
943 AvailableFeatures.push_back("sm21");
944 AvailableFeatures.push_back("sm22");
945 AvailableFeatures.push_back("sm23");
Justin Holewinski514cce82011-04-20 19:34:15 +0000946 }
947 virtual void getTargetDefines(const LangOptions &Opts,
948 MacroBuilder &Builder) const {
949 Builder.defineMacro("__PTX__");
950 }
951 virtual void getTargetBuiltins(const Builtin::Info *&Records,
952 unsigned &NumRecords) const {
953 Records = BuiltinInfo;
954 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
955 }
956
957 virtual void getGCCRegNames(const char * const *&Names,
958 unsigned &NumNames) const;
959 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
960 unsigned &NumAliases) const {
961 // No aliases.
962 Aliases = 0;
963 NumAliases = 0;
964 }
965 virtual bool validateAsmConstraint(const char *&Name,
966 TargetInfo::ConstraintInfo &info) const {
967 // FIXME: implement
968 return true;
969 }
970 virtual const char *getClobbers() const {
971 // FIXME: Is this really right?
972 return "";
973 }
974 virtual const char *getVAListDeclaration() const {
975 // FIXME: implement
976 return "typedef char* __builtin_va_list;";
977 }
Justin Holewinskiaa78b232011-09-15 12:13:38 +0000978
979 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
980 const std::string &Name,
981 bool Enabled) const;
Justin Holewinski514cce82011-04-20 19:34:15 +0000982 };
983
984 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000985#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski514cce82011-04-20 19:34:15 +0000986#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000987 ALL_LANGUAGES },
Justin Holewinski514cce82011-04-20 19:34:15 +0000988#include "clang/Basic/BuiltinsPTX.def"
989 };
990
991 const char * const PTXTargetInfo::GCCRegNames[] = {
992 "r0"
993 };
994
995 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
996 unsigned &NumNames) const {
997 Names = GCCRegNames;
998 NumNames = llvm::array_lengthof(GCCRegNames);
999 }
1000
Justin Holewinskiaa78b232011-09-15 12:13:38 +00001001 bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1002 const std::string &Name,
1003 bool Enabled) const {
Justin Holewinski0542df52011-09-22 17:57:40 +00001004 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1005 Name)) {
1006 Features[Name] = Enabled;
1007 return true;
Justin Holewinskiaa78b232011-09-15 12:13:38 +00001008 } else {
Justin Holewinski0542df52011-09-22 17:57:40 +00001009 return false;
Justin Holewinskiaa78b232011-09-15 12:13:38 +00001010 }
Justin Holewinskiaa78b232011-09-15 12:13:38 +00001011 }
Justin Holewinski514cce82011-04-20 19:34:15 +00001012
1013 class PTX32TargetInfo : public PTXTargetInfo {
1014 public:
1015 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1016 PointerWidth = PointerAlign = 32;
1017 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1018 DescriptionString
1019 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
1020 }
1021 };
1022
1023 class PTX64TargetInfo : public PTXTargetInfo {
1024 public:
1025 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1026 PointerWidth = PointerAlign = 64;
1027 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1028 DescriptionString
1029 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
1030 }
1031 };
1032}
1033
1034namespace {
Chris Lattner5178f562010-03-06 21:21:27 +00001035// MBlaze abstract base class
1036class MBlazeTargetInfo : public TargetInfo {
1037 static const char * const GCCRegNames[];
1038 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1039
1040public:
1041 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +00001042 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +00001043 }
1044
1045 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1046 unsigned &NumRecords) const {
1047 // FIXME: Implement.
1048 Records = 0;
1049 NumRecords = 0;
1050 }
1051
1052 virtual void getTargetDefines(const LangOptions &Opts,
1053 MacroBuilder &Builder) const;
1054
1055 virtual const char *getVAListDeclaration() const {
1056 return "typedef char* __builtin_va_list;";
1057 }
1058 virtual const char *getTargetPrefix() const {
1059 return "mblaze";
1060 }
1061 virtual void getGCCRegNames(const char * const *&Names,
1062 unsigned &NumNames) const;
1063 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1064 unsigned &NumAliases) const;
1065 virtual bool validateAsmConstraint(const char *&Name,
1066 TargetInfo::ConstraintInfo &Info) const {
1067 switch (*Name) {
1068 default: return false;
1069 case 'O': // Zero
1070 return true;
1071 case 'b': // Base register
1072 case 'f': // Floating point register
1073 Info.setAllowsRegister();
1074 return true;
1075 }
1076 }
1077 virtual const char *getClobbers() const {
1078 return "";
1079 }
1080};
1081
1082/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1083/// #defines that are not tied to a specific subtarget.
1084void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1085 MacroBuilder &Builder) const {
1086 // Target identification.
1087 Builder.defineMacro("__microblaze__");
1088 Builder.defineMacro("_ARCH_MICROBLAZE");
1089 Builder.defineMacro("__MICROBLAZE__");
1090
1091 // Target properties.
1092 Builder.defineMacro("_BIG_ENDIAN");
1093 Builder.defineMacro("__BIG_ENDIAN__");
1094
1095 // Subtarget options.
1096 Builder.defineMacro("__REGISTER_PREFIX__", "");
1097}
1098
1099
1100const char * const MBlazeTargetInfo::GCCRegNames[] = {
1101 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1102 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1103 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1104 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1105 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1106 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1107 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1108 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1109 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1110 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1111};
1112
1113void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1114 unsigned &NumNames) const {
1115 Names = GCCRegNames;
1116 NumNames = llvm::array_lengthof(GCCRegNames);
1117}
1118
1119const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1120 { {"f0"}, "r0" },
1121 { {"f1"}, "r1" },
1122 { {"f2"}, "r2" },
1123 { {"f3"}, "r3" },
1124 { {"f4"}, "r4" },
1125 { {"f5"}, "r5" },
1126 { {"f6"}, "r6" },
1127 { {"f7"}, "r7" },
1128 { {"f8"}, "r8" },
1129 { {"f9"}, "r9" },
1130 { {"f10"}, "r10" },
1131 { {"f11"}, "r11" },
1132 { {"f12"}, "r12" },
1133 { {"f13"}, "r13" },
1134 { {"f14"}, "r14" },
1135 { {"f15"}, "r15" },
1136 { {"f16"}, "r16" },
1137 { {"f17"}, "r17" },
1138 { {"f18"}, "r18" },
1139 { {"f19"}, "r19" },
1140 { {"f20"}, "r20" },
1141 { {"f21"}, "r21" },
1142 { {"f22"}, "r22" },
1143 { {"f23"}, "r23" },
1144 { {"f24"}, "r24" },
1145 { {"f25"}, "r25" },
1146 { {"f26"}, "r26" },
1147 { {"f27"}, "r27" },
1148 { {"f28"}, "r28" },
1149 { {"f29"}, "r29" },
1150 { {"f30"}, "r30" },
1151 { {"f31"}, "r31" },
1152};
1153
1154void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1155 unsigned &NumAliases) const {
1156 Aliases = GCCRegAliases;
1157 NumAliases = llvm::array_lengthof(GCCRegAliases);
1158}
1159} // end anonymous namespace.
1160
1161namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001162// Namespace for x86 abstract base class
1163const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001164#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001165#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001166 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001167#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001168};
Eli Friedmanb5366062008-05-20 14:21:01 +00001169
Nuno Lopescfca1f02009-12-23 17:49:57 +00001170static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001171 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1172 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001173 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001174 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1175 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1176 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001177 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001178 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1179 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001180};
1181
Eric Christophercdd36352011-06-21 00:05:20 +00001182const TargetInfo::AddlRegName AddlRegNames[] = {
1183 { { "al", "ah", "eax", "rax" }, 0 },
1184 { { "bl", "bh", "ebx", "rbx" }, 3 },
1185 { { "cl", "ch", "ecx", "rcx" }, 2 },
1186 { { "dl", "dh", "edx", "rdx" }, 1 },
1187 { { "esi", "rsi" }, 4 },
1188 { { "edi", "rdi" }, 5 },
1189 { { "esp", "rsp" }, 7 },
1190 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001191};
1192
1193// X86 target abstract base class; x86-32 and x86-64 are very close, so
1194// most of the implementation can be shared.
1195class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001196 enum X86SSEEnum {
Craig Topper23b92192012-01-09 09:19:09 +00001197 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner96e43572009-03-02 22:40:39 +00001198 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001199 enum MMX3DNowEnum {
1200 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1201 } MMX3DNowLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001202
Eric Christophere1ddaf92010-04-02 23:50:19 +00001203 bool HasAES;
Craig Topper22967d42011-12-25 05:06:45 +00001204 bool HasLZCNT;
1205 bool HasBMI;
1206 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001207 bool HasPOPCNT;
Craig Topperffdb46c2011-12-30 07:33:42 +00001208 bool HasFMA4;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001209
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001210 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1211 ///
1212 /// Each enumeration represents a particular CPU supported by Clang. These
1213 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1214 enum CPUKind {
1215 CK_Generic,
1216
1217 /// \name i386
1218 /// i386-generation processors.
1219 //@{
1220 CK_i386,
1221 //@}
1222
1223 /// \name i486
1224 /// i486-generation processors.
1225 //@{
1226 CK_i486,
1227 CK_WinChipC6,
1228 CK_WinChip2,
1229 CK_C3,
1230 //@}
1231
1232 /// \name i586
1233 /// i586-generation processors, P5 microarchitecture based.
1234 //@{
1235 CK_i586,
1236 CK_Pentium,
1237 CK_PentiumMMX,
1238 //@}
1239
1240 /// \name i686
1241 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1242 //@{
1243 CK_i686,
1244 CK_PentiumPro,
1245 CK_Pentium2,
1246 CK_Pentium3,
1247 CK_Pentium3M,
1248 CK_PentiumM,
1249 CK_C3_2,
1250
1251 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1252 /// Clang however has some logic to suport this.
1253 // FIXME: Warn, deprecate, and potentially remove this.
1254 CK_Yonah,
1255 //@}
1256
1257 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001258 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001259 //@{
1260 CK_Pentium4,
1261 CK_Pentium4M,
1262 CK_Prescott,
1263 CK_Nocona,
1264 //@}
1265
1266 /// \name Core
1267 /// Core microarchitecture based processors.
1268 //@{
1269 CK_Core2,
1270
1271 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1272 /// codename which GCC no longer accepts as an option to -march, but Clang
1273 /// has some logic for recognizing it.
1274 // FIXME: Warn, deprecate, and potentially remove this.
1275 CK_Penryn,
1276 //@}
1277
1278 /// \name Atom
1279 /// Atom processors
1280 //@{
1281 CK_Atom,
1282 //@}
1283
1284 /// \name Nehalem
1285 /// Nehalem microarchitecture based processors.
1286 //@{
1287 CK_Corei7,
1288 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001289 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001290 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001291 //@}
1292
1293 /// \name K6
1294 /// K6 architecture processors.
1295 //@{
1296 CK_K6,
1297 CK_K6_2,
1298 CK_K6_3,
1299 //@}
1300
1301 /// \name K7
1302 /// K7 architecture processors.
1303 //@{
1304 CK_Athlon,
1305 CK_AthlonThunderbird,
1306 CK_Athlon4,
1307 CK_AthlonXP,
1308 CK_AthlonMP,
1309 //@}
1310
1311 /// \name K8
1312 /// K8 architecture processors.
1313 //@{
1314 CK_Athlon64,
1315 CK_Athlon64SSE3,
1316 CK_AthlonFX,
1317 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001318 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001319 CK_Opteron,
1320 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001321 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001322 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001323
Benjamin Kramer569f2152012-01-10 11:50:18 +00001324 /// \name Bobcat
1325 /// Bobcat architecture processors.
1326 //@{
1327 CK_BTVER1,
1328 //@}
1329
1330 /// \name Bulldozer
1331 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001332 //@{
1333 CK_BDVER1,
1334 CK_BDVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001335 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001336
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001337 /// This specification is deprecated and will be removed in the future.
1338 /// Users should prefer \see CK_K8.
1339 // FIXME: Warn on this when the CPU is set to it.
1340 CK_x86_64,
1341 //@}
1342
1343 /// \name Geode
1344 /// Geode processors.
1345 //@{
1346 CK_Geode
1347 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001348 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001349
Eli Friedman3fd920a2008-08-20 02:34:37 +00001350public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001351 X86TargetInfo(const std::string& triple)
Eli Friedman33465822011-07-08 23:31:17 +00001352 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Craig Topper23b92192012-01-09 09:19:09 +00001353 HasAES(false), HasLZCNT(false), HasBMI(false), HasBMI2(false),
1354 HasPOPCNT(false), HasFMA4(false), CPU(CK_Generic) {
Eli Friedman803acb32011-12-22 03:51:45 +00001355 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001356 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001357 }
Benjamin Kramercf501472011-12-28 15:47:06 +00001358 virtual unsigned getFloatEvalMethod() const {
1359 // X87 evaluates with 80 bits "long double" precision.
1360 return SSELevel == NoSSE ? 2 : 0;
1361 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001362 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1363 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001364 Records = BuiltinInfo;
1365 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001366 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001367 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001368 unsigned &NumNames) const {
1369 Names = GCCRegNames;
1370 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001371 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001372 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001373 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001374 Aliases = 0;
1375 NumAliases = 0;
1376 }
1377 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1378 unsigned &NumNames) const {
1379 Names = AddlRegNames;
1380 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001381 }
Anders Carlsson58436352009-02-28 17:11:49 +00001382 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001383 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001384 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001385 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001386 return "~{dirflag},~{fpsr},~{flags}";
1387 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001388 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001389 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001390 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1391 const std::string &Name,
1392 bool Enabled) const;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001393 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001394 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedman33465822011-07-08 23:31:17 +00001395 virtual const char* getABI() const {
Craig Topper23b92192012-01-09 09:19:09 +00001396 if (PointerWidth == 64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001397 return "avx";
1398 else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1399 return "no-mmx";
1400 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001401 }
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001402 virtual bool setCPU(const std::string &Name) {
Chandler Carruth212334f2011-09-28 08:55:37 +00001403 CPU = llvm::StringSwitch<CPUKind>(Name)
1404 .Case("i386", CK_i386)
1405 .Case("i486", CK_i486)
1406 .Case("winchip-c6", CK_WinChipC6)
1407 .Case("winchip2", CK_WinChip2)
1408 .Case("c3", CK_C3)
1409 .Case("i586", CK_i586)
1410 .Case("pentium", CK_Pentium)
1411 .Case("pentium-mmx", CK_PentiumMMX)
1412 .Case("i686", CK_i686)
1413 .Case("pentiumpro", CK_PentiumPro)
1414 .Case("pentium2", CK_Pentium2)
1415 .Case("pentium3", CK_Pentium3)
1416 .Case("pentium3m", CK_Pentium3M)
1417 .Case("pentium-m", CK_PentiumM)
1418 .Case("c3-2", CK_C3_2)
1419 .Case("yonah", CK_Yonah)
1420 .Case("pentium4", CK_Pentium4)
1421 .Case("pentium4m", CK_Pentium4M)
1422 .Case("prescott", CK_Prescott)
1423 .Case("nocona", CK_Nocona)
1424 .Case("core2", CK_Core2)
1425 .Case("penryn", CK_Penryn)
1426 .Case("atom", CK_Atom)
1427 .Case("corei7", CK_Corei7)
1428 .Case("corei7-avx", CK_Corei7AVX)
1429 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001430 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruth212334f2011-09-28 08:55:37 +00001431 .Case("k6", CK_K6)
1432 .Case("k6-2", CK_K6_2)
1433 .Case("k6-3", CK_K6_3)
1434 .Case("athlon", CK_Athlon)
1435 .Case("athlon-tbird", CK_AthlonThunderbird)
1436 .Case("athlon-4", CK_Athlon4)
1437 .Case("athlon-xp", CK_AthlonXP)
1438 .Case("athlon-mp", CK_AthlonMP)
1439 .Case("athlon64", CK_Athlon64)
1440 .Case("athlon64-sse3", CK_Athlon64SSE3)
1441 .Case("athlon-fx", CK_AthlonFX)
1442 .Case("k8", CK_K8)
1443 .Case("k8-sse3", CK_K8SSE3)
1444 .Case("opteron", CK_Opteron)
1445 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001446 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001447 .Case("btver1", CK_BTVER1)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001448 .Case("bdver1", CK_BDVER1)
1449 .Case("bdver2", CK_BDVER2)
Chandler Carruth212334f2011-09-28 08:55:37 +00001450 .Case("x86-64", CK_x86_64)
1451 .Case("geode", CK_Geode)
1452 .Default(CK_Generic);
1453
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001454 // Perform any per-CPU checks necessary to determine if this CPU is
1455 // acceptable.
1456 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1457 // invalid without explaining *why*.
1458 switch (CPU) {
1459 case CK_Generic:
1460 // No processor selected!
1461 return false;
1462
1463 case CK_i386:
1464 case CK_i486:
1465 case CK_WinChipC6:
1466 case CK_WinChip2:
1467 case CK_C3:
1468 case CK_i586:
1469 case CK_Pentium:
1470 case CK_PentiumMMX:
1471 case CK_i686:
1472 case CK_PentiumPro:
1473 case CK_Pentium2:
1474 case CK_Pentium3:
1475 case CK_Pentium3M:
1476 case CK_PentiumM:
1477 case CK_Yonah:
1478 case CK_C3_2:
1479 case CK_Pentium4:
1480 case CK_Pentium4M:
1481 case CK_Prescott:
1482 case CK_K6:
1483 case CK_K6_2:
1484 case CK_K6_3:
1485 case CK_Athlon:
1486 case CK_AthlonThunderbird:
1487 case CK_Athlon4:
1488 case CK_AthlonXP:
1489 case CK_AthlonMP:
1490 case CK_Geode:
1491 // Only accept certain architectures when compiling in 32-bit mode.
1492 if (PointerWidth != 32)
1493 return false;
1494
1495 // Fallthrough
1496 case CK_Nocona:
1497 case CK_Core2:
1498 case CK_Penryn:
1499 case CK_Atom:
1500 case CK_Corei7:
1501 case CK_Corei7AVX:
1502 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001503 case CK_CoreAVX2:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001504 case CK_Athlon64:
1505 case CK_Athlon64SSE3:
1506 case CK_AthlonFX:
1507 case CK_K8:
1508 case CK_K8SSE3:
1509 case CK_Opteron:
1510 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001511 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001512 case CK_BTVER1:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001513 case CK_BDVER1:
1514 case CK_BDVER2:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001515 case CK_x86_64:
1516 return true;
1517 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001518 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001519 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001520};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001521
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001522void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001523 // FIXME: This should not be here.
1524 Features["3dnow"] = false;
1525 Features["3dnowa"] = false;
1526 Features["mmx"] = false;
1527 Features["sse"] = false;
1528 Features["sse2"] = false;
1529 Features["sse3"] = false;
1530 Features["ssse3"] = false;
1531 Features["sse41"] = false;
1532 Features["sse42"] = false;
Roman Divackyce253d82011-10-30 13:47:56 +00001533 Features["sse4a"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001534 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001535 Features["avx"] = false;
Craig Topper865fff52011-12-17 19:55:21 +00001536 Features["avx2"] = false;
Craig Topper22967d42011-12-25 05:06:45 +00001537 Features["lzcnt"] = false;
1538 Features["bmi"] = false;
1539 Features["bmi2"] = false;
Craig Topper1de83482011-12-29 16:10:46 +00001540 Features["popcnt"] = false;
Craig Topperffdb46c2011-12-30 07:33:42 +00001541 Features["fma4"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001542
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001543 // FIXME: This *really* should not be here.
1544
1545 // X86_64 always has SSE2.
1546 if (PointerWidth == 64)
1547 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1548
Chandler Carruth212334f2011-09-28 08:55:37 +00001549 switch (CPU) {
1550 case CK_Generic:
1551 case CK_i386:
1552 case CK_i486:
1553 case CK_i586:
1554 case CK_Pentium:
1555 case CK_i686:
1556 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00001557 break;
1558 case CK_PentiumMMX:
1559 case CK_Pentium2:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001560 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001561 break;
1562 case CK_Pentium3:
1563 case CK_Pentium3M:
Eli Friedman33465822011-07-08 23:31:17 +00001564 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001565 setFeatureEnabled(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001566 break;
1567 case CK_PentiumM:
1568 case CK_Pentium4:
1569 case CK_Pentium4M:
1570 case CK_x86_64:
Eli Friedman33465822011-07-08 23:31:17 +00001571 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001572 setFeatureEnabled(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001573 break;
1574 case CK_Yonah:
1575 case CK_Prescott:
1576 case CK_Nocona:
Eli Friedman33465822011-07-08 23:31:17 +00001577 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001578 setFeatureEnabled(Features, "sse3", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001579 break;
1580 case CK_Core2:
Eli Friedman33465822011-07-08 23:31:17 +00001581 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001582 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001583 break;
1584 case CK_Penryn:
Eli Friedman33465822011-07-08 23:31:17 +00001585 setFeatureEnabled(Features, "mmx", true);
Benjamin Kramer6dced3b2012-01-04 14:36:57 +00001586 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001587 break;
1588 case CK_Atom:
Eli Friedman33465822011-07-08 23:31:17 +00001589 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00001590 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001591 break;
1592 case CK_Corei7:
Eli Friedman33465822011-07-08 23:31:17 +00001593 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001594 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001595 setFeatureEnabled(Features, "aes", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001596 break;
1597 case CK_Corei7AVX:
1598 case CK_CoreAVXi:
Eli Friedman33465822011-07-08 23:31:17 +00001599 setFeatureEnabled(Features, "mmx", true);
Roman Divacky27ec14f2011-04-05 20:32:44 +00001600 setFeatureEnabled(Features, "sse4", true);
1601 setFeatureEnabled(Features, "aes", true);
Bruno Cardoso Lopes34728382011-07-11 23:33:46 +00001602 //setFeatureEnabled(Features, "avx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001603 break;
Craig Topper865fff52011-12-17 19:55:21 +00001604 case CK_CoreAVX2:
1605 setFeatureEnabled(Features, "mmx", true);
1606 setFeatureEnabled(Features, "sse4", true);
1607 setFeatureEnabled(Features, "aes", true);
Craig Topper22967d42011-12-25 05:06:45 +00001608 setFeatureEnabled(Features, "lzcnt", true);
1609 setFeatureEnabled(Features, "bmi", true);
1610 setFeatureEnabled(Features, "bmi2", true);
Craig Topper865fff52011-12-17 19:55:21 +00001611 //setFeatureEnabled(Features, "avx2", true);
1612 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001613 case CK_K6:
1614 case CK_WinChipC6:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001615 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001616 break;
1617 case CK_K6_2:
1618 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00001619 case CK_WinChip2:
1620 case CK_C3:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001621 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001622 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00001623 case CK_Athlon:
1624 case CK_AthlonThunderbird:
1625 case CK_Geode:
1626 setFeatureEnabled(Features, "3dnowa", true);
1627 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001628 case CK_Athlon4:
1629 case CK_AthlonXP:
1630 case CK_AthlonMP:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001631 setFeatureEnabled(Features, "sse", true);
1632 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001633 break;
1634 case CK_K8:
1635 case CK_Opteron:
1636 case CK_Athlon64:
1637 case CK_AthlonFX:
Mike Stump11289f42009-09-09 15:08:12 +00001638 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001639 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001640 break;
1641 case CK_K8SSE3:
1642 case CK_OpteronSSE3:
1643 case CK_Athlon64SSE3:
Roman Divackyce253d82011-10-30 13:47:56 +00001644 setFeatureEnabled(Features, "sse3", true);
1645 setFeatureEnabled(Features, "3dnowa", true);
1646 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00001647 case CK_AMDFAM10:
Roman Divackydacbfe42010-12-29 13:28:29 +00001648 setFeatureEnabled(Features, "sse3", true);
Roman Divackyce253d82011-10-30 13:47:56 +00001649 setFeatureEnabled(Features, "sse4a", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001650 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001651 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00001652 case CK_BTVER1:
1653 setFeatureEnabled(Features, "ssse3", true);
1654 setFeatureEnabled(Features, "sse4a", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001655 case CK_BDVER1:
1656 case CK_BDVER2:
1657 setFeatureEnabled(Features, "sse4", true);
1658 setFeatureEnabled(Features, "sse4a", true);
1659 setFeatureEnabled(Features, "aes", true);
1660 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001661 case CK_C3_2:
Eli Friedman33465822011-07-08 23:31:17 +00001662 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001663 setFeatureEnabled(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00001664 break;
Eli Friedman33465822011-07-08 23:31:17 +00001665 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001666}
1667
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001668bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001669 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001670 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001671 // FIXME: This *really* should not be here. We need some way of translating
1672 // options into llvm subtarget features.
1673 if (!Features.count(Name) &&
1674 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001675 return false;
1676
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001677 // FIXME: this should probably use a switch with fall through.
1678
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001679 if (Enabled) {
1680 if (Name == "mmx")
1681 Features["mmx"] = true;
1682 else if (Name == "sse")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001683 Features["mmx"] = Features["sse"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001684 else if (Name == "sse2")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001685 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001686 else if (Name == "sse3")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001687 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1688 true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001689 else if (Name == "ssse3")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001690 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001691 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001692 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001693 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper1de83482011-12-29 16:10:46 +00001694 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1695 Features["popcnt"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001696 else if (Name == "sse4.1")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001697 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopher399ffa52010-03-04 02:26:37 +00001698 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001699 else if (Name == "3dnow")
Eli Friedman33465822011-07-08 23:31:17 +00001700 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001701 else if (Name == "3dnowa")
Eli Friedman33465822011-07-08 23:31:17 +00001702 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001703 else if (Name == "aes")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001704 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001705 else if (Name == "avx")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00001706 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1707 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper1de83482011-12-29 16:10:46 +00001708 Features["popcnt"] = Features["avx"] = true;
Craig Topper865fff52011-12-17 19:55:21 +00001709 else if (Name == "avx2")
1710 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1711 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper1de83482011-12-29 16:10:46 +00001712 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topperffdb46c2011-12-30 07:33:42 +00001713 else if (Name == "fma4")
1714 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1715 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1716 Features["popcnt"] = Features["avx"] = Features["fma4"] = true;
Roman Divackyce253d82011-10-30 13:47:56 +00001717 else if (Name == "sse4a")
Craig Topperffdb46c2011-12-30 07:33:42 +00001718 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Benjamin Krameredbc59a2012-01-10 11:50:13 +00001719 Features["lzcnt"] = Features["popcnt"] = Features["sse4a"] = true;
Craig Topper22967d42011-12-25 05:06:45 +00001720 else if (Name == "lzcnt")
1721 Features["lzcnt"] = true;
1722 else if (Name == "bmi")
1723 Features["bmi"] = true;
1724 else if (Name == "bmi2")
1725 Features["bmi2"] = true;
Craig Topper1de83482011-12-29 16:10:46 +00001726 else if (Name == "popcnt")
1727 Features["popcnt"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001728 } else {
1729 if (Name == "mmx")
Eli Friedman33465822011-07-08 23:31:17 +00001730 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001731 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001732 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topperffdb46c2011-12-30 07:33:42 +00001733 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1734 Features["sse4a"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001735 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001736 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Topperffdb46c2011-12-30 07:33:42 +00001737 Features["sse41"] = Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001738 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001739 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topperffdb46c2011-12-30 07:33:42 +00001740 Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001741 else if (Name == "ssse3")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001742 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencera9e41172011-04-17 19:22:03 +00001743 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001744 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001745 else if (Name == "sse4.2")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001746 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001747 else if (Name == "3dnow")
1748 Features["3dnow"] = Features["3dnowa"] = false;
1749 else if (Name == "3dnowa")
1750 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001751 else if (Name == "aes")
1752 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001753 else if (Name == "avx")
Craig Topperffdb46c2011-12-30 07:33:42 +00001754 Features["avx"] = Features["avx2"] = Features["fma4"] = false;
Craig Topper865fff52011-12-17 19:55:21 +00001755 else if (Name == "avx2")
1756 Features["avx2"] = false;
Roman Divackyce253d82011-10-30 13:47:56 +00001757 else if (Name == "sse4a")
1758 Features["sse4a"] = false;
Craig Topper22967d42011-12-25 05:06:45 +00001759 else if (Name == "lzcnt")
1760 Features["lzcnt"] = false;
1761 else if (Name == "bmi")
1762 Features["bmi"] = false;
1763 else if (Name == "bmi2")
1764 Features["bmi2"] = false;
Craig Topper1de83482011-12-29 16:10:46 +00001765 else if (Name == "popcnt")
1766 Features["popcnt"] = false;
Craig Topperffdb46c2011-12-30 07:33:42 +00001767 else if (Name == "fma4")
1768 Features["fma4"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001769 }
1770
1771 return true;
1772}
1773
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001774/// HandleTargetOptions - Perform initialization based on the user
1775/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001776void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001777 // Remember the maximum enabled sselevel.
1778 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1779 // Ignore disabled features.
1780 if (Features[i][0] == '-')
1781 continue;
1782
Eric Christophere1ddaf92010-04-02 23:50:19 +00001783 if (Features[i].substr(1) == "aes") {
1784 HasAES = true;
1785 continue;
1786 }
1787
Craig Topper22967d42011-12-25 05:06:45 +00001788 if (Features[i].substr(1) == "lzcnt") {
1789 HasLZCNT = true;
1790 continue;
1791 }
1792
1793 if (Features[i].substr(1) == "bmi") {
1794 HasBMI = true;
1795 continue;
1796 }
1797
1798 if (Features[i].substr(1) == "bmi2") {
1799 HasBMI2 = true;
1800 continue;
1801 }
1802
Craig Topper1de83482011-12-29 16:10:46 +00001803 if (Features[i].substr(1) == "popcnt") {
1804 HasPOPCNT = true;
1805 continue;
1806 }
1807
Craig Topperffdb46c2011-12-30 07:33:42 +00001808 if (Features[i].substr(1) == "fma4") {
1809 HasFMA4 = true;
1810 continue;
1811 }
1812
Daniel Dunbar979586e2009-11-11 09:38:56 +00001813 assert(Features[i][0] == '+' && "Invalid target feature!");
1814 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
Craig Topper23b92192012-01-09 09:19:09 +00001815 .Case("avx2", AVX2)
1816 .Case("avx", AVX)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001817 .Case("sse42", SSE42)
1818 .Case("sse41", SSE41)
1819 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001820 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001821 .Case("sse2", SSE2)
1822 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00001823 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001824 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001825
Eli Friedman33465822011-07-08 23:31:17 +00001826 MMX3DNowEnum ThreeDNowLevel =
1827 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
Anders Carlssone437c682010-01-27 03:47:49 +00001828 .Case("3dnowa", AMD3DNowAthlon)
1829 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00001830 .Case("mmx", MMX)
1831 .Default(NoMMX3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001832
Eli Friedman33465822011-07-08 23:31:17 +00001833 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001834 }
Eli Friedman33465822011-07-08 23:31:17 +00001835
1836 // Don't tell the backend if we're turning off mmx; it will end up disabling
1837 // SSE, which we don't want.
1838 std::vector<std::string>::iterator it;
1839 it = std::find(Features.begin(), Features.end(), "-mmx");
1840 if (it != Features.end())
1841 Features.erase(it);
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001842}
Chris Lattnerecd49032009-03-02 22:27:17 +00001843
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001844/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1845/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001846void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001847 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001848 // Target identification.
1849 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001850 Builder.defineMacro("_LP64");
1851 Builder.defineMacro("__LP64__");
1852 Builder.defineMacro("__amd64__");
1853 Builder.defineMacro("__amd64");
1854 Builder.defineMacro("__x86_64");
1855 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001856 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001857 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001858 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001859
Chris Lattnerecd49032009-03-02 22:27:17 +00001860 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001861 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
1862 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00001863 switch (CPU) {
1864 case CK_Generic:
1865 break;
1866 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001867 // The rest are coming from the i386 define above.
1868 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00001869 break;
1870 case CK_i486:
1871 case CK_WinChipC6:
1872 case CK_WinChip2:
1873 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001874 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00001875 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00001876 case CK_PentiumMMX:
1877 Builder.defineMacro("__pentium_mmx__");
1878 Builder.defineMacro("__tune_pentium_mmx__");
1879 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00001880 case CK_i586:
1881 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001882 defineCPUMacros(Builder, "i586");
1883 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00001884 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001885 case CK_Pentium3:
1886 case CK_Pentium3M:
1887 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00001888 Builder.defineMacro("__tune_pentium3__");
1889 // Fallthrough
1890 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00001891 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00001892 Builder.defineMacro("__tune_pentium2__");
1893 // Fallthrough
1894 case CK_PentiumPro:
1895 Builder.defineMacro("__tune_i686__");
1896 Builder.defineMacro("__tune_pentiumpro__");
1897 // Fallthrough
1898 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001899 Builder.defineMacro("__i686");
1900 Builder.defineMacro("__i686__");
1901 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
1902 Builder.defineMacro("__pentiumpro");
1903 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00001904 break;
1905 case CK_Pentium4:
1906 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001907 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00001908 break;
1909 case CK_Yonah:
1910 case CK_Prescott:
1911 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001912 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00001913 break;
1914 case CK_Core2:
1915 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001916 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00001917 break;
1918 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001919 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00001920 break;
1921 case CK_Corei7:
1922 case CK_Corei7AVX:
1923 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001924 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001925 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00001926 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001927 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00001928 Builder.defineMacro("__k6_2__");
1929 Builder.defineMacro("__tune_k6_2__");
1930 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00001931 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00001932 if (CPU != CK_K6_2) { // In case of fallthrough
1933 // FIXME: GCC may be enabling these in cases where some other k6
1934 // architecture is specified but -m3dnow is explicitly provided. The
1935 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001936 Builder.defineMacro("__k6_3__");
1937 Builder.defineMacro("__tune_k6_3__");
1938 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00001939 // Fallthrough
1940 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001941 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00001942 break;
1943 case CK_Athlon:
1944 case CK_AthlonThunderbird:
1945 case CK_Athlon4:
1946 case CK_AthlonXP:
1947 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001948 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00001949 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001950 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00001951 Builder.defineMacro("__tune_athlon_sse__");
1952 }
Chandler Carruth212334f2011-09-28 08:55:37 +00001953 break;
1954 case CK_K8:
1955 case CK_K8SSE3:
1956 case CK_x86_64:
1957 case CK_Opteron:
1958 case CK_OpteronSSE3:
1959 case CK_Athlon64:
1960 case CK_Athlon64SSE3:
1961 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001962 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00001963 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00001964 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001965 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00001966 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00001967 case CK_BTVER1:
1968 defineCPUMacros(Builder, "btver1");
1969 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001970 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001971 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001972 break;
1973 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001974 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001975 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00001976 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00001977 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00001978 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001979 }
Chris Lattner96e43572009-03-02 22:40:39 +00001980
Chandler Carruth3f7ed952011-09-28 09:54:07 +00001981 // Target properties.
1982 Builder.defineMacro("__LITTLE_ENDIAN__");
1983 Builder.defineMacro("__REGISTER_PREFIX__", "");
1984
Chris Lattner6df41af2009-04-19 17:32:33 +00001985 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1986 // functions in glibc header files that use FP Stack inline asm which the
1987 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001988 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001989
Chandler Carruth3f7ed952011-09-28 09:54:07 +00001990 if (HasAES)
1991 Builder.defineMacro("__AES__");
1992
Craig Topper22967d42011-12-25 05:06:45 +00001993 if (HasLZCNT)
1994 Builder.defineMacro("__LZCNT__");
1995
1996 if (HasBMI)
1997 Builder.defineMacro("__BMI__");
1998
1999 if (HasBMI2)
2000 Builder.defineMacro("__BMI2__");
2001
Craig Topper1de83482011-12-29 16:10:46 +00002002 if (HasPOPCNT)
2003 Builder.defineMacro("__POPCNT__");
2004
Craig Topperffdb46c2011-12-30 07:33:42 +00002005 if (HasFMA4)
2006 Builder.defineMacro("__FMA4__");
2007
Chris Lattner96e43572009-03-02 22:40:39 +00002008 // Each case falls through to the previous one here.
2009 switch (SSELevel) {
Craig Topper23b92192012-01-09 09:19:09 +00002010 case AVX2:
2011 Builder.defineMacro("__AVX2__");
2012 case AVX:
2013 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002014 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002015 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002016 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002017 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002018 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002019 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002020 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002021 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002022 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002023 Builder.defineMacro("__SSE2__");
2024 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002025 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002026 Builder.defineMacro("__SSE__");
2027 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002028 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002029 break;
2030 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002031
Francois Pichet0706d202011-09-17 17:15:52 +00002032 if (Opts.MicrosoftExt && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002033 switch (SSELevel) {
Craig Topper23b92192012-01-09 09:19:09 +00002034 case AVX2:
2035 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002036 case SSE42:
2037 case SSE41:
2038 case SSSE3:
2039 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002040 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002041 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002042 break;
2043 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002044 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002045 break;
2046 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002047 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002048 }
2049 }
2050
Anders Carlssone437c682010-01-27 03:47:49 +00002051 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002052 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002053 case AMD3DNowAthlon:
2054 Builder.defineMacro("__3dNOW_A__");
2055 case AMD3DNow:
2056 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002057 case MMX:
2058 Builder.defineMacro("__MMX__");
2059 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002060 break;
2061 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002062}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002063
2064
Eli Friedman3fd920a2008-08-20 02:34:37 +00002065bool
Anders Carlsson58436352009-02-28 17:11:49 +00002066X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002067 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002068 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002069 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002070 case 'Y': // first letter of a pair:
2071 switch (*(Name+1)) {
2072 default: return false;
2073 case '0': // First SSE register.
2074 case 't': // Any SSE register, when SSE2 is enabled.
2075 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2076 case 'm': // any MMX register, when inter-unit moves enabled.
2077 break; // falls through to setAllowsRegister.
2078 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002079 case 'a': // eax.
2080 case 'b': // ebx.
2081 case 'c': // ecx.
2082 case 'd': // edx.
2083 case 'S': // esi.
2084 case 'D': // edi.
2085 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002086 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002087 case 't': // top of floating point stack.
2088 case 'u': // second from top of floating point stack.
2089 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002090 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002091 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002092 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002093 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2094 case 'l': // "Index" registers: any general register that can be used as an
2095 // index in a base+index memory access.
2096 Info.setAllowsRegister();
2097 return true;
2098 case 'C': // SSE floating point constant.
2099 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002100 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002101 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002102 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002103 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002104 return true;
2105 }
Dale Johannesen46742a42010-08-24 22:33:12 +00002106 return false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002107}
2108
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002109
Eli Friedman3fd920a2008-08-20 02:34:37 +00002110std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002111X86TargetInfo::convertConstraint(const char *&Constraint) const {
2112 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002113 case 'a': return std::string("{ax}");
2114 case 'b': return std::string("{bx}");
2115 case 'c': return std::string("{cx}");
2116 case 'd': return std::string("{dx}");
2117 case 'S': return std::string("{si}");
2118 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002119 case 'p': // address
2120 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002121 case 't': // top of floating point stack.
2122 return std::string("{st}");
2123 case 'u': // second from top of floating point stack.
2124 return std::string("{st(1)}"); // second from top of floating point stack.
2125 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002126 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002127 }
2128}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002129} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002130
2131namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002132// X86-32 generic target
2133class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002134public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00002135 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2136 DoubleAlign = LongLongAlign = 32;
2137 LongDoubleWidth = 96;
2138 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002139 SuitableAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +00002140 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2141 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames4f4aa1a2011-10-11 00:52:51 +00002142 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002143 SizeType = UnsignedInt;
2144 PtrDiffType = SignedInt;
2145 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002146 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002147
2148 // Use fpret for all types.
2149 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2150 (1 << TargetInfo::Double) |
2151 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002152
2153 // x86-32 has atomics up to 8 bytes
2154 // FIXME: Check that we actually have cmpxchg8b before setting
2155 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2156 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002157 }
2158 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002159 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00002160 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002161
Chris Lattnerd545ad12009-09-23 06:06:36 +00002162 int getEHDataRegisterNumber(unsigned RegNo) const {
2163 if (RegNo == 0) return 0;
2164 if (RegNo == 1) return 2;
2165 return -1;
2166 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002167};
2168} // end anonymous namespace
2169
2170namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002171class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2172public:
2173 NetBSDI386TargetInfo(const std::string &triple) :
2174 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2175 }
2176
2177 virtual unsigned getFloatEvalMethod() const {
2178 // NetBSD defaults to "double" rounding
2179 return 1;
2180 }
2181};
2182} // end anonymous namespace
2183
2184namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002185class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2186public:
2187 OpenBSDI386TargetInfo(const std::string& triple) :
2188 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2189 SizeType = UnsignedLong;
2190 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00002191 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00002192 }
2193};
2194} // end anonymous namespace
2195
2196namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00002197class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002198public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002199 DarwinI386TargetInfo(const std::string& triple) :
2200 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002201 LongDoubleWidth = 128;
2202 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00002203 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00002204 SizeType = UnsignedLong;
2205 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00002206 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2207 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002208 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00002209 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00002210 }
2211
Eli Friedman3fd920a2008-08-20 02:34:37 +00002212};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002213} // end anonymous namespace
2214
2215namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002216// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002217class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002218public:
2219 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002220 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00002221 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00002222 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00002223 DoubleAlign = LongLongAlign = 64;
2224 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 +00002225 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002226 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002227 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002228 virtual void getTargetDefines(const LangOptions &Opts,
2229 MacroBuilder &Builder) const {
2230 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2231 }
2232};
2233} // end anonymous namespace
2234
2235namespace {
2236
2237// x86-32 Windows Visual Studio target
2238class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2239public:
2240 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2241 : WindowsX86_32TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00002242 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002243 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2244 }
2245 virtual void getTargetDefines(const LangOptions &Opts,
2246 MacroBuilder &Builder) const {
2247 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2248 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2249 // The value of the following reflects processor type.
2250 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2251 // We lost the original triple, so we use the default.
2252 Builder.defineMacro("_M_IX86", "600");
2253 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002254};
2255} // end anonymous namespace
2256
2257namespace {
2258// x86-32 MinGW target
2259class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2260public:
2261 MinGWX86_32TargetInfo(const std::string& triple)
2262 : WindowsX86_32TargetInfo(triple) {
2263 }
2264 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002265 MacroBuilder &Builder) const {
2266 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002267 DefineStd(Builder, "WIN32", Opts);
2268 DefineStd(Builder, "WINNT", Opts);
2269 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002270 Builder.defineMacro("__MSVCRT__");
2271 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002272
2273 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2274 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00002275 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002276 // Provide "as-is" __declspec.
2277 Builder.defineMacro("__declspec", "__declspec");
2278 else
2279 // Provide alias of __attribute__ like mingw32-gcc.
2280 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002281 }
2282};
2283} // end anonymous namespace
2284
2285namespace {
2286// x86-32 Cygwin target
2287class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2288public:
2289 CygwinX86_32TargetInfo(const std::string& triple)
2290 : X86_32TargetInfo(triple) {
2291 TLSSupported = false;
2292 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002293 DoubleAlign = LongLongAlign = 64;
2294 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2295 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002296 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002297 }
2298 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002299 MacroBuilder &Builder) const {
2300 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2301 Builder.defineMacro("__CYGWIN__");
2302 Builder.defineMacro("__CYGWIN32__");
2303 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00002304 if (Opts.CPlusPlus)
2305 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00002306 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002307};
2308} // end anonymous namespace
2309
2310namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00002311// x86-32 Haiku target
2312class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2313public:
2314 HaikuX86_32TargetInfo(const std::string& triple)
2315 : X86_32TargetInfo(triple) {
2316 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00002317 IntPtrType = SignedLong;
2318 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00002319 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00002320 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00002321 virtual void getTargetDefines(const LangOptions &Opts,
2322 MacroBuilder &Builder) const {
2323 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2324 Builder.defineMacro("__INTEL__");
2325 Builder.defineMacro("__HAIKU__");
2326 }
2327};
2328} // end anonymous namespace
2329
Douglas Gregor9fabd852011-07-01 22:41:14 +00002330// RTEMS Target
2331template<typename Target>
2332class RTEMSTargetInfo : public OSTargetInfo<Target> {
2333protected:
2334 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2335 MacroBuilder &Builder) const {
2336 // RTEMS defines; list based off of gcc output
2337
Douglas Gregor9fabd852011-07-01 22:41:14 +00002338 Builder.defineMacro("__rtems__");
2339 Builder.defineMacro("__ELF__");
2340 }
2341public:
2342 RTEMSTargetInfo(const std::string &triple)
2343 : OSTargetInfo<Target>(triple) {
2344 this->UserLabelPrefix = "";
2345
2346 llvm::Triple Triple(triple);
2347 switch (Triple.getArch()) {
2348 default:
2349 case llvm::Triple::x86:
2350 // this->MCountName = ".mcount";
2351 break;
2352 case llvm::Triple::mips:
2353 case llvm::Triple::mipsel:
2354 case llvm::Triple::ppc:
2355 case llvm::Triple::ppc64:
2356 // this->MCountName = "_mcount";
2357 break;
2358 case llvm::Triple::arm:
2359 // this->MCountName = "__mcount";
2360 break;
2361 }
2362
2363 }
2364};
2365
2366namespace {
2367// x86-32 RTEMS target
2368class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2369public:
2370 RTEMSX86_32TargetInfo(const std::string& triple)
2371 : X86_32TargetInfo(triple) {
2372 SizeType = UnsignedLong;
2373 IntPtrType = SignedLong;
2374 PtrDiffType = SignedLong;
2375 this->UserLabelPrefix = "";
2376 }
2377 virtual void getTargetDefines(const LangOptions &Opts,
2378 MacroBuilder &Builder) const {
2379 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2380 Builder.defineMacro("__INTEL__");
2381 Builder.defineMacro("__rtems__");
2382 }
2383};
2384} // end anonymous namespace
2385
Chris Lattnerb986aba2010-04-11 19:29:39 +00002386namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002387// x86-64 generic target
2388class X86_64TargetInfo : public X86TargetInfo {
2389public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002390 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00002391 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00002392 LongDoubleWidth = 128;
2393 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00002394 LargeArrayMinWidth = 128;
2395 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00002396 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00002397 IntMaxType = SignedLong;
2398 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00002399 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002400 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00002401
Eli Friedman873f65a2008-08-21 00:13:15 +00002402 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2403 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002404 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002405
2406 // Use fpret only for long double.
2407 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002408
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00002409 // Use fp2ret for _Complex long double.
2410 ComplexLongDoubleUsesFP2Ret = true;
2411
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002412 // x86-64 has atomics up to 16 bytes.
2413 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2414 // on CPUs with cmpxchg16b
2415 MaxAtomicPromoteWidth = 128;
2416 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00002417 }
Anders Carlssona7408e72007-10-13 00:45:48 +00002418 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002419 return "typedef struct __va_list_tag {"
2420 " unsigned gp_offset;"
2421 " unsigned fp_offset;"
2422 " void* overflow_arg_area;"
2423 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00002424 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00002425 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002426 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002427
Chris Lattnerd545ad12009-09-23 06:06:36 +00002428 int getEHDataRegisterNumber(unsigned RegNo) const {
2429 if (RegNo == 0) return 0;
2430 if (RegNo == 1) return 1;
2431 return -1;
2432 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002433};
2434} // end anonymous namespace
2435
2436namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002437// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002438class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002439public:
2440 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002441 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002442 TLSSupported = false;
2443 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00002444 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002445 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00002446 IntMaxType = SignedLongLong;
2447 UIntMaxType = UnsignedLongLong;
2448 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00002449 SizeType = UnsignedLongLong;
2450 PtrDiffType = SignedLongLong;
2451 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00002452 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002453 }
2454 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002455 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002456 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002457 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002458 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00002459 virtual const char *getVAListDeclaration() const {
2460 return "typedef char* __builtin_va_list;";
2461 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002462};
2463} // end anonymous namespace
2464
2465namespace {
2466// x86-64 Windows Visual Studio target
2467class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2468public:
2469 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2470 : WindowsX86_64TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00002471 LongDoubleWidth = LongDoubleAlign = 64;
2472 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002473 }
2474 virtual void getTargetDefines(const LangOptions &Opts,
2475 MacroBuilder &Builder) const {
2476 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2477 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002478 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002479 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002480 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002481};
2482} // end anonymous namespace
2483
2484namespace {
2485// x86-64 MinGW target
2486class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2487public:
2488 MinGWX86_64TargetInfo(const std::string& triple)
2489 : WindowsX86_64TargetInfo(triple) {
2490 }
2491 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002492 MacroBuilder &Builder) const {
2493 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002494 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002495 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00002496 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002497 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002498
2499 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2500 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00002501 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002502 // Provide "as-is" __declspec.
2503 Builder.defineMacro("__declspec", "__declspec");
2504 else
2505 // Provide alias of __attribute__ like mingw32-gcc.
2506 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002507 }
2508};
2509} // end anonymous namespace
2510
2511namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00002512class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2513public:
Mike Stump11289f42009-09-09 15:08:12 +00002514 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00002515 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2516 Int64Type = SignedLongLong;
2517 }
2518};
2519} // end anonymous namespace
2520
2521namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00002522class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2523public:
Mike Stump11289f42009-09-09 15:08:12 +00002524 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00002525 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2526 IntMaxType = SignedLongLong;
2527 UIntMaxType = UnsignedLongLong;
2528 Int64Type = SignedLongLong;
2529 }
2530};
2531} // end anonymous namespace
2532
2533namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002534class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002535 // Possible FPU choices.
2536 enum FPUMode {
2537 NoFPU,
2538 VFP2FPU,
2539 VFP3FPU,
2540 NeonFPU
2541 };
2542
2543 static bool FPUModeIsVFP(FPUMode Mode) {
2544 return Mode >= VFP2FPU && Mode <= NeonFPU;
2545 }
2546
2547 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2548 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002549
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002550 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002551
2552 unsigned FPU : 3;
2553
Daniel Dunbar893d4752009-12-19 04:15:38 +00002554 unsigned IsThumb : 1;
2555
2556 // Initialized via features.
2557 unsigned SoftFloat : 1;
2558 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002559
Chris Lattner5cc15e02010-03-03 19:03:45 +00002560 static const Builtin::Info BuiltinInfo[];
2561
Chris Lattner17df24e2008-04-21 18:56:49 +00002562public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002563 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002564 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002565 {
Eli Friedman803acb32011-12-22 03:51:45 +00002566 BigEndian = false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002567 SizeType = UnsignedInt;
2568 PtrDiffType = SignedInt;
James Molloyc445be42011-11-23 13:35:08 +00002569 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2570 WCharType = UnsignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002571
Chris Lattner1a8f3942010-04-23 16:29:58 +00002572 // {} in inline assembly are neon specifiers, not assembly variant
2573 // specifiers.
2574 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002575
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002576 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00002577 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00002578 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00002579 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2580 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00002581 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2582 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002583 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00002584 } else {
2585 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2586 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002587 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00002588 }
John McCall86353412010-08-21 22:46:04 +00002589
2590 // ARM targets default to using the ARM C++ ABI.
2591 CXXABI = CXXABI_ARM;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002592
2593 // ARM has atomics up to 8 bytes
2594 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2595 MaxAtomicPromoteWidth = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00002596 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002597 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002598 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002599 ABI = Name;
2600
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002601 // The defaults (above) are for AAPCS, check if we need to change them.
2602 //
2603 // FIXME: We need support for -meabi... we could just mangle it into the
2604 // name.
2605 if (Name == "apcs-gnu") {
Nick Lewyckyf59e1292011-12-16 22:34:14 +00002606 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002607 SizeType = UnsignedLong;
2608
James Molloyc445be42011-11-23 13:35:08 +00002609 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2610 WCharType = SignedInt;
2611
Daniel Dunbarf8125062010-04-22 16:14:54 +00002612 // Do not respect the alignment of bit-field types when laying out
2613 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2614 UseBitFieldTypeAlignment = false;
2615
Chad Rosier18903ee2011-08-04 01:21:14 +00002616 /// Do force alignment of members that follow zero length bitfields. If
2617 /// the alignment of the zero-length bitfield is greater than the member
2618 /// that follows it, `bar', `bar' will be aligned as the type of the
2619 /// zero length bitfield.
2620 UseZeroLengthBitfieldAlignment = true;
2621
2622 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosiera336c6f2011-08-04 17:52:43 +00002623 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2624 /// gcc.
Chad Rosier18903ee2011-08-04 01:21:14 +00002625 ZeroLengthBitfieldBoundary = 32;
2626
Daniel Dunbar03184792009-09-22 21:44:58 +00002627 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00002628 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2629 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00002630 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 +00002631 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002632 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00002633 } else {
2634 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 +00002635 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002636 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00002637 }
2638
Chad Rosier99ee7822011-07-26 07:03:04 +00002639 // FIXME: Override "preferred align" for double and long long.
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002640 } else if (Name == "aapcs") {
2641 // FIXME: Enumerated types are variable width in straight AAPCS.
2642 } else if (Name == "aapcs-linux") {
Chad Rosier99ee7822011-07-26 07:03:04 +00002643 ;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002644 } else
2645 return false;
2646
2647 return true;
2648 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00002649
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002650 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002651 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2652 Features["vfp2"] = true;
2653 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2654 Features["neon"] = true;
2655 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002656
Daniel Dunbar893d4752009-12-19 04:15:38 +00002657 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2658 const std::string &Name,
2659 bool Enabled) const {
Evan Cheng491f56d2011-07-08 06:40:11 +00002660 if (Name == "soft-float" || Name == "soft-float-abi" ||
Evgeniy Stepanov48af2a92012-01-11 11:21:31 +00002661 Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16") {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002662 Features[Name] = Enabled;
2663 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00002664 return false;
2665
Daniel Dunbar893d4752009-12-19 04:15:38 +00002666 return true;
2667 }
2668
2669 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002670 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00002671 SoftFloat = SoftFloatABI = false;
2672 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2673 if (Features[i] == "+soft-float")
2674 SoftFloat = true;
2675 else if (Features[i] == "+soft-float-abi")
2676 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002677 else if (Features[i] == "+vfp2")
2678 FPU = VFP2FPU;
2679 else if (Features[i] == "+vfp3")
2680 FPU = VFP3FPU;
2681 else if (Features[i] == "+neon")
2682 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00002683 }
2684
2685 // Remove front-end specific options which the backend handles differently.
2686 std::vector<std::string>::iterator it;
2687 it = std::find(Features.begin(), Features.end(), "+soft-float");
2688 if (it != Features.end())
2689 Features.erase(it);
2690 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2691 if (it != Features.end())
2692 Features.erase(it);
2693 }
2694
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002695 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002696 return llvm::StringSwitch<const char*>(Name)
2697 .Cases("arm8", "arm810", "4")
2698 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2699 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2700 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2701 .Case("ep9312", "4T")
2702 .Cases("arm10tdmi", "arm1020t", "5T")
2703 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2704 .Case("arm926ej-s", "5TEJ")
2705 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2706 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002707 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002708 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002709 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002710 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2711 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00002712 .Case("cortex-m3", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00002713 .Case("cortex-m0", "6M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002714 .Default(0);
2715 }
2716 virtual bool setCPU(const std::string &Name) {
2717 if (!getCPUDefineSuffix(Name))
2718 return false;
2719
2720 CPU = Name;
2721 return true;
2722 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002723 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002724 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002725 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002726 Builder.defineMacro("__arm");
2727 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002728
Chris Lattnerecd49032009-03-02 22:27:17 +00002729 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002730 Builder.defineMacro("__ARMEL__");
2731 Builder.defineMacro("__LITTLE_ENDIAN__");
2732 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002733
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002734 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002735 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002736
Mike Stump9d54bd72009-04-08 02:07:04 +00002737 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002738
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002739 // FIXME: It's more complicated than this and we don't really support
2740 // interworking.
2741 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002742 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002743
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002744 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002745 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002746
Daniel Dunbar893d4752009-12-19 04:15:38 +00002747 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002748 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002749
2750 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002751 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002752
Bob Wilson19c1b882011-05-13 18:56:03 +00002753 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002754 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002755 Builder.defineMacro("__THUMBEL__");
2756 Builder.defineMacro("__thumb__");
Bob Wilson19c1b882011-05-13 18:56:03 +00002757 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002758 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002759 }
2760
2761 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002762 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002763
2764 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002765 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002766
2767 // This only gets set when Neon instructions are actually available, unlike
2768 // the VFP define, hence the soft float and arch check. This is subtly
2769 // different from gcc, we follow the intent which was that it should be set
2770 // when Neon instructions are actually available.
Bob Wilson19c1b882011-05-13 18:56:03 +00002771 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002772 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00002773 }
2774 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2775 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00002776 Records = BuiltinInfo;
2777 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00002778 }
2779 virtual const char *getVAListDeclaration() const {
John McCalle155a3d2011-05-09 02:19:37 +00002780 return "typedef void* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00002781 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002782 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002783 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002784 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002785 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002786 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002787 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002788 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00002789 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002790 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00002791 case 'l': // r0-r7
2792 case 'h': // r8-r15
2793 case 'w': // VFP Floating point register single precision
2794 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00002795 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00002796 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00002797 case 'Q': // A memory address that is a single base register.
2798 Info.setAllowsMemory();
2799 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002800 case 'U': // a memory reference...
2801 switch (Name[1]) {
2802 case 'q': // ...ARMV4 ldrsb
2803 case 'v': // ...VFP load/store (reg+constant offset)
2804 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00002805 case 't': // address valid for load/store opaque types wider
2806 // than 128-bits
2807 case 'n': // valid address for Neon doubleword vector load/store
2808 case 'm': // valid address for Neon element and structure load/store
2809 case 's': // valid address for non-offset loads/stores of quad-word
2810 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002811 Info.setAllowsMemory();
2812 Name++;
2813 return true;
2814 }
Nate Begeman2908fa02008-04-22 05:03:19 +00002815 }
Chris Lattner17df24e2008-04-21 18:56:49 +00002816 return false;
2817 }
Evan Chengd863adb2011-06-16 19:13:15 +00002818 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002819 std::string R;
2820 switch (*Constraint) {
2821 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00002822 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002823 Constraint++;
2824 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00002825 case 'p': // 'p' should be translated to 'r' by default.
2826 R = std::string("r");
2827 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002828 default:
2829 return std::string(1, *Constraint);
2830 }
2831 return R;
2832 }
Chris Lattner17df24e2008-04-21 18:56:49 +00002833 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002834 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00002835 return "";
2836 }
2837};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002838
2839const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002840 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002841 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002842 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2843
2844 // Float registers
2845 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2846 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2847 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002848 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002849
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002850 // Double registers
2851 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2852 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002853 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2854 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002855
2856 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002857 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2858 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002859};
2860
2861void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002862 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002863 Names = GCCRegNames;
2864 NumNames = llvm::array_lengthof(GCCRegNames);
2865}
2866
2867const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002868 { { "a1" }, "r0" },
2869 { { "a2" }, "r1" },
2870 { { "a3" }, "r2" },
2871 { { "a4" }, "r3" },
2872 { { "v1" }, "r4" },
2873 { { "v2" }, "r5" },
2874 { { "v3" }, "r6" },
2875 { { "v4" }, "r7" },
2876 { { "v5" }, "r8" },
2877 { { "v6", "rfp" }, "r9" },
2878 { { "sl" }, "r10" },
2879 { { "fp" }, "r11" },
2880 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002881 { { "r13" }, "sp" },
2882 { { "r14" }, "lr" },
2883 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002884 // The S, D and Q registers overlap, but aren't really aliases; we
2885 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002886};
2887
2888void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2889 unsigned &NumAliases) const {
2890 Aliases = GCCRegAliases;
2891 NumAliases = llvm::array_lengthof(GCCRegAliases);
2892}
Chris Lattner5cc15e02010-03-03 19:03:45 +00002893
2894const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00002895#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00002896#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00002897 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00002898#include "clang/Basic/BuiltinsARM.def"
2899};
Chris Lattner17df24e2008-04-21 18:56:49 +00002900} // end anonymous namespace.
2901
Eli Friedmanf05b7722008-08-20 07:44:10 +00002902namespace {
Mike Stump11289f42009-09-09 15:08:12 +00002903class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002904 public DarwinTargetInfo<ARMTargetInfo> {
2905protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00002906 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002907 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00002908 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00002909 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002910
Torok Edwinb2b37c62009-06-30 17:10:35 +00002911public:
Mike Stump11289f42009-09-09 15:08:12 +00002912 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002913 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2914 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002915 // iOS always has 64-bit atomic instructions.
2916 // FIXME: This should be based off of the target features in ARMTargetInfo.
2917 MaxAtomicInlineWidth = 64;
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002918 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002919};
2920} // end anonymous namespace.
2921
Tony Linthicum76329bf2011-12-12 21:14:55 +00002922
2923namespace {
2924// Hexagon abstract base class
2925class HexagonTargetInfo : public TargetInfo {
2926 static const Builtin::Info BuiltinInfo[];
2927 static const char * const GCCRegNames[];
2928 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2929 std::string CPU;
2930public:
2931 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002932 BigEndian = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002933 DescriptionString = ("e-p:32:32:32-"
2934 "i64:64:64-i32:32:32-"
2935 "i16:16:16-i1:32:32-a:0:0");
2936
2937 // {} in inline assembly are packet specifiers, not assembly variant
2938 // specifiers.
2939 NoAsmVariants = true;
2940 }
2941
2942 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2943 unsigned &NumRecords) const {
2944 Records = BuiltinInfo;
2945 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
2946 }
2947
2948 virtual bool validateAsmConstraint(const char *&Name,
2949 TargetInfo::ConstraintInfo &Info) const {
2950 return true;
2951 }
2952
2953 virtual void getTargetDefines(const LangOptions &Opts,
2954 MacroBuilder &Builder) const;
2955
2956 virtual const char *getVAListDeclaration() const {
2957 return "typedef char* __builtin_va_list;";
2958 }
2959 virtual void getGCCRegNames(const char * const *&Names,
2960 unsigned &NumNames) const;
2961 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2962 unsigned &NumAliases) const;
2963 virtual const char *getClobbers() const {
2964 return "";
2965 }
Sebastian Pop86500282012-01-13 20:37:10 +00002966
2967 static const char *getHexagonCPUSuffix(StringRef Name) {
2968 return llvm::StringSwitch<const char*>(Name)
2969 .Case("hexagonv2", "2")
2970 .Case("hexagonv3", "3")
2971 .Case("hexagonv4", "4")
2972 .Default(0);
2973 }
2974
Tony Linthicum76329bf2011-12-12 21:14:55 +00002975 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00002976 if (!getHexagonCPUSuffix(Name))
2977 return false;
2978
Tony Linthicum76329bf2011-12-12 21:14:55 +00002979 CPU = Name;
2980 return true;
2981 }
2982};
2983
2984void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
2985 MacroBuilder &Builder) const {
2986 Builder.defineMacro("qdsp6");
2987 Builder.defineMacro("__qdsp6", "1");
2988 Builder.defineMacro("__qdsp6__", "1");
2989
2990 Builder.defineMacro("hexagon");
2991 Builder.defineMacro("__hexagon", "1");
2992 Builder.defineMacro("__hexagon__", "1");
2993
2994 if(CPU == "hexagonv1") {
2995 Builder.defineMacro("__HEXAGON_V1__");
2996 Builder.defineMacro("__HEXAGON_ARCH__", "1");
2997 if(Opts.HexagonQdsp6Compat) {
2998 Builder.defineMacro("__QDSP6_V1__");
2999 Builder.defineMacro("__QDSP6_ARCH__", "1");
3000 }
3001 }
3002 else if(CPU == "hexagonv2") {
3003 Builder.defineMacro("__HEXAGON_V2__");
3004 Builder.defineMacro("__HEXAGON_ARCH__", "2");
3005 if(Opts.HexagonQdsp6Compat) {
3006 Builder.defineMacro("__QDSP6_V2__");
3007 Builder.defineMacro("__QDSP6_ARCH__", "2");
3008 }
3009 }
3010 else if(CPU == "hexagonv3") {
3011 Builder.defineMacro("__HEXAGON_V3__");
3012 Builder.defineMacro("__HEXAGON_ARCH__", "3");
3013 if(Opts.HexagonQdsp6Compat) {
3014 Builder.defineMacro("__QDSP6_V3__");
3015 Builder.defineMacro("__QDSP6_ARCH__", "3");
3016 }
3017 }
3018 else if(CPU == "hexagonv4") {
3019 Builder.defineMacro("__HEXAGON_V4__");
3020 Builder.defineMacro("__HEXAGON_ARCH__", "4");
3021 if(Opts.HexagonQdsp6Compat) {
3022 Builder.defineMacro("__QDSP6_V4__");
3023 Builder.defineMacro("__QDSP6_ARCH__", "4");
3024 }
3025 }
3026}
3027
3028const char * const HexagonTargetInfo::GCCRegNames[] = {
3029 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3030 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3031 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3032 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3033 "p0", "p1", "p2", "p3",
3034 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3035};
3036
3037void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3038 unsigned &NumNames) const {
3039 Names = GCCRegNames;
3040 NumNames = llvm::array_lengthof(GCCRegNames);
3041}
3042
3043
3044const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3045 { { "sp" }, "r29" },
3046 { { "fp" }, "r30" },
3047 { { "lr" }, "r31" },
3048 };
3049
3050void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3051 unsigned &NumAliases) const {
3052 Aliases = GCCRegAliases;
3053 NumAliases = llvm::array_lengthof(GCCRegAliases);
3054}
3055
3056
3057const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3058#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3059#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3060 ALL_LANGUAGES },
3061#include "clang/Basic/BuiltinsHexagon.def"
3062};
3063}
3064
3065
Chris Lattner5ba61f02006-10-14 07:39:34 +00003066namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003067class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00003068 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3069 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003070 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00003071public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003072 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3073 // FIXME: Support Sparc quad-precision long double?
Eli Friedman803acb32011-12-22 03:51:45 +00003074 BigEndian = false;
Eli Friedman873f65a2008-08-21 00:13:15 +00003075 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 +00003076 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003077 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003078 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3079 const std::string &Name,
3080 bool Enabled) const {
3081 if (Name == "soft-float")
3082 Features[Name] = Enabled;
3083 else
3084 return false;
3085
3086 return true;
3087 }
3088 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3089 SoftFloat = false;
3090 for (unsigned i = 0, e = Features.size(); i != e; ++i)
3091 if (Features[i] == "+soft-float")
3092 SoftFloat = true;
3093 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003094 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003095 MacroBuilder &Builder) const {
3096 DefineStd(Builder, "sparc", Opts);
3097 Builder.defineMacro("__sparcv8");
3098 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003099
3100 if (SoftFloat)
3101 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00003102 }
3103 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3104 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003105 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00003106 }
3107 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003108 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00003109 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003110 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00003111 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003112 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00003113 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00003114 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00003115 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003116 // FIXME: Implement!
3117 return false;
Gabor Greif49991682008-02-21 16:29:08 +00003118 }
3119 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003120 // FIXME: Implement!
3121 return "";
Gabor Greif49991682008-02-21 16:29:08 +00003122 }
3123};
3124
Chris Lattner9b415d62009-01-27 01:58:38 +00003125const char * const SparcV8TargetInfo::GCCRegNames[] = {
3126 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3127 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3128 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3129 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3130};
3131
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003132void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00003133 unsigned &NumNames) const {
3134 Names = GCCRegNames;
3135 NumNames = llvm::array_lengthof(GCCRegNames);
3136}
3137
3138const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003139 { { "g0" }, "r0" },
3140 { { "g1" }, "r1" },
3141 { { "g2" }, "r2" },
3142 { { "g3" }, "r3" },
3143 { { "g4" }, "r4" },
3144 { { "g5" }, "r5" },
3145 { { "g6" }, "r6" },
3146 { { "g7" }, "r7" },
3147 { { "o0" }, "r8" },
3148 { { "o1" }, "r9" },
3149 { { "o2" }, "r10" },
3150 { { "o3" }, "r11" },
3151 { { "o4" }, "r12" },
3152 { { "o5" }, "r13" },
3153 { { "o6", "sp" }, "r14" },
3154 { { "o7" }, "r15" },
3155 { { "l0" }, "r16" },
3156 { { "l1" }, "r17" },
3157 { { "l2" }, "r18" },
3158 { { "l3" }, "r19" },
3159 { { "l4" }, "r20" },
3160 { { "l5" }, "r21" },
3161 { { "l6" }, "r22" },
3162 { { "l7" }, "r23" },
3163 { { "i0" }, "r24" },
3164 { { "i1" }, "r25" },
3165 { { "i2" }, "r26" },
3166 { { "i3" }, "r27" },
3167 { { "i4" }, "r28" },
3168 { { "i5" }, "r29" },
3169 { { "i6", "fp" }, "r30" },
3170 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00003171};
3172
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003173void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00003174 unsigned &NumAliases) const {
3175 Aliases = GCCRegAliases;
3176 NumAliases = llvm::array_lengthof(GCCRegAliases);
3177}
Gabor Greif49991682008-02-21 16:29:08 +00003178} // end anonymous namespace.
3179
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003180namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003181class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3182public:
3183 AuroraUXSparcV8TargetInfo(const std::string& triple) :
3184 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3185 SizeType = UnsignedInt;
3186 PtrDiffType = SignedInt;
3187 }
3188};
Torok Edwinb2b37c62009-06-30 17:10:35 +00003189class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003190public:
3191 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00003192 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00003193 SizeType = UnsignedInt;
3194 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00003195 }
3196};
3197} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00003198
Chris Lattnerb781dc792008-05-08 05:58:21 +00003199namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003200 class MSP430TargetInfo : public TargetInfo {
3201 static const char * const GCCRegNames[];
3202 public:
3203 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003204 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003205 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00003206 IntWidth = 16; IntAlign = 16;
3207 LongWidth = 32; LongLongWidth = 64;
3208 LongAlign = LongLongAlign = 16;
3209 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003210 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003211 SizeType = UnsignedInt;
3212 IntMaxType = SignedLong;
3213 UIntMaxType = UnsignedLong;
3214 IntPtrType = SignedShort;
3215 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00003216 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00003217 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003218 }
3219 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003220 MacroBuilder &Builder) const {
3221 Builder.defineMacro("MSP430");
3222 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003223 // FIXME: defines for different 'flavours' of MCU
3224 }
3225 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3226 unsigned &NumRecords) const {
3227 // FIXME: Implement.
3228 Records = 0;
3229 NumRecords = 0;
3230 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003231 virtual void getGCCRegNames(const char * const *&Names,
3232 unsigned &NumNames) const;
3233 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3234 unsigned &NumAliases) const {
3235 // No aliases.
3236 Aliases = 0;
3237 NumAliases = 0;
3238 }
3239 virtual bool validateAsmConstraint(const char *&Name,
3240 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00003241 // No target constraints for now.
3242 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003243 }
3244 virtual const char *getClobbers() const {
3245 // FIXME: Is this really right?
3246 return "";
3247 }
3248 virtual const char *getVAListDeclaration() const {
3249 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00003250 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00003251 }
3252 };
3253
3254 const char * const MSP430TargetInfo::GCCRegNames[] = {
3255 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3256 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3257 };
3258
3259 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3260 unsigned &NumNames) const {
3261 Names = GCCRegNames;
3262 NumNames = llvm::array_lengthof(GCCRegNames);
3263 }
3264}
3265
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00003266namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00003267
Mike Stump11289f42009-09-09 15:08:12 +00003268 // LLVM and Clang cannot be used directly to output native binaries for
3269 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00003270 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00003271 //
3272 // TCE uses the llvm bitcode as input and uses it for generating customized
3273 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00003274 // publicly available in http://tce.cs.tut.fi
3275
Eli Friedman1f191002011-10-07 19:51:42 +00003276 static const unsigned TCEOpenCLAddrSpaceMap[] = {
3277 3, // opencl_global
3278 4, // opencl_local
3279 5 // opencl_constant
3280 };
3281
Eli Friedmana9c3d712009-08-19 20:47:07 +00003282 class TCETargetInfo : public TargetInfo{
3283 public:
3284 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3285 TLSSupported = false;
3286 IntWidth = 32;
3287 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00003288 PointerWidth = 32;
3289 IntAlign = 32;
3290 LongAlign = LongLongAlign = 32;
3291 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003292 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00003293 SizeType = UnsignedInt;
3294 IntMaxType = SignedLong;
3295 UIntMaxType = UnsignedLong;
3296 IntPtrType = SignedInt;
3297 PtrDiffType = SignedInt;
3298 FloatWidth = 32;
3299 FloatAlign = 32;
3300 DoubleWidth = 32;
3301 DoubleAlign = 32;
3302 LongDoubleWidth = 32;
3303 LongDoubleAlign = 32;
3304 FloatFormat = &llvm::APFloat::IEEEsingle;
3305 DoubleFormat = &llvm::APFloat::IEEEsingle;
3306 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00003307 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3308 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00003309 "f32:32:32-f64:32:32-v64:32:32-"
3310 "v128:32:32-a0:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00003311 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmana9c3d712009-08-19 20:47:07 +00003312 }
3313
3314 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003315 MacroBuilder &Builder) const {
3316 DefineStd(Builder, "tce", Opts);
3317 Builder.defineMacro("__TCE__");
3318 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00003319 }
3320 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3321 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00003322 virtual const char *getClobbers() const {
3323 return "";
3324 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00003325 virtual const char *getVAListDeclaration() const {
3326 return "typedef void* __builtin_va_list;";
3327 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00003328 virtual void getGCCRegNames(const char * const *&Names,
3329 unsigned &NumNames) const {}
3330 virtual bool validateAsmConstraint(const char *&Name,
3331 TargetInfo::ConstraintInfo &info) const {
3332 return true;
3333 }
3334 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3335 unsigned &NumAliases) const {}
3336 };
3337}
3338
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003339namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003340class MipsTargetInfoBase : public TargetInfo {
3341 std::string CPU;
3342protected:
3343 std::string ABI;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003344public:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003345 MipsTargetInfoBase(const std::string& triple, const std::string& ABIStr)
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00003346 : TargetInfo(triple), ABI(ABIStr) {}
Eric Christopher0b26a612010-03-02 02:41:08 +00003347 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003348 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00003349 virtual bool setCPU(const std::string &Name) {
3350 CPU = Name;
3351 return true;
3352 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003353 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christopher0b26a612010-03-02 02:41:08 +00003354 Features[ABI] = true;
3355 Features[CPU] = true;
3356 }
3357 virtual void getArchDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003358 MacroBuilder &Builder) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003359 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003360 MacroBuilder &Builder) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003361 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3362 unsigned &NumRecords) const {
3363 // FIXME: Implement!
3364 }
3365 virtual const char *getVAListDeclaration() const {
3366 return "typedef void* __builtin_va_list;";
3367 }
3368 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003369 unsigned &NumNames) const {
3370 static const char * const GCCRegNames[] = {
3371 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
3372 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
3373 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
3374 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
3375 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
3376 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3377 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3378 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3379 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3380 "$fcc5","$fcc6","$fcc7"
3381 };
3382 Names = GCCRegNames;
3383 NumNames = llvm::array_lengthof(GCCRegNames);
3384 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003385 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003386 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003387 virtual bool validateAsmConstraint(const char *&Name,
3388 TargetInfo::ConstraintInfo &Info) const {
3389 switch (*Name) {
3390 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00003391 return false;
3392
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003393 case 'r': // CPU registers.
3394 case 'd': // Equivalent to "r" unless generating MIPS16 code.
3395 case 'y': // Equivalent to "r", backwards compatibility only.
3396 case 'f': // floating-point registers.
3397 Info.setAllowsRegister();
3398 return true;
3399 }
3400 return false;
3401 }
3402
3403 virtual const char *getClobbers() const {
3404 // FIXME: Implement!
3405 return "";
3406 }
3407};
3408
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003409class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003410public:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003411 Mips32TargetInfoBase(const std::string& triple) :
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00003412 MipsTargetInfoBase(triple, "o32") {
3413 SizeType = UnsignedInt;
3414 PtrDiffType = SignedInt;
3415 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003416 virtual bool setABI(const std::string &Name) {
3417 if ((Name == "o32") || (Name == "eabi")) {
3418 ABI = Name;
3419 return true;
3420 } else
3421 return false;
3422 }
3423 virtual void getArchDefines(const LangOptions &Opts,
3424 MacroBuilder &Builder) const {
Douglas Gregor7240a952011-11-09 15:17:16 +00003425 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3426 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3427 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
3428
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003429 if (ABI == "o32") {
3430 Builder.defineMacro("__mips_o32");
3431 Builder.defineMacro("_ABIO32", "1");
3432 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3433 }
3434 else if (ABI == "eabi")
3435 Builder.defineMacro("__mips_eabi");
3436 else
David Blaikie83d382b2011-09-23 05:06:16 +00003437 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003438 }
3439 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3440 unsigned &NumAliases) const {
3441 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3442 { { "at" }, "$1" },
3443 { { "v0" }, "$2" },
3444 { { "v1" }, "$3" },
3445 { { "a0" }, "$4" },
3446 { { "a1" }, "$5" },
3447 { { "a2" }, "$6" },
3448 { { "a3" }, "$7" },
3449 { { "t0" }, "$8" },
3450 { { "t1" }, "$9" },
3451 { { "t2" }, "$10" },
3452 { { "t3" }, "$11" },
3453 { { "t4" }, "$12" },
3454 { { "t5" }, "$13" },
3455 { { "t6" }, "$14" },
3456 { { "t7" }, "$15" },
3457 { { "s0" }, "$16" },
3458 { { "s1" }, "$17" },
3459 { { "s2" }, "$18" },
3460 { { "s3" }, "$19" },
3461 { { "s4" }, "$20" },
3462 { { "s5" }, "$21" },
3463 { { "s6" }, "$22" },
3464 { { "s7" }, "$23" },
3465 { { "t8" }, "$24" },
3466 { { "t9" }, "$25" },
3467 { { "k0" }, "$26" },
3468 { { "k1" }, "$27" },
3469 { { "gp" }, "$28" },
3470 { { "sp" }, "$29" },
3471 { { "fp" }, "$30" },
3472 { { "ra" }, "$31" }
3473 };
3474 Aliases = GCCRegAliases;
3475 NumAliases = llvm::array_lengthof(GCCRegAliases);
3476 }
3477};
3478
3479class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3480public:
3481 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3482 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3483 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3484 }
3485 virtual void getTargetDefines(const LangOptions &Opts,
3486 MacroBuilder &Builder) const {
3487 DefineStd(Builder, "mips", Opts);
3488 Builder.defineMacro("_mips");
3489 DefineStd(Builder, "MIPSEB", Opts);
3490 Builder.defineMacro("_MIPSEB");
3491 Builder.defineMacro("__REGISTER_PREFIX__", "");
3492 getArchDefines(Opts, Builder);
3493 }
3494};
3495
3496class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3497public:
3498 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003499 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003500 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 +00003501 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003502 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003503 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003504 MacroBuilder &Builder) const {
3505 DefineStd(Builder, "mips", Opts);
3506 Builder.defineMacro("_mips");
3507 DefineStd(Builder, "MIPSEL", Opts);
3508 Builder.defineMacro("_MIPSEL");
3509 Builder.defineMacro("__REGISTER_PREFIX__", "");
3510 getArchDefines(Opts, Builder);
3511 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003512};
Akira Hatanakabef17452011-09-20 19:21:49 +00003513
3514class Mips64TargetInfoBase : public MipsTargetInfoBase {
3515 virtual void SetDescriptionString(const std::string &Name) = 0;
3516public:
3517 Mips64TargetInfoBase(const std::string& triple) :
Akira Hatanakac12a2712011-10-22 00:07:27 +00003518 MipsTargetInfoBase(triple, "n64") {
3519 LongWidth = LongAlign = 64;
3520 PointerWidth = PointerAlign = 64;
3521 LongDoubleWidth = LongDoubleAlign = 128;
3522 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003523 SuitableAlign = 128;
Akira Hatanakac12a2712011-10-22 00:07:27 +00003524 }
Akira Hatanakabef17452011-09-20 19:21:49 +00003525 virtual bool setABI(const std::string &Name) {
3526 SetDescriptionString(Name);
Akira Hatanakac12a2712011-10-22 00:07:27 +00003527
3528 if (Name != "n32" && Name != "n64")
Akira Hatanakabef17452011-09-20 19:21:49 +00003529 return false;
Akira Hatanakac12a2712011-10-22 00:07:27 +00003530
3531 ABI = Name;
3532
3533 if (Name == "n32") {
3534 LongWidth = LongAlign = 32;
3535 PointerWidth = PointerAlign = 32;
3536 }
3537
3538 return true;
Akira Hatanakabef17452011-09-20 19:21:49 +00003539 }
3540 virtual void getArchDefines(const LangOptions &Opts,
3541 MacroBuilder &Builder) const {
3542 if (ABI == "n32") {
3543 Builder.defineMacro("__mips_n32");
3544 Builder.defineMacro("_ABIN32", "2");
3545 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3546 }
3547 else if (ABI == "n64") {
3548 Builder.defineMacro("__mips_n64");
3549 Builder.defineMacro("_ABI64", "3");
3550 Builder.defineMacro("_MIPS_SIM", "_ABI64");
3551 }
3552 else
David Blaikie83d382b2011-09-23 05:06:16 +00003553 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00003554 }
3555 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3556 unsigned &NumAliases) const {
3557 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3558 { { "at" }, "$1" },
3559 { { "v0" }, "$2" },
3560 { { "v1" }, "$3" },
3561 { { "a0" }, "$4" },
3562 { { "a1" }, "$5" },
3563 { { "a2" }, "$6" },
3564 { { "a3" }, "$7" },
3565 { { "a4" }, "$8" },
3566 { { "a5" }, "$9" },
3567 { { "a6" }, "$10" },
3568 { { "a7" }, "$11" },
3569 { { "t0" }, "$12" },
3570 { { "t1" }, "$13" },
3571 { { "t2" }, "$14" },
3572 { { "t3" }, "$15" },
3573 { { "s0" }, "$16" },
3574 { { "s1" }, "$17" },
3575 { { "s2" }, "$18" },
3576 { { "s3" }, "$19" },
3577 { { "s4" }, "$20" },
3578 { { "s5" }, "$21" },
3579 { { "s6" }, "$22" },
3580 { { "s7" }, "$23" },
3581 { { "t8" }, "$24" },
3582 { { "t9" }, "$25" },
3583 { { "k0" }, "$26" },
3584 { { "k1" }, "$27" },
3585 { { "gp" }, "$28" },
3586 { { "sp" }, "$29" },
3587 { { "fp" }, "$30" },
3588 { { "ra" }, "$31" }
3589 };
3590 Aliases = GCCRegAliases;
3591 NumAliases = llvm::array_lengthof(GCCRegAliases);
3592 }
3593};
3594
3595class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3596 virtual void SetDescriptionString(const std::string &Name) {
3597 // Change DescriptionString only if ABI is n32.
3598 if (Name == "n32")
3599 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 +00003600 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3601 "v64:64:64-n32";
Akira Hatanakabef17452011-09-20 19:21:49 +00003602 }
3603public:
3604 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3605 // Default ABI is n64.
3606 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 +00003607 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3608 "v64:64:64-n32";
Akira Hatanakabef17452011-09-20 19:21:49 +00003609 }
3610 virtual void getTargetDefines(const LangOptions &Opts,
3611 MacroBuilder &Builder) const {
3612 DefineStd(Builder, "mips", Opts);
3613 Builder.defineMacro("_mips");
3614 DefineStd(Builder, "MIPSEB", Opts);
3615 Builder.defineMacro("_MIPSEB");
3616 Builder.defineMacro("__REGISTER_PREFIX__", "");
3617 getArchDefines(Opts, Builder);
3618 }
3619};
3620
3621class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3622 virtual void SetDescriptionString(const std::string &Name) {
3623 // Change DescriptionString only if ABI is n32.
3624 if (Name == "n32")
3625 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 +00003626 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
3627 "-v64:64:64-n32";
Akira Hatanakabef17452011-09-20 19:21:49 +00003628 }
3629public:
3630 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003631 // Default ABI is n64.
3632 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00003633 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 +00003634 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3635 "v64:64:64-n32";
Akira Hatanakabef17452011-09-20 19:21:49 +00003636 }
3637 virtual void getTargetDefines(const LangOptions &Opts,
3638 MacroBuilder &Builder) const {
3639 DefineStd(Builder, "mips", Opts);
3640 Builder.defineMacro("_mips");
3641 DefineStd(Builder, "MIPSEL", Opts);
3642 Builder.defineMacro("_MIPSEL");
3643 Builder.defineMacro("__REGISTER_PREFIX__", "");
3644 getArchDefines(Opts, Builder);
3645 }
3646};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003647} // end anonymous namespace.
3648
Ivan Krasindd7403e2011-08-24 20:22:22 +00003649namespace {
3650class PNaClTargetInfo : public TargetInfo {
3651public:
3652 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003653 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00003654 this->UserLabelPrefix = "";
3655 this->LongAlign = 32;
3656 this->LongWidth = 32;
3657 this->PointerAlign = 32;
3658 this->PointerWidth = 32;
3659 this->IntMaxType = TargetInfo::SignedLongLong;
3660 this->UIntMaxType = TargetInfo::UnsignedLongLong;
3661 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00003662 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00003663 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00003664 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00003665 this->SizeType = TargetInfo::UnsignedInt;
3666 this->PtrDiffType = TargetInfo::SignedInt;
3667 this->IntPtrType = TargetInfo::SignedInt;
David Meyerbfdbb252011-10-11 03:12:01 +00003668 this->RegParmMax = 2;
Ivan Krasindd7403e2011-08-24 20:22:22 +00003669 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3670 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3671 }
3672
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003673 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00003674 }
3675 virtual void getArchDefines(const LangOptions &Opts,
3676 MacroBuilder &Builder) const {
3677 Builder.defineMacro("__le32__");
3678 Builder.defineMacro("__pnacl__");
3679 }
3680 virtual void getTargetDefines(const LangOptions &Opts,
3681 MacroBuilder &Builder) const {
Ivan Krasin9b2cbdf2011-08-25 23:49:20 +00003682 DefineStd(Builder, "unix", Opts);
3683 Builder.defineMacro("__ELF__");
3684 if (Opts.POSIXThreads)
3685 Builder.defineMacro("_REENTRANT");
3686 if (Opts.CPlusPlus)
3687 Builder.defineMacro("_GNU_SOURCE");
3688
Ivan Krasindd7403e2011-08-24 20:22:22 +00003689 Builder.defineMacro("__native_client__");
3690 getArchDefines(Opts, Builder);
3691 }
3692 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3693 unsigned &NumRecords) const {
3694 }
3695 virtual const char *getVAListDeclaration() const {
Ivan Krasin96a80612011-09-20 14:56:54 +00003696 return "typedef int __builtin_va_list[4];";
Ivan Krasindd7403e2011-08-24 20:22:22 +00003697 }
3698 virtual void getGCCRegNames(const char * const *&Names,
3699 unsigned &NumNames) const;
3700 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3701 unsigned &NumAliases) const;
3702 virtual bool validateAsmConstraint(const char *&Name,
3703 TargetInfo::ConstraintInfo &Info) const {
3704 return false;
3705 }
3706
3707 virtual const char *getClobbers() const {
3708 return "";
3709 }
3710};
3711
3712void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
3713 unsigned &NumNames) const {
3714 Names = NULL;
3715 NumNames = 0;
3716}
3717
3718void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3719 unsigned &NumAliases) const {
3720 Aliases = NULL;
3721 NumAliases = 0;
3722}
3723} // end anonymous namespace.
3724
3725
Chris Lattner5ba61f02006-10-14 07:39:34 +00003726//===----------------------------------------------------------------------===//
3727// Driver code
3728//===----------------------------------------------------------------------===//
3729
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003730static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00003731 llvm::Triple Triple(T);
3732 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00003733
Daniel Dunbar52322032009-08-18 05:47:58 +00003734 switch (Triple.getArch()) {
3735 default:
3736 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00003737
Tony Linthicum76329bf2011-12-12 21:14:55 +00003738 case llvm::Triple::hexagon:
3739 return new HexagonTargetInfo(T);
3740
Daniel Dunbar52322032009-08-18 05:47:58 +00003741 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00003742 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003743 if (Triple.isOSDarwin())
3744 return new DarwinARMTargetInfo(T);
3745
Daniel Dunbar52322032009-08-18 05:47:58 +00003746 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00003747 case llvm::Triple::Linux:
3748 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003749 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00003750 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003751 case llvm::Triple::NetBSD:
3752 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00003753 case llvm::Triple::RTEMS:
3754 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003755 default:
3756 return new ARMTargetInfo(T);
3757 }
Eli Friedmanb5366062008-05-20 14:21:01 +00003758
Daniel Dunbar52322032009-08-18 05:47:58 +00003759 case llvm::Triple::msp430:
3760 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00003761
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003762 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003763 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003764 case llvm::Triple::Linux:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003765 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003766 case llvm::Triple::RTEMS:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003767 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003768 case llvm::Triple::FreeBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003769 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003770 case llvm::Triple::NetBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003771 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003772 default:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003773 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003774 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003775
3776 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003777 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003778 case llvm::Triple::Linux:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003779 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003780 case llvm::Triple::RTEMS:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003781 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003782 case llvm::Triple::FreeBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003783 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003784 case llvm::Triple::NetBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003785 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003786 default:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00003787 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003788 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003789
Akira Hatanakabef17452011-09-20 19:21:49 +00003790 case llvm::Triple::mips64:
3791 switch (os) {
3792 case llvm::Triple::Linux:
3793 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
3794 case llvm::Triple::RTEMS:
3795 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
3796 case llvm::Triple::FreeBSD:
3797 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
3798 case llvm::Triple::NetBSD:
3799 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
3800 default:
3801 return new Mips64EBTargetInfo(T);
3802 }
3803
3804 case llvm::Triple::mips64el:
3805 switch (os) {
3806 case llvm::Triple::Linux:
3807 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
3808 case llvm::Triple::RTEMS:
3809 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
3810 case llvm::Triple::FreeBSD:
3811 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
3812 case llvm::Triple::NetBSD:
3813 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
3814 default:
3815 return new Mips64ELTargetInfo(T);
3816 }
3817
Ivan Krasindd7403e2011-08-24 20:22:22 +00003818 case llvm::Triple::le32:
3819 switch (os) {
3820 case llvm::Triple::NativeClient:
3821 return new PNaClTargetInfo(T);
3822 default:
3823 return NULL;
3824 }
3825
Daniel Dunbar52322032009-08-18 05:47:58 +00003826 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003827 if (Triple.isOSDarwin())
Roman Divacky965b0b72011-01-06 08:27:10 +00003828 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003829 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00003830 case llvm::Triple::Linux:
3831 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003832 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00003833 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003834 case llvm::Triple::NetBSD:
3835 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
3836 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00003837 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003838 default:
3839 return new PPC32TargetInfo(T);
3840 }
Daniel Dunbar52322032009-08-18 05:47:58 +00003841
3842 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003843 if (Triple.isOSDarwin())
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00003844 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003845 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00003846 case llvm::Triple::Linux:
3847 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003848 case llvm::Triple::Lv2:
John Thompsone467e192009-11-19 17:18:50 +00003849 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003850 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00003851 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003852 case llvm::Triple::NetBSD:
3853 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
3854 default:
3855 return new PPC64TargetInfo(T);
3856 }
Daniel Dunbar52322032009-08-18 05:47:58 +00003857
Justin Holewinski514cce82011-04-20 19:34:15 +00003858 case llvm::Triple::ptx32:
3859 return new PTX32TargetInfo(T);
3860 case llvm::Triple::ptx64:
3861 return new PTX64TargetInfo(T);
3862
Chris Lattner5178f562010-03-06 21:21:27 +00003863 case llvm::Triple::mblaze:
3864 return new MBlazeTargetInfo(T);
3865
Daniel Dunbar52322032009-08-18 05:47:58 +00003866 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003867 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00003868 case llvm::Triple::Linux:
3869 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003870 case llvm::Triple::AuroraUX:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003871 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003872 case llvm::Triple::Solaris:
Daniel Dunbar52322032009-08-18 05:47:58 +00003873 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003874 case llvm::Triple::NetBSD:
3875 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
3876 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00003877 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003878 default:
3879 return new SparcV8TargetInfo(T);
3880 }
Daniel Dunbar52322032009-08-18 05:47:58 +00003881
John Thompsone467e192009-11-19 17:18:50 +00003882 // FIXME: Need a real SPU target.
3883 case llvm::Triple::cellspu:
3884 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
3885
Eli Friedmana9c3d712009-08-19 20:47:07 +00003886 case llvm::Triple::tce:
3887 return new TCETargetInfo(T);
3888
Daniel Dunbar52322032009-08-18 05:47:58 +00003889 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003890 if (Triple.isOSDarwin())
3891 return new DarwinI386TargetInfo(T);
3892
Daniel Dunbar52322032009-08-18 05:47:58 +00003893 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003894 case llvm::Triple::AuroraUX:
3895 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003896 case llvm::Triple::Linux:
3897 return new LinuxTargetInfo<X86_32TargetInfo>(T);
3898 case llvm::Triple::DragonFly:
3899 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
3900 case llvm::Triple::NetBSD:
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003901 return new NetBSDI386TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003902 case llvm::Triple::OpenBSD:
3903 return new OpenBSDI386TargetInfo(T);
3904 case llvm::Triple::FreeBSD:
3905 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00003906 case llvm::Triple::Minix:
3907 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003908 case llvm::Triple::Solaris:
3909 return new SolarisTargetInfo<X86_32TargetInfo>(T);
3910 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003911 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003912 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003913 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003914 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003915 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00003916 case llvm::Triple::Haiku:
3917 return new HaikuX86_32TargetInfo(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00003918 case llvm::Triple::RTEMS:
3919 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003920 default:
3921 return new X86_32TargetInfo(T);
3922 }
3923
3924 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003925 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
3926 return new DarwinX86_64TargetInfo(T);
3927
Daniel Dunbar52322032009-08-18 05:47:58 +00003928 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003929 case llvm::Triple::AuroraUX:
3930 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003931 case llvm::Triple::Linux:
3932 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00003933 case llvm::Triple::DragonFly:
3934 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003935 case llvm::Triple::NetBSD:
3936 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
3937 case llvm::Triple::OpenBSD:
3938 return new OpenBSDX86_64TargetInfo(T);
3939 case llvm::Triple::FreeBSD:
3940 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
3941 case llvm::Triple::Solaris:
3942 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00003943 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003944 return new MinGWX86_64TargetInfo(T);
3945 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003946 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003947 default:
3948 return new X86_64TargetInfo(T);
3949 }
3950 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003951}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003952
3953/// CreateTargetInfo - Return the target info object for the specified target
3954/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00003955TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00003956 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003957 llvm::Triple Triple(Opts.Triple);
3958
3959 // Construct the target
3960 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3961 if (!Target) {
3962 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3963 return 0;
3964 }
3965
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003966 // Set the target CPU if specified.
3967 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3968 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3969 return 0;
3970 }
3971
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003972 // Set the target ABI if specified.
3973 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3974 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3975 return 0;
3976 }
3977
Charles Davis95a546e2010-06-11 01:06:47 +00003978 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00003979 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00003980 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3981 return 0;
3982 }
3983
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003984 // Compute the default target features, we need the target to handle this
3985 // because features may have dependencies on one another.
3986 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003987 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003988
3989 // Apply the user specified deltas.
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003990 // First the enables.
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003991 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3992 ie = Opts.Features.end(); it != ie; ++it) {
3993 const char *Name = it->c_str();
3994
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003995 if (Name[0] != '+')
3996 continue;
3997
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003998 // Apply the feature via the target.
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003999 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
4000 Diags.Report(diag::err_target_invalid_feature) << Name;
4001 return 0;
4002 }
4003 }
4004
4005 // Then the disables.
4006 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4007 ie = Opts.Features.end(); it != ie; ++it) {
4008 const char *Name = it->c_str();
4009
4010 if (Name[0] == '+')
4011 continue;
4012
4013 // Apply the feature via the target.
4014 if (Name[0] != '-' ||
4015 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004016 Diags.Report(diag::err_target_invalid_feature) << Name;
4017 return 0;
4018 }
4019 }
4020
4021 // Add the features to the compile options.
4022 //
4023 // FIXME: If we are completely confident that we have the right set, we only
4024 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00004025 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004026 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
4027 ie = Features.end(); it != ie; ++it)
Chris Lattnerd386df42011-07-14 18:24:21 +00004028 Opts.Features.push_back(std::string(it->second ? "+" : "-") +
Chris Lattner2dc4b552011-07-14 18:45:41 +00004029 it->first().str());
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00004030 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004031
4032 return Target.take();
4033}