blob: 48e4d8a048ddec5afec13ff518803984b33fe291 [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"
Dale Johannesen182addf2010-10-29 23:24:33 +000029#include "llvm/Type.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Chris Lattner5ba61f02006-10-14 07:39:34 +000031using namespace clang;
32
Chris Lattner5ba61f02006-10-14 07:39:34 +000033//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000034// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
36
Chris Lattner1e1c0b92009-03-20 16:06:38 +000037/// DefineStd - Define a macro name and standard variants. For example if
38/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
39/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000040static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041 const LangOptions &Opts) {
42 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000043
Chris Lattner1e1c0b92009-03-20 16:06:38 +000044 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
45 // in the user's namespace.
46 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000047 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000048
Chris Lattner1e1c0b92009-03-20 16:06:38 +000049 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000050 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000051
Chris Lattner1e1c0b92009-03-20 16:06:38 +000052 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054}
55
Chris Lattner09d98f52008-10-05 21:50:58 +000056//===----------------------------------------------------------------------===//
57// Defines specific to certain operating systems.
58//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000059
Torok Edwinb2b37c62009-06-30 17:10:35 +000060namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000061template<typename TgtInfo>
62class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000063protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000064 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000065 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000066public:
Douglas Gregorc05d2a12009-07-01 15:12:53 +000067 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwinb2b37c62009-06-30 17:10:35 +000068 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000069 MacroBuilder &Builder) const {
70 TgtInfo::getTargetDefines(Opts, Builder);
71 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000072 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000073
74};
Chris Lattner859c37a2009-08-12 06:24:27 +000075} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000076
Chris Lattner30ba6742009-08-10 19:03:04 +000077
Daniel Dunbard86666f2010-01-26 01:44:04 +000078static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000079 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000080 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000081 VersionTuple &PlatformMinVersion) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 Builder.defineMacro("__APPLE_CC__", "5621");
83 Builder.defineMacro("__APPLE__");
84 Builder.defineMacro("__MACH__");
85 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000086
John McCall5d36a8c2011-06-16 00:03:19 +000087 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +000088 // __weak is always defined, for use in blocks and with objc pointers.
89 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000090
John McCall31168b02011-06-15 23:02:42 +000091 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +000092 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +000093 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
94 else
95 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +000096
John McCall31168b02011-06-15 23:02:42 +000097 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
98 // allow this in C, since one might have block pointers in structs that
99 // are used in pure C code and in Objective-C ARC.
100 Builder.defineMacro("__unsafe_unretained", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000101
John McCall31168b02011-06-15 23:02:42 +0000102 // The Objective-C bridged cast keywords are defined to nothing in non-ARC
103 // mode; then they become normal, C-style casts.
104 Builder.defineMacro("__bridge", "");
105 Builder.defineMacro("__bridge_transfer", "");
106 Builder.defineMacro("__bridge_retained", "");
John McCall0c329252011-06-17 21:23:37 +0000107 Builder.defineMacro("__bridge_retain", "");
John McCall31168b02011-06-15 23:02:42 +0000108 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000109
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000110 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000111 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000112 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000113 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000114
115 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000117
Daniel Dunbarecf13562011-04-19 21:40:34 +0000118 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000119 unsigned Maj, Min, Rev;
Mike Stump11289f42009-09-09 15:08:12 +0000120
Daniel Dunbard86666f2010-01-26 01:44:04 +0000121 // If no version was given, default to to 10.4.0, for simplifying tests.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000122 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
123 PlatformName = "macosx";
Daniel Dunbard86666f2010-01-26 01:44:04 +0000124 Min = Rev = 0;
125 Maj = 8;
Daniel Dunbarecf13562011-04-19 21:40:34 +0000126 } else {
127 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
128 // "-osxNNN", and "-iosNNN").
129
130 if (Triple.getOS() == llvm::Triple::Darwin) {
131 // For historical reasons that make little sense, the version passed here
132 // is the "darwin" version, which drops the 10 and offsets by 4.
133 Triple.getOSVersion(Maj, Min, Rev);
134
135 if (Triple.getEnvironmentName() == "iphoneos") {
136 PlatformName = "ios";
137 } else {
Daniel Dunbarecf13562011-04-19 21:40:34 +0000138 PlatformName = "macosx";
139 Rev = Min;
140 Min = Maj - 4;
141 Maj = 10;
142 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000143 } else {
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 Triple.getOSVersion(Maj, Min, Rev);
Daniel Dunbarfcd23892011-04-19 23:34:21 +0000145 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000146 }
147 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000148
Chad Rosierb90e4022011-07-19 20:00:06 +0000149 // If -ccc-host-triple arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000150 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000151 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
152 if (PlatformName == "win32") {
153 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
154 return;
155 }
156
Daniel Dunbard86666f2010-01-26 01:44:04 +0000157 // Set the appropriate OS version define.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000158 if (PlatformName == "ios") {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000159 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000160 char Str[6];
161 Str[0] = '0' + Maj;
162 Str[1] = '0' + (Min / 10);
163 Str[2] = '0' + (Min % 10);
164 Str[3] = '0' + (Rev / 10);
165 Str[4] = '0' + (Rev % 10);
166 Str[5] = '\0';
167 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
168 } else {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000169 // Note that the Driver allows versions which aren't representable in the
170 // define (because we only get a single digit for the minor and micro
171 // revision numbers). So, we limit them to the maximum representable
172 // version.
Daniel Dunbard86666f2010-01-26 01:44:04 +0000173 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000174 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000175 char Str[5];
176 Str[0] = '0' + (Maj / 10);
177 Str[1] = '0' + (Maj % 10);
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000178 Str[2] = '0' + std::min(Min, 9U);
179 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbard86666f2010-01-26 01:44:04 +0000180 Str[4] = '\0';
181 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000182 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000183
184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000185}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000186
Chris Lattner30ba6742009-08-10 19:03:04 +0000187namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000188template<typename Target>
189class DarwinTargetInfo : public OSTargetInfo<Target> {
190protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000191 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000192 MacroBuilder &Builder) const {
Eric Christopher0c912c52011-07-07 22:55:26 +0000193 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000194 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000195 }
Mike Stump11289f42009-09-09 15:08:12 +0000196
Torok Edwinb2b37c62009-06-30 17:10:35 +0000197public:
198 DarwinTargetInfo(const std::string& triple) :
199 OSTargetInfo<Target>(triple) {
Eric Christopherbf15d2b2011-07-02 00:20:22 +0000200 llvm::Triple T = llvm::Triple(triple);
201 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbar13adc7f2011-02-21 23:12:51 +0000202 this->MCountName = "\01mcount";
Torok Edwinb2b37c62009-06-30 17:10:35 +0000203 }
204
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000205 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000206 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000207 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000208 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000209 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000210 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000211 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000212 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000213
Anders Carlsson851318a2010-06-08 22:47:50 +0000214 virtual const char *getStaticInitSectionSpecifier() const {
215 // FIXME: We should return 0 when building kexts.
216 return "__TEXT,__StaticInit,regular,pure_instructions";
217 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000218
Torok Edwinb2b37c62009-06-30 17:10:35 +0000219};
220
Chris Lattner30ba6742009-08-10 19:03:04 +0000221
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222// DragonFlyBSD Target
223template<typename Target>
224class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
225protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000226 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000227 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000228 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000229 Builder.defineMacro("__DragonFly__");
230 Builder.defineMacro("__DragonFly_cc_version", "100001");
231 Builder.defineMacro("__ELF__");
232 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
233 Builder.defineMacro("__tune_i386__");
234 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000235 }
236public:
Mike Stump11289f42009-09-09 15:08:12 +0000237 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000238 : OSTargetInfo<Target>(triple) {}
239};
240
241// FreeBSD Target
242template<typename Target>
243class FreeBSDTargetInfo : public OSTargetInfo<Target> {
244protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000245 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000246 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000247 // FreeBSD defines; list based off of gcc output
248
Daniel Dunbar40165182009-08-24 09:10:05 +0000249 // FIXME: Move version number handling to llvm::Triple.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000250 StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000251
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000252 Builder.defineMacro("__FreeBSD__", Release);
253 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000254 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
255 DefineStd(Builder, "unix", Opts);
256 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000257 }
258public:
Mike Stump11289f42009-09-09 15:08:12 +0000259 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000260 : OSTargetInfo<Target>(triple) {
261 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000262
263 llvm::Triple Triple(triple);
264 switch (Triple.getArch()) {
265 default:
266 case llvm::Triple::x86:
267 case llvm::Triple::x86_64:
268 this->MCountName = ".mcount";
269 break;
270 case llvm::Triple::mips:
271 case llvm::Triple::mipsel:
272 case llvm::Triple::ppc:
273 case llvm::Triple::ppc64:
274 this->MCountName = "_mcount";
275 break;
276 case llvm::Triple::arm:
277 this->MCountName = "__mcount";
278 break;
279 }
280
Duncan Sands9cb27e92009-07-08 13:55:08 +0000281 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282};
283
Chris Lattner3e2ee142010-07-07 16:01:42 +0000284// Minix Target
285template<typename Target>
286class MinixTargetInfo : public OSTargetInfo<Target> {
287protected:
288 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
289 MacroBuilder &Builder) const {
290 // Minix defines
291
292 Builder.defineMacro("__minix", "3");
293 Builder.defineMacro("_EM_WSIZE", "4");
294 Builder.defineMacro("_EM_PSIZE", "4");
295 Builder.defineMacro("_EM_SSIZE", "2");
296 Builder.defineMacro("_EM_LSIZE", "4");
297 Builder.defineMacro("_EM_FSIZE", "4");
298 Builder.defineMacro("_EM_DSIZE", "8");
299 DefineStd(Builder, "unix", Opts);
300 }
301public:
302 MinixTargetInfo(const std::string &triple)
303 : OSTargetInfo<Target>(triple) {
304 this->UserLabelPrefix = "";
305 }
306};
307
Torok Edwinb2b37c62009-06-30 17:10:35 +0000308// Linux target
309template<typename Target>
310class LinuxTargetInfo : public OSTargetInfo<Target> {
311protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000312 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000313 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000314 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000315 DefineStd(Builder, "unix", Opts);
316 DefineStd(Builder, "linux", Opts);
317 Builder.defineMacro("__gnu_linux__");
318 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000319 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000320 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000321 if (Opts.CPlusPlus)
322 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000323 }
324public:
Mike Stump11289f42009-09-09 15:08:12 +0000325 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000326 : OSTargetInfo<Target>(triple) {
327 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000328 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000329 }
330};
331
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000332// NetBSD Target
333template<typename Target>
334class NetBSDTargetInfo : public OSTargetInfo<Target> {
335protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000336 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000337 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000338 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000339 Builder.defineMacro("__NetBSD__");
340 Builder.defineMacro("__unix__");
341 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000342 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000343 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000344 }
345public:
Mike Stump11289f42009-09-09 15:08:12 +0000346 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000347 : OSTargetInfo<Target>(triple) {
348 this->UserLabelPrefix = "";
349 }
350};
351
Torok Edwinb2b37c62009-06-30 17:10:35 +0000352// OpenBSD Target
353template<typename Target>
354class OpenBSDTargetInfo : public OSTargetInfo<Target> {
355protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000356 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000357 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000358 // OpenBSD defines; list based off of gcc output
359
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000360 Builder.defineMacro("__OpenBSD__");
361 DefineStd(Builder, "unix", Opts);
362 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000363 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000364 Builder.defineMacro("_POSIX_THREADS");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000365 }
366public:
Mike Stump11289f42009-09-09 15:08:12 +0000367 OpenBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368 : OSTargetInfo<Target>(triple) {}
369};
370
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000371// PSP Target
372template<typename Target>
373class PSPTargetInfo : public OSTargetInfo<Target> {
374protected:
375 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000376 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000377 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000378 Builder.defineMacro("PSP");
379 Builder.defineMacro("_PSP");
380 Builder.defineMacro("__psp__");
381 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000382 }
383public:
384 PSPTargetInfo(const std::string& triple)
385 : OSTargetInfo<Target>(triple) {
386 this->UserLabelPrefix = "";
387 }
388};
389
John Thompsone467e192009-11-19 17:18:50 +0000390// PS3 PPU Target
391template<typename Target>
392class PS3PPUTargetInfo : public OSTargetInfo<Target> {
393protected:
394 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000395 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000396 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000397 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000398 Builder.defineMacro("__PPU__");
399 Builder.defineMacro("__CELLOS_LV2__");
400 Builder.defineMacro("__ELF__");
401 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000402 Builder.defineMacro("_ARCH_PPC64");
403 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000404 }
405public:
406 PS3PPUTargetInfo(const std::string& triple)
407 : OSTargetInfo<Target>(triple) {
408 this->UserLabelPrefix = "";
John Thompson6f8dba72009-12-18 14:21:08 +0000409 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000410 this->IntMaxType = TargetInfo::SignedLongLong;
411 this->UIntMaxType = TargetInfo::UnsignedLongLong;
412 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000413 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000414 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
415 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000416 }
417};
418
419// FIXME: Need a real SPU target.
420// PS3 SPU Target
421template<typename Target>
422class PS3SPUTargetInfo : public OSTargetInfo<Target> {
423protected:
424 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000425 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000426 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000427 Builder.defineMacro("__SPU__");
428 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000429 }
430public:
431 PS3SPUTargetInfo(const std::string& triple)
432 : OSTargetInfo<Target>(triple) {
433 this->UserLabelPrefix = "";
434 }
435};
436
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000437// AuroraUX target
438template<typename Target>
439class AuroraUXTargetInfo : public OSTargetInfo<Target> {
440protected:
441 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000442 MacroBuilder &Builder) const {
443 DefineStd(Builder, "sun", Opts);
444 DefineStd(Builder, "unix", Opts);
445 Builder.defineMacro("__ELF__");
446 Builder.defineMacro("__svr4__");
447 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000448 }
449public:
450 AuroraUXTargetInfo(const std::string& triple)
451 : OSTargetInfo<Target>(triple) {
452 this->UserLabelPrefix = "";
453 this->WCharType = this->SignedLong;
454 // FIXME: WIntType should be SignedLong
455 }
456};
457
Torok Edwinb2b37c62009-06-30 17:10:35 +0000458// Solaris target
459template<typename Target>
460class SolarisTargetInfo : public OSTargetInfo<Target> {
461protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000462 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000463 MacroBuilder &Builder) const {
464 DefineStd(Builder, "sun", Opts);
465 DefineStd(Builder, "unix", Opts);
466 Builder.defineMacro("__ELF__");
467 Builder.defineMacro("__svr4__");
468 Builder.defineMacro("__SVR4");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000469 }
470public:
Mike Stump11289f42009-09-09 15:08:12 +0000471 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000472 : OSTargetInfo<Target>(triple) {
473 this->UserLabelPrefix = "";
474 this->WCharType = this->SignedLong;
475 // FIXME: WIntType should be SignedLong
476 }
477};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000478
479// Windows target
480template<typename Target>
481class WindowsTargetInfo : public OSTargetInfo<Target> {
482protected:
483 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
484 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000485 Builder.defineMacro("_WIN32");
486 }
487 void getVisualStudioDefines(const LangOptions &Opts,
488 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000489 if (Opts.CPlusPlus) {
490 if (Opts.RTTI)
491 Builder.defineMacro("_CPPRTTI");
492
493 if (Opts.Exceptions)
494 Builder.defineMacro("_CPPUNWIND");
495 }
496
497 if (!Opts.CharIsSigned)
498 Builder.defineMacro("_CHAR_UNSIGNED");
499
500 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
501 // but it works for now.
502 if (Opts.POSIXThreads)
503 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000504
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000505 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000506 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000507
Francois Pichet0706d202011-09-17 17:15:52 +0000508 if (Opts.MicrosoftExt) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000509 Builder.defineMacro("_MSC_EXTENSIONS");
510
511 if (Opts.CPlusPlus0x) {
512 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
513 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
514 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
515 }
516 }
517
518 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000519 }
520
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000521public:
522 WindowsTargetInfo(const std::string &triple)
523 : OSTargetInfo<Target>(triple) {}
524};
525
Mike Stump11289f42009-09-09 15:08:12 +0000526} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000527
Chris Lattner09d98f52008-10-05 21:50:58 +0000528//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000529// Specific target implementations.
530//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000531
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000532namespace {
533// PPC abstract base class
534class PPCTargetInfo : public TargetInfo {
535 static const Builtin::Info BuiltinInfo[];
536 static const char * const GCCRegNames[];
537 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000538public:
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000539 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
540
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000541 virtual void getTargetBuiltins(const Builtin::Info *&Records,
542 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000543 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000544 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000545 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000546
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000547 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000548 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000549
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000550 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000551 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000552 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000553 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000554 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000555 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000556 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000557 default: return false;
558 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000559 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000560 case 'b': // Base register
561 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000562 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000563 break;
564 // FIXME: The following are added to allow parsing.
565 // I just took a guess at what the actions should be.
566 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000567 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000568 case 'v': // Altivec vector register
569 Info.setAllowsRegister();
570 break;
571 case 'w':
572 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000573 case 'd':// VSX vector register to hold vector double data
574 case 'f':// VSX vector register to hold vector float data
575 case 's':// VSX vector register to hold scalar float data
576 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000577 break;
578 default:
579 return false;
580 }
581 Info.setAllowsRegister();
582 Name++; // Skip over 'w'.
583 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000584 case 'h': // `MQ', `CTR', or `LINK' register
585 case 'q': // `MQ' register
586 case 'c': // `CTR' register
587 case 'l': // `LINK' register
588 case 'x': // `CR' register (condition register) number 0
589 case 'y': // `CR' register (condition register)
590 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000591 Info.setAllowsRegister();
592 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000593 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000594 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000595 // (use `L' instead for SImode constants)
596 case 'K': // Unsigned 16-bit constant
597 case 'L': // Signed 16-bit constant shifted left 16 bits
598 case 'M': // Constant larger than 31
599 case 'N': // Exact power of 2
600 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000601 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000602 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000603 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000604 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000605 break;
606 case 'm': // Memory operand. Note that on PowerPC targets, m can
607 // include addresses that update the base register. It
608 // is therefore only safe to use `m' in an asm statement
609 // if that asm statement accesses the operand exactly once.
610 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000611 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000612 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000613 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000614 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000615 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
616 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000617 // register to be updated.
618 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000619 if (Name[1] != 's')
620 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000621 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000622 // include any automodification of the base register. Unlike
623 // `m', this constraint can be used in asm statements that
624 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000625 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000626 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000627 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000628 break;
629 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000630 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000631 case 'Z': // Memory operand that is an indexed or indirect from a
632 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000633 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000634 Info.setAllowsMemory();
635 Info.setAllowsRegister();
636 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000637 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000638 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000639 // register (`p' is preferable for asm statements)
640 case 'S': // Constant suitable as a 64-bit mask operand
641 case 'T': // Constant suitable as a 32-bit mask operand
642 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000643 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000644 // instructions
645 case 'W': // Vector constant that does not require memory
646 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000647 break;
648 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000649 }
John Thompson07a61a42010-06-24 22:44:13 +0000650 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000651 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000652 virtual const char *getClobbers() const {
653 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000654 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000655};
Anders Carlssonf511f642007-11-27 04:11:28 +0000656
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000657const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000658#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000659#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000660 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000661#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000662};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000663
664
Chris Lattnerecd49032009-03-02 22:27:17 +0000665/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
666/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000667void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000668 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000669 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000670 Builder.defineMacro("__ppc__");
671 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000672 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000673 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000674 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000675 Builder.defineMacro("_ARCH_PPC64");
676 Builder.defineMacro("_LP64");
677 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000678 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000679 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000680 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000681 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000682 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000683
Chris Lattnerecd49032009-03-02 22:27:17 +0000684 // Target properties.
Joerg Sonnenberger870b3c52011-07-05 14:56:12 +0000685 if (getTriple().getOS() != llvm::Triple::NetBSD)
686 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000687 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000688
Chris Lattnerecd49032009-03-02 22:27:17 +0000689 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000690 Builder.defineMacro("__NATURAL_ALIGNMENT__");
691 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000692
Chris Lattnerecd49032009-03-02 22:27:17 +0000693 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000694 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000695
John Thompsone467e192009-11-19 17:18:50 +0000696 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000697 Builder.defineMacro("__VEC__", "10206");
698 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000699 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000700}
701
Chris Lattner17df24e2008-04-21 18:56:49 +0000702
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000703const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000704 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
705 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
706 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
707 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
708 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
709 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
710 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
711 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000712 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000713 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000714 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000715 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
716 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
717 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
718 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000719 "vrsave", "vscr",
720 "spe_acc", "spefscr",
721 "sfp"
722};
Chris Lattner10a5b382007-01-29 05:24:35 +0000723
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000724void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000725 unsigned &NumNames) const {
726 Names = GCCRegNames;
727 NumNames = llvm::array_lengthof(GCCRegNames);
728}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000729
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000730const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
731 // While some of these aliases do map to different registers
732 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000733 { { "0" }, "r0" },
734 { { "1"}, "r1" },
735 { { "2" }, "r2" },
736 { { "3" }, "r3" },
737 { { "4" }, "r4" },
738 { { "5" }, "r5" },
739 { { "6" }, "r6" },
740 { { "7" }, "r7" },
741 { { "8" }, "r8" },
742 { { "9" }, "r9" },
743 { { "10" }, "r10" },
744 { { "11" }, "r11" },
745 { { "12" }, "r12" },
746 { { "13" }, "r13" },
747 { { "14" }, "r14" },
748 { { "15" }, "r15" },
749 { { "16" }, "r16" },
750 { { "17" }, "r17" },
751 { { "18" }, "r18" },
752 { { "19" }, "r19" },
753 { { "20" }, "r20" },
754 { { "21" }, "r21" },
755 { { "22" }, "r22" },
756 { { "23" }, "r23" },
757 { { "24" }, "r24" },
758 { { "25" }, "r25" },
759 { { "26" }, "r26" },
760 { { "27" }, "r27" },
761 { { "28" }, "r28" },
762 { { "29" }, "r29" },
763 { { "30" }, "r30" },
764 { { "31" }, "r31" },
765 { { "fr0" }, "f0" },
766 { { "fr1" }, "f1" },
767 { { "fr2" }, "f2" },
768 { { "fr3" }, "f3" },
769 { { "fr4" }, "f4" },
770 { { "fr5" }, "f5" },
771 { { "fr6" }, "f6" },
772 { { "fr7" }, "f7" },
773 { { "fr8" }, "f8" },
774 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000775 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000776 { { "fr11" }, "f11" },
777 { { "fr12" }, "f12" },
778 { { "fr13" }, "f13" },
779 { { "fr14" }, "f14" },
780 { { "fr15" }, "f15" },
781 { { "fr16" }, "f16" },
782 { { "fr17" }, "f17" },
783 { { "fr18" }, "f18" },
784 { { "fr19" }, "f19" },
785 { { "fr20" }, "f20" },
786 { { "fr21" }, "f21" },
787 { { "fr22" }, "f22" },
788 { { "fr23" }, "f23" },
789 { { "fr24" }, "f24" },
790 { { "fr25" }, "f25" },
791 { { "fr26" }, "f26" },
792 { { "fr27" }, "f27" },
793 { { "fr28" }, "f28" },
794 { { "fr29" }, "f29" },
795 { { "fr30" }, "f30" },
796 { { "fr31" }, "f31" },
797 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000798};
799
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000800void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000801 unsigned &NumAliases) const {
802 Aliases = GCCRegAliases;
803 NumAliases = llvm::array_lengthof(GCCRegAliases);
804}
805} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000806
Chris Lattner5ba61f02006-10-14 07:39:34 +0000807namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000808class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000809public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000810 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000811 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 +0000812 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000813
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +0000814 switch (getTriple().getOS()) {
815 case llvm::Triple::FreeBSD:
816 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +0000817 SizeType = UnsignedInt;
818 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +0000819 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +0000820 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +0000821 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000822 }
823
824 virtual const char *getVAListDeclaration() const {
825 // This is the ELF definition, and is overridden by the Darwin sub-target
826 return "typedef struct __va_list_tag {"
827 " unsigned char gpr;"
828 " unsigned char fpr;"
829 " unsigned short reserved;"
830 " void* overflow_arg_area;"
831 " void* reg_save_area;"
832 "} __builtin_va_list[1];";
Eli Friedman873f65a2008-08-21 00:13:15 +0000833 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000834};
835} // end anonymous namespace.
836
837namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000838class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000839public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000840 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000841 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000842 IntMaxType = SignedLong;
843 UIntMaxType = UnsignedLong;
844 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000845 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 +0000846 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000847 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000848 virtual const char *getVAListDeclaration() const {
849 return "typedef char* __builtin_va_list;";
850 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000851};
852} // end anonymous namespace.
853
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000854
855namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +0000856class DarwinPPC32TargetInfo :
857 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000858public:
Roman Divacky965b0b72011-01-06 08:27:10 +0000859 DarwinPPC32TargetInfo(const std::string& triple)
860 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000861 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +0000862 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
863 }
864 virtual const char *getVAListDeclaration() const {
865 return "typedef char* __builtin_va_list;";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000866 }
867};
868
869class DarwinPPC64TargetInfo :
870 public DarwinTargetInfo<PPC64TargetInfo> {
871public:
872 DarwinPPC64TargetInfo(const std::string& triple)
873 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
874 HasAlignMac68kSupport = true;
875 }
876};
877} // end anonymous namespace.
878
Chris Lattner5ba61f02006-10-14 07:39:34 +0000879namespace {
Justin Holewinski514cce82011-04-20 19:34:15 +0000880 class PTXTargetInfo : public TargetInfo {
881 static const char * const GCCRegNames[];
882 static const Builtin::Info BuiltinInfo[];
883 public:
884 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
885 TLSSupported = false;
886 LongWidth = LongAlign = 64;
887 }
888 virtual void getTargetDefines(const LangOptions &Opts,
889 MacroBuilder &Builder) const {
890 Builder.defineMacro("__PTX__");
891 }
892 virtual void getTargetBuiltins(const Builtin::Info *&Records,
893 unsigned &NumRecords) const {
894 Records = BuiltinInfo;
895 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
896 }
897
898 virtual void getGCCRegNames(const char * const *&Names,
899 unsigned &NumNames) const;
900 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
901 unsigned &NumAliases) const {
902 // No aliases.
903 Aliases = 0;
904 NumAliases = 0;
905 }
906 virtual bool validateAsmConstraint(const char *&Name,
907 TargetInfo::ConstraintInfo &info) const {
908 // FIXME: implement
909 return true;
910 }
911 virtual const char *getClobbers() const {
912 // FIXME: Is this really right?
913 return "";
914 }
915 virtual const char *getVAListDeclaration() const {
916 // FIXME: implement
917 return "typedef char* __builtin_va_list;";
918 }
Justin Holewinskiaa78b232011-09-15 12:13:38 +0000919
920 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
921 const std::string &Name,
922 bool Enabled) const;
Justin Holewinski514cce82011-04-20 19:34:15 +0000923 };
924
925 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000926#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski514cce82011-04-20 19:34:15 +0000927#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000928 ALL_LANGUAGES },
Justin Holewinski514cce82011-04-20 19:34:15 +0000929#include "clang/Basic/BuiltinsPTX.def"
930 };
931
932 const char * const PTXTargetInfo::GCCRegNames[] = {
933 "r0"
934 };
935
936 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
937 unsigned &NumNames) const {
938 Names = GCCRegNames;
939 NumNames = llvm::array_lengthof(GCCRegNames);
940 }
941
Justin Holewinskiaa78b232011-09-15 12:13:38 +0000942 bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
943 const std::string &Name,
944 bool Enabled) const {
945 if (Enabled) {
946 if (Name == "double")
947 Features["double"] = true;
948 else if (Name == "no-fma")
949 Features["no-fma"] = true;
950 else if (Name == "compute10")
951 Features["compute10"] = true;
952 else if (Name == "compute11")
953 Features["compute11"] = true;
954 else if (Name == "compute12")
955 Features["compute12"] = true;
956 else if (Name == "compute13")
957 Features["compute13"] = true;
958 else if (Name == "compute20")
959 Features["compute20"] = true;
960 else if (Name == "ptx20")
961 Features["ptx20"] = true;
962 else if (Name == "ptx21")
963 Features["ptx21"] = true;
964 else if (Name == "ptx22")
965 Features["ptx22"] = true;
966 else if (Name == "ptx23")
967 Features["ptx23"] = true;
968 else if (Name == "sm10")
969 Features["sm10"] = true;
970 else if (Name == "sm11")
971 Features["sm11"] = true;
972 else if (Name == "sm12")
973 Features["sm12"] = true;
974 else if (Name == "sm13")
975 Features["sm13"] = true;
976 else if (Name == "sm20")
977 Features["sm20"] = true;
978 else if (Name == "sm21")
979 Features["sm21"] = true;
980 else if (Name == "sm22")
981 Features["sm22"] = true;
982 else if (Name == "sm23")
983 Features["sm23"] = true;
984 } else {
985 if (Name == "double")
986 Features["double"] = false;
987 else if (Name == "no-fma")
988 Features["no-fma"] = false;
989 else if (Name == "compute10")
990 Features["compute10"] = false;
991 else if (Name == "compute11")
992 Features["compute11"] = false;
993 else if (Name == "compute12")
994 Features["compute12"] = false;
995 else if (Name == "compute13")
996 Features["compute13"] = false;
997 else if (Name == "compute20")
998 Features["compute20"] = false;
999 else if (Name == "ptx20")
1000 Features["ptx20"] = false;
1001 else if (Name == "ptx21")
1002 Features["ptx21"] = false;
1003 else if (Name == "ptx22")
1004 Features["ptx22"] = false;
1005 else if (Name == "ptx23")
1006 Features["ptx23"] = false;
1007 else if (Name == "sm10")
1008 Features["sm10"] = false;
1009 else if (Name == "sm11")
1010 Features["sm11"] = false;
1011 else if (Name == "sm12")
1012 Features["sm12"] = false;
1013 else if (Name == "sm13")
1014 Features["sm13"] = false;
1015 else if (Name == "sm20")
1016 Features["sm20"] = false;
1017 else if (Name == "sm21")
1018 Features["sm21"] = false;
1019 else if (Name == "sm22")
1020 Features["sm22"] = false;
1021 else if (Name == "sm23")
1022 Features["sm23"] = false;
1023 }
1024
1025 return true;
1026 }
Justin Holewinski514cce82011-04-20 19:34:15 +00001027
1028 class PTX32TargetInfo : public PTXTargetInfo {
1029 public:
1030 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1031 PointerWidth = PointerAlign = 32;
1032 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1033 DescriptionString
1034 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
1035 }
1036 };
1037
1038 class PTX64TargetInfo : public PTXTargetInfo {
1039 public:
1040 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1041 PointerWidth = PointerAlign = 64;
1042 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1043 DescriptionString
1044 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
1045 }
1046 };
1047}
1048
1049namespace {
Chris Lattner5178f562010-03-06 21:21:27 +00001050// MBlaze abstract base class
1051class MBlazeTargetInfo : public TargetInfo {
1052 static const char * const GCCRegNames[];
1053 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1054
1055public:
1056 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +00001057 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +00001058 }
1059
1060 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1061 unsigned &NumRecords) const {
1062 // FIXME: Implement.
1063 Records = 0;
1064 NumRecords = 0;
1065 }
1066
1067 virtual void getTargetDefines(const LangOptions &Opts,
1068 MacroBuilder &Builder) const;
1069
1070 virtual const char *getVAListDeclaration() const {
1071 return "typedef char* __builtin_va_list;";
1072 }
1073 virtual const char *getTargetPrefix() const {
1074 return "mblaze";
1075 }
1076 virtual void getGCCRegNames(const char * const *&Names,
1077 unsigned &NumNames) const;
1078 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1079 unsigned &NumAliases) const;
1080 virtual bool validateAsmConstraint(const char *&Name,
1081 TargetInfo::ConstraintInfo &Info) const {
1082 switch (*Name) {
1083 default: return false;
1084 case 'O': // Zero
1085 return true;
1086 case 'b': // Base register
1087 case 'f': // Floating point register
1088 Info.setAllowsRegister();
1089 return true;
1090 }
1091 }
1092 virtual const char *getClobbers() const {
1093 return "";
1094 }
1095};
1096
1097/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1098/// #defines that are not tied to a specific subtarget.
1099void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1100 MacroBuilder &Builder) const {
1101 // Target identification.
1102 Builder.defineMacro("__microblaze__");
1103 Builder.defineMacro("_ARCH_MICROBLAZE");
1104 Builder.defineMacro("__MICROBLAZE__");
1105
1106 // Target properties.
1107 Builder.defineMacro("_BIG_ENDIAN");
1108 Builder.defineMacro("__BIG_ENDIAN__");
1109
1110 // Subtarget options.
1111 Builder.defineMacro("__REGISTER_PREFIX__", "");
1112}
1113
1114
1115const char * const MBlazeTargetInfo::GCCRegNames[] = {
1116 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1117 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1118 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1119 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1120 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1121 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1122 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1123 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1124 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1125 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1126};
1127
1128void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1129 unsigned &NumNames) const {
1130 Names = GCCRegNames;
1131 NumNames = llvm::array_lengthof(GCCRegNames);
1132}
1133
1134const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1135 { {"f0"}, "r0" },
1136 { {"f1"}, "r1" },
1137 { {"f2"}, "r2" },
1138 { {"f3"}, "r3" },
1139 { {"f4"}, "r4" },
1140 { {"f5"}, "r5" },
1141 { {"f6"}, "r6" },
1142 { {"f7"}, "r7" },
1143 { {"f8"}, "r8" },
1144 { {"f9"}, "r9" },
1145 { {"f10"}, "r10" },
1146 { {"f11"}, "r11" },
1147 { {"f12"}, "r12" },
1148 { {"f13"}, "r13" },
1149 { {"f14"}, "r14" },
1150 { {"f15"}, "r15" },
1151 { {"f16"}, "r16" },
1152 { {"f17"}, "r17" },
1153 { {"f18"}, "r18" },
1154 { {"f19"}, "r19" },
1155 { {"f20"}, "r20" },
1156 { {"f21"}, "r21" },
1157 { {"f22"}, "r22" },
1158 { {"f23"}, "r23" },
1159 { {"f24"}, "r24" },
1160 { {"f25"}, "r25" },
1161 { {"f26"}, "r26" },
1162 { {"f27"}, "r27" },
1163 { {"f28"}, "r28" },
1164 { {"f29"}, "r29" },
1165 { {"f30"}, "r30" },
1166 { {"f31"}, "r31" },
1167};
1168
1169void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1170 unsigned &NumAliases) const {
1171 Aliases = GCCRegAliases;
1172 NumAliases = llvm::array_lengthof(GCCRegAliases);
1173}
1174} // end anonymous namespace.
1175
1176namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001177// Namespace for x86 abstract base class
1178const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001179#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001180#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001181 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001182#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001183};
Eli Friedmanb5366062008-05-20 14:21:01 +00001184
Nuno Lopescfca1f02009-12-23 17:49:57 +00001185static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001186 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1187 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001188 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001189 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1190 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1191 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001192 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001193};
1194
Eric Christophercdd36352011-06-21 00:05:20 +00001195const TargetInfo::AddlRegName AddlRegNames[] = {
1196 { { "al", "ah", "eax", "rax" }, 0 },
1197 { { "bl", "bh", "ebx", "rbx" }, 3 },
1198 { { "cl", "ch", "ecx", "rcx" }, 2 },
1199 { { "dl", "dh", "edx", "rdx" }, 1 },
1200 { { "esi", "rsi" }, 4 },
1201 { { "edi", "rdi" }, 5 },
1202 { { "esp", "rsp" }, 7 },
1203 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001204};
1205
1206// X86 target abstract base class; x86-32 and x86-64 are very close, so
1207// most of the implementation can be shared.
1208class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001209 enum X86SSEEnum {
Eli Friedman33465822011-07-08 23:31:17 +00001210 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
Chris Lattner96e43572009-03-02 22:40:39 +00001211 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001212 enum MMX3DNowEnum {
1213 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1214 } MMX3DNowLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001215
Eric Christophere1ddaf92010-04-02 23:50:19 +00001216 bool HasAES;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001217 bool HasAVX;
1218
Eli Friedman3fd920a2008-08-20 02:34:37 +00001219public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001220 X86TargetInfo(const std::string& triple)
Eli Friedman33465822011-07-08 23:31:17 +00001221 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001222 HasAES(false), HasAVX(false) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001223 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001224 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001225 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1226 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001227 Records = BuiltinInfo;
1228 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001229 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001230 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001231 unsigned &NumNames) const {
1232 Names = GCCRegNames;
1233 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001234 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001235 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001236 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001237 Aliases = 0;
1238 NumAliases = 0;
1239 }
1240 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1241 unsigned &NumNames) const {
1242 Names = AddlRegNames;
1243 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001244 }
Anders Carlsson58436352009-02-28 17:11:49 +00001245 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001246 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001247 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001248 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001249 return "~{dirflag},~{fpsr},~{flags}";
1250 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001251 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001252 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001253 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1254 const std::string &Name,
1255 bool Enabled) const;
Mike Stump11289f42009-09-09 15:08:12 +00001256 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001257 llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001258 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedman33465822011-07-08 23:31:17 +00001259 virtual const char* getABI() const {
1260 return MMX3DNowLevel == NoMMX3DNow ? "no-mmx" : "";
1261 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001262};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001263
Mike Stump11289f42009-09-09 15:08:12 +00001264void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001265 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001266 // FIXME: This should not be here.
1267 Features["3dnow"] = false;
1268 Features["3dnowa"] = false;
1269 Features["mmx"] = false;
1270 Features["sse"] = false;
1271 Features["sse2"] = false;
1272 Features["sse3"] = false;
1273 Features["ssse3"] = false;
1274 Features["sse41"] = false;
1275 Features["sse42"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001276 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001277 Features["avx"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001278
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001279 // LLVM does not currently recognize this.
1280 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001281
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001282 // FIXME: This *really* should not be here.
1283
1284 // X86_64 always has SSE2.
1285 if (PointerWidth == 64)
1286 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1287
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001288 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1289 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1290 ;
1291 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1292 setFeatureEnabled(Features, "mmx", true);
Eli Friedman33465822011-07-08 23:31:17 +00001293 else if (CPU == "pentium3") {
1294 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001295 setFeatureEnabled(Features, "sse", true);
Eli Friedman33465822011-07-08 23:31:17 +00001296 } else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64") {
1297 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001298 setFeatureEnabled(Features, "sse2", true);
Eli Friedman33465822011-07-08 23:31:17 +00001299 } else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona") {
1300 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001301 setFeatureEnabled(Features, "sse3", true);
Eli Friedman33465822011-07-08 23:31:17 +00001302 } else if (CPU == "core2") {
1303 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001304 setFeatureEnabled(Features, "ssse3", true);
Eli Friedman33465822011-07-08 23:31:17 +00001305 } else if (CPU == "penryn") {
1306 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001307 setFeatureEnabled(Features, "sse4", true);
1308 Features["sse42"] = false;
Eli Friedman33465822011-07-08 23:31:17 +00001309 } else if (CPU == "atom") {
1310 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001311 setFeatureEnabled(Features, "sse3", true);
Eli Friedman33465822011-07-08 23:31:17 +00001312 } else if (CPU == "corei7") {
1313 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001314 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001315 setFeatureEnabled(Features, "aes", true);
Benjamin Kramer85e16642011-05-20 15:11:23 +00001316 } else if (CPU == "corei7-avx") {
Eli Friedman33465822011-07-08 23:31:17 +00001317 setFeatureEnabled(Features, "mmx", true);
Roman Divacky27ec14f2011-04-05 20:32:44 +00001318 setFeatureEnabled(Features, "sse4", true);
1319 setFeatureEnabled(Features, "aes", true);
Bruno Cardoso Lopes34728382011-07-11 23:33:46 +00001320 //setFeatureEnabled(Features, "avx", true);
Roman Divacky27ec14f2011-04-05 20:32:44 +00001321 } else if (CPU == "k6" || CPU == "winchip-c6")
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001322 setFeatureEnabled(Features, "mmx", true);
Mike Stump11289f42009-09-09 15:08:12 +00001323 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001324 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001325 setFeatureEnabled(Features, "3dnow", true);
1326 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1327 setFeatureEnabled(Features, "sse", true);
1328 setFeatureEnabled(Features, "3dnowa", true);
1329 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1330 CPU == "athlon-fx") {
Mike Stump11289f42009-09-09 15:08:12 +00001331 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001332 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001333 } else if (CPU == "k8-sse3") {
1334 setFeatureEnabled(Features, "sse3", true);
1335 setFeatureEnabled(Features, "3dnowa", true);
Eli Friedman33465822011-07-08 23:31:17 +00001336 } else if (CPU == "c3-2") {
1337 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001338 setFeatureEnabled(Features, "sse", true);
Eli Friedman33465822011-07-08 23:31:17 +00001339 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001340}
1341
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001342bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001343 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001344 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001345 // FIXME: This *really* should not be here. We need some way of translating
1346 // options into llvm subtarget features.
1347 if (!Features.count(Name) &&
1348 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001349 return false;
1350
1351 if (Enabled) {
1352 if (Name == "mmx")
1353 Features["mmx"] = true;
1354 else if (Name == "sse")
Eli Friedman33465822011-07-08 23:31:17 +00001355 Features["sse"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001356 else if (Name == "sse2")
Eli Friedman33465822011-07-08 23:31:17 +00001357 Features["sse"] = Features["sse2"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001358 else if (Name == "sse3")
Eli Friedman33465822011-07-08 23:31:17 +00001359 Features["sse"] = Features["sse2"] = Features["sse3"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001360 else if (Name == "ssse3")
Eli Friedman33465822011-07-08 23:31:17 +00001361 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001362 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001363 else if (Name == "sse4" || Name == "sse4.2")
Eli Friedman33465822011-07-08 23:31:17 +00001364 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001365 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001366 else if (Name == "sse4.1")
Eli Friedman33465822011-07-08 23:31:17 +00001367 Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopher399ffa52010-03-04 02:26:37 +00001368 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001369 else if (Name == "3dnow")
Eli Friedman33465822011-07-08 23:31:17 +00001370 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001371 else if (Name == "3dnowa")
Eli Friedman33465822011-07-08 23:31:17 +00001372 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001373 else if (Name == "aes")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001374 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001375 else if (Name == "avx")
Bruno Cardoso Lopesbf9246d2011-08-18 00:07:03 +00001376 Features["avx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1377 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001378 } else {
1379 if (Name == "mmx")
Eli Friedman33465822011-07-08 23:31:17 +00001380 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001381 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001382 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001383 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001384 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001385 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001386 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001387 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001388 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001389 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001390 else if (Name == "ssse3")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001391 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencera9e41172011-04-17 19:22:03 +00001392 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001393 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001394 else if (Name == "sse4.2")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001395 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001396 else if (Name == "3dnow")
1397 Features["3dnow"] = Features["3dnowa"] = false;
1398 else if (Name == "3dnowa")
1399 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001400 else if (Name == "aes")
1401 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001402 else if (Name == "avx")
1403 Features["avx"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001404 }
1405
1406 return true;
1407}
1408
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001409/// HandleTargetOptions - Perform initialization based on the user
1410/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001411void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001412 // Remember the maximum enabled sselevel.
1413 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1414 // Ignore disabled features.
1415 if (Features[i][0] == '-')
1416 continue;
1417
Eric Christophere1ddaf92010-04-02 23:50:19 +00001418 if (Features[i].substr(1) == "aes") {
1419 HasAES = true;
1420 continue;
1421 }
1422
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001423 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1424 // For now let it be enabled together with other SSE levels.
1425 if (Features[i].substr(1) == "avx") {
1426 HasAVX = true;
1427 continue;
1428 }
1429
Daniel Dunbar979586e2009-11-11 09:38:56 +00001430 assert(Features[i][0] == '+' && "Invalid target feature!");
1431 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1432 .Case("sse42", SSE42)
1433 .Case("sse41", SSE41)
1434 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001435 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001436 .Case("sse2", SSE2)
1437 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00001438 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001439 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001440
Eli Friedman33465822011-07-08 23:31:17 +00001441 MMX3DNowEnum ThreeDNowLevel =
1442 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
Anders Carlssone437c682010-01-27 03:47:49 +00001443 .Case("3dnowa", AMD3DNowAthlon)
1444 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00001445 .Case("mmx", MMX)
1446 .Default(NoMMX3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001447
Eli Friedman33465822011-07-08 23:31:17 +00001448 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001449 }
Eli Friedman33465822011-07-08 23:31:17 +00001450
1451 // Don't tell the backend if we're turning off mmx; it will end up disabling
1452 // SSE, which we don't want.
1453 std::vector<std::string>::iterator it;
1454 it = std::find(Features.begin(), Features.end(), "-mmx");
1455 if (it != Features.end())
1456 Features.erase(it);
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001457}
Chris Lattnerecd49032009-03-02 22:27:17 +00001458
1459/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1460/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001461void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001462 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001463 // Target identification.
1464 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001465 Builder.defineMacro("_LP64");
1466 Builder.defineMacro("__LP64__");
1467 Builder.defineMacro("__amd64__");
1468 Builder.defineMacro("__amd64");
1469 Builder.defineMacro("__x86_64");
1470 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001471 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001472 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001473 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001474
Eric Christophere1ddaf92010-04-02 23:50:19 +00001475 if (HasAES)
1476 Builder.defineMacro("__AES__");
1477
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001478 if (HasAVX)
1479 Builder.defineMacro("__AVX__");
1480
Chris Lattnerecd49032009-03-02 22:27:17 +00001481 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001482 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001483
Chris Lattnerecd49032009-03-02 22:27:17 +00001484 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001485 Builder.defineMacro("__nocona");
1486 Builder.defineMacro("__nocona__");
1487 Builder.defineMacro("__tune_nocona__");
1488 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +00001489
Chris Lattner6df41af2009-04-19 17:32:33 +00001490 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1491 // functions in glibc header files that use FP Stack inline asm which the
1492 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001493 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001494
Chris Lattner96e43572009-03-02 22:40:39 +00001495 // Each case falls through to the previous one here.
1496 switch (SSELevel) {
1497 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001498 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00001499 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001500 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00001501 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001502 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001503 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001504 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001505 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001506 Builder.defineMacro("__SSE2__");
1507 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001508 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001509 Builder.defineMacro("__SSE__");
1510 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00001511 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00001512 break;
1513 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001514
Francois Pichet0706d202011-09-17 17:15:52 +00001515 if (Opts.MicrosoftExt && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001516 switch (SSELevel) {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001517 case SSE42:
1518 case SSE41:
1519 case SSSE3:
1520 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001521 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001522 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001523 break;
1524 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001525 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001526 break;
1527 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001528 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001529 }
1530 }
1531
Anders Carlssone437c682010-01-27 03:47:49 +00001532 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00001533 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00001534 case AMD3DNowAthlon:
1535 Builder.defineMacro("__3dNOW_A__");
1536 case AMD3DNow:
1537 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00001538 case MMX:
1539 Builder.defineMacro("__MMX__");
1540 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00001541 break;
1542 }
Chris Lattnerecd49032009-03-02 22:27:17 +00001543}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001544
1545
Eli Friedman3fd920a2008-08-20 02:34:37 +00001546bool
Anders Carlsson58436352009-02-28 17:11:49 +00001547X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001548 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00001549 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001550 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00001551 case 'Y': // first letter of a pair:
1552 switch (*(Name+1)) {
1553 default: return false;
1554 case '0': // First SSE register.
1555 case 't': // Any SSE register, when SSE2 is enabled.
1556 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1557 case 'm': // any MMX register, when inter-unit moves enabled.
1558 break; // falls through to setAllowsRegister.
1559 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001560 case 'a': // eax.
1561 case 'b': // ebx.
1562 case 'c': // ecx.
1563 case 'd': // edx.
1564 case 'S': // esi.
1565 case 'D': // edi.
1566 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00001567 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001568 case 't': // top of floating point stack.
1569 case 'u': // second from top of floating point stack.
1570 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00001571 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00001572 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001573 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00001574 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1575 case 'l': // "Index" registers: any general register that can be used as an
1576 // index in a base+index memory access.
1577 Info.setAllowsRegister();
1578 return true;
1579 case 'C': // SSE floating point constant.
1580 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001581 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001582 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001583 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001584 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001585 return true;
1586 }
Dale Johannesen46742a42010-08-24 22:33:12 +00001587 return false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001588}
1589
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00001590
Eli Friedman3fd920a2008-08-20 02:34:37 +00001591std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001592X86TargetInfo::convertConstraint(const char *&Constraint) const {
1593 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001594 case 'a': return std::string("{ax}");
1595 case 'b': return std::string("{bx}");
1596 case 'c': return std::string("{cx}");
1597 case 'd': return std::string("{dx}");
1598 case 'S': return std::string("{si}");
1599 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00001600 case 'p': // address
1601 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00001602 case 't': // top of floating point stack.
1603 return std::string("{st}");
1604 case 'u': // second from top of floating point stack.
1605 return std::string("{st(1)}"); // second from top of floating point stack.
1606 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001607 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00001608 }
1609}
Eli Friedman3fd920a2008-08-20 02:34:37 +00001610} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00001611
1612namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001613// X86-32 generic target
1614class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001615public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00001616 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1617 DoubleAlign = LongLongAlign = 32;
1618 LongDoubleWidth = 96;
1619 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +00001620 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1621 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001622 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +00001623 SizeType = UnsignedInt;
1624 PtrDiffType = SignedInt;
1625 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001626 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001627
1628 // Use fpret for all types.
1629 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1630 (1 << TargetInfo::Double) |
1631 (1 << TargetInfo::LongDouble));
Eli Friedman3fd920a2008-08-20 02:34:37 +00001632 }
1633 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001634 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00001635 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001636
Chris Lattnerd545ad12009-09-23 06:06:36 +00001637 int getEHDataRegisterNumber(unsigned RegNo) const {
1638 if (RegNo == 0) return 0;
1639 if (RegNo == 1) return 2;
1640 return -1;
1641 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001642};
1643} // end anonymous namespace
1644
1645namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00001646class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1647public:
1648 OpenBSDI386TargetInfo(const std::string& triple) :
1649 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1650 SizeType = UnsignedLong;
1651 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00001652 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00001653 }
1654};
1655} // end anonymous namespace
1656
1657namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00001658class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001659public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00001660 DarwinI386TargetInfo(const std::string& triple) :
1661 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001662 LongDoubleWidth = 128;
1663 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00001664 SizeType = UnsignedLong;
1665 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00001666 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1667 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001668 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbarbd606522010-05-27 00:35:16 +00001669 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00001670 }
1671
Eli Friedman3fd920a2008-08-20 02:34:37 +00001672};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00001673} // end anonymous namespace
1674
1675namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001676// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001677class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001678public:
1679 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001680 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001681 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00001682 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00001683 DoubleAlign = LongLongAlign = 64;
1684 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 +00001685 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1686 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001687 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001688 virtual void getTargetDefines(const LangOptions &Opts,
1689 MacroBuilder &Builder) const {
1690 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1691 }
1692};
1693} // end anonymous namespace
1694
1695namespace {
1696
1697// x86-32 Windows Visual Studio target
1698class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1699public:
1700 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1701 : WindowsX86_32TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00001702 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001703 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1704 }
1705 virtual void getTargetDefines(const LangOptions &Opts,
1706 MacroBuilder &Builder) const {
1707 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1708 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1709 // The value of the following reflects processor type.
1710 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1711 // We lost the original triple, so we use the default.
1712 Builder.defineMacro("_M_IX86", "600");
1713 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001714};
1715} // end anonymous namespace
1716
1717namespace {
1718// x86-32 MinGW target
1719class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1720public:
1721 MinGWX86_32TargetInfo(const std::string& triple)
1722 : WindowsX86_32TargetInfo(triple) {
1723 }
1724 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001725 MacroBuilder &Builder) const {
1726 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001727 DefineStd(Builder, "WIN32", Opts);
1728 DefineStd(Builder, "WINNT", Opts);
1729 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001730 Builder.defineMacro("__MSVCRT__");
1731 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001732
1733 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1734 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00001735 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001736 // Provide "as-is" __declspec.
1737 Builder.defineMacro("__declspec", "__declspec");
1738 else
1739 // Provide alias of __attribute__ like mingw32-gcc.
1740 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001741 }
1742};
1743} // end anonymous namespace
1744
1745namespace {
1746// x86-32 Cygwin target
1747class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1748public:
1749 CygwinX86_32TargetInfo(const std::string& triple)
1750 : X86_32TargetInfo(triple) {
1751 TLSSupported = false;
1752 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001753 DoubleAlign = LongLongAlign = 64;
1754 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1755 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001756 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001757 }
1758 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001759 MacroBuilder &Builder) const {
1760 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1761 Builder.defineMacro("__CYGWIN__");
1762 Builder.defineMacro("__CYGWIN32__");
1763 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00001764 if (Opts.CPlusPlus)
1765 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00001766 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001767};
1768} // end anonymous namespace
1769
1770namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00001771// x86-32 Haiku target
1772class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1773public:
1774 HaikuX86_32TargetInfo(const std::string& triple)
1775 : X86_32TargetInfo(triple) {
1776 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00001777 IntPtrType = SignedLong;
1778 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00001779 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00001780 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00001781 virtual void getTargetDefines(const LangOptions &Opts,
1782 MacroBuilder &Builder) const {
1783 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1784 Builder.defineMacro("__INTEL__");
1785 Builder.defineMacro("__HAIKU__");
1786 }
1787};
1788} // end anonymous namespace
1789
Douglas Gregor9fabd852011-07-01 22:41:14 +00001790// RTEMS Target
1791template<typename Target>
1792class RTEMSTargetInfo : public OSTargetInfo<Target> {
1793protected:
1794 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1795 MacroBuilder &Builder) const {
1796 // RTEMS defines; list based off of gcc output
1797
Douglas Gregor9fabd852011-07-01 22:41:14 +00001798 Builder.defineMacro("__rtems__");
1799 Builder.defineMacro("__ELF__");
1800 }
1801public:
1802 RTEMSTargetInfo(const std::string &triple)
1803 : OSTargetInfo<Target>(triple) {
1804 this->UserLabelPrefix = "";
1805
1806 llvm::Triple Triple(triple);
1807 switch (Triple.getArch()) {
1808 default:
1809 case llvm::Triple::x86:
1810 // this->MCountName = ".mcount";
1811 break;
1812 case llvm::Triple::mips:
1813 case llvm::Triple::mipsel:
1814 case llvm::Triple::ppc:
1815 case llvm::Triple::ppc64:
1816 // this->MCountName = "_mcount";
1817 break;
1818 case llvm::Triple::arm:
1819 // this->MCountName = "__mcount";
1820 break;
1821 }
1822
1823 }
1824};
1825
1826namespace {
1827// x86-32 RTEMS target
1828class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
1829public:
1830 RTEMSX86_32TargetInfo(const std::string& triple)
1831 : X86_32TargetInfo(triple) {
1832 SizeType = UnsignedLong;
1833 IntPtrType = SignedLong;
1834 PtrDiffType = SignedLong;
1835 this->UserLabelPrefix = "";
1836 }
1837 virtual void getTargetDefines(const LangOptions &Opts,
1838 MacroBuilder &Builder) const {
1839 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1840 Builder.defineMacro("__INTEL__");
1841 Builder.defineMacro("__rtems__");
1842 }
1843};
1844} // end anonymous namespace
1845
Chris Lattnerb986aba2010-04-11 19:29:39 +00001846namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001847// x86-64 generic target
1848class X86_64TargetInfo : public X86TargetInfo {
1849public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001850 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001851 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00001852 LongDoubleWidth = 128;
1853 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00001854 LargeArrayMinWidth = 128;
1855 LargeArrayAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001856 IntMaxType = SignedLong;
1857 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001858 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001859 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001860
Eli Friedman873f65a2008-08-21 00:13:15 +00001861 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1862 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001863 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001864
1865 // Use fpret only for long double.
1866 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Chris Lattner10a5b382007-01-29 05:24:35 +00001867 }
Anders Carlssona7408e72007-10-13 00:45:48 +00001868 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001869 return "typedef struct __va_list_tag {"
1870 " unsigned gp_offset;"
1871 " unsigned fp_offset;"
1872 " void* overflow_arg_area;"
1873 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00001874 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00001875 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001876 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001877
Chris Lattnerd545ad12009-09-23 06:06:36 +00001878 int getEHDataRegisterNumber(unsigned RegNo) const {
1879 if (RegNo == 0) return 0;
1880 if (RegNo == 1) return 1;
1881 return -1;
1882 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001883};
1884} // end anonymous namespace
1885
1886namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001887// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001888class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001889public:
1890 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001891 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001892 TLSSupported = false;
1893 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00001894 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001895 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00001896 IntMaxType = SignedLongLong;
1897 UIntMaxType = UnsignedLongLong;
1898 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00001899 SizeType = UnsignedLongLong;
1900 PtrDiffType = SignedLongLong;
1901 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00001902 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001903 }
1904 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001905 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001906 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001907 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001908 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00001909 virtual const char *getVAListDeclaration() const {
1910 return "typedef char* __builtin_va_list;";
1911 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001912};
1913} // end anonymous namespace
1914
1915namespace {
1916// x86-64 Windows Visual Studio target
1917class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1918public:
1919 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1920 : WindowsX86_64TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00001921 LongDoubleWidth = LongDoubleAlign = 64;
1922 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001923 }
1924 virtual void getTargetDefines(const LangOptions &Opts,
1925 MacroBuilder &Builder) const {
1926 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1927 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001928 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001929 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001930 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001931};
1932} // end anonymous namespace
1933
1934namespace {
1935// x86-64 MinGW target
1936class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1937public:
1938 MinGWX86_64TargetInfo(const std::string& triple)
1939 : WindowsX86_64TargetInfo(triple) {
1940 }
1941 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001942 MacroBuilder &Builder) const {
1943 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001944 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001945 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00001946 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001947 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001948
1949 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1950 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00001951 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001952 // Provide "as-is" __declspec.
1953 Builder.defineMacro("__declspec", "__declspec");
1954 else
1955 // Provide alias of __attribute__ like mingw32-gcc.
1956 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001957 }
1958};
1959} // end anonymous namespace
1960
1961namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00001962class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1963public:
Mike Stump11289f42009-09-09 15:08:12 +00001964 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00001965 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1966 Int64Type = SignedLongLong;
1967 }
1968};
1969} // end anonymous namespace
1970
1971namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00001972class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1973public:
Mike Stump11289f42009-09-09 15:08:12 +00001974 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00001975 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1976 IntMaxType = SignedLongLong;
1977 UIntMaxType = UnsignedLongLong;
1978 Int64Type = SignedLongLong;
1979 }
1980};
1981} // end anonymous namespace
1982
1983namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001984class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001985 // Possible FPU choices.
1986 enum FPUMode {
1987 NoFPU,
1988 VFP2FPU,
1989 VFP3FPU,
1990 NeonFPU
1991 };
1992
1993 static bool FPUModeIsVFP(FPUMode Mode) {
1994 return Mode >= VFP2FPU && Mode <= NeonFPU;
1995 }
1996
1997 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1998 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001999
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002000 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002001
2002 unsigned FPU : 3;
2003
Daniel Dunbar893d4752009-12-19 04:15:38 +00002004 unsigned IsThumb : 1;
2005
2006 // Initialized via features.
2007 unsigned SoftFloat : 1;
2008 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002009
Chris Lattner5cc15e02010-03-03 19:03:45 +00002010 static const Builtin::Info BuiltinInfo[];
2011
Chris Lattner17df24e2008-04-21 18:56:49 +00002012public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002013 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002014 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002015 {
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002016 SizeType = UnsignedInt;
2017 PtrDiffType = SignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002018
Chris Lattner1a8f3942010-04-23 16:29:58 +00002019 // {} in inline assembly are neon specifiers, not assembly variant
2020 // specifiers.
2021 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002022
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002023 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00002024 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00002025 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00002026 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2027 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00002028 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2029 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00002030 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00002031 } else {
2032 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2033 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00002034 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00002035 }
John McCall86353412010-08-21 22:46:04 +00002036
2037 // ARM targets default to using the ARM C++ ABI.
2038 CXXABI = CXXABI_ARM;
Eli Friedmanb5366062008-05-20 14:21:01 +00002039 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002040 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002041 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00002042 ABI = Name;
2043
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002044 // The defaults (above) are for AAPCS, check if we need to change them.
2045 //
2046 // FIXME: We need support for -meabi... we could just mangle it into the
2047 // name.
2048 if (Name == "apcs-gnu") {
Daniel Dunbar377dc2f2010-01-27 20:23:08 +00002049 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002050 SizeType = UnsignedLong;
2051
Daniel Dunbarf8125062010-04-22 16:14:54 +00002052 // Do not respect the alignment of bit-field types when laying out
2053 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2054 UseBitFieldTypeAlignment = false;
2055
Chad Rosier18903ee2011-08-04 01:21:14 +00002056 /// Do force alignment of members that follow zero length bitfields. If
2057 /// the alignment of the zero-length bitfield is greater than the member
2058 /// that follows it, `bar', `bar' will be aligned as the type of the
2059 /// zero length bitfield.
2060 UseZeroLengthBitfieldAlignment = true;
2061
2062 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosiera336c6f2011-08-04 17:52:43 +00002063 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2064 /// gcc.
Chad Rosier18903ee2011-08-04 01:21:14 +00002065 ZeroLengthBitfieldBoundary = 32;
2066
Daniel Dunbar03184792009-09-22 21:44:58 +00002067 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00002068 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2069 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00002070 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 +00002071 "i64:32:64-f32:32:32-f64:32:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00002072 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00002073 } else {
2074 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 +00002075 "i64:32:64-f32:32:32-f64:32:64-"
2076 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00002077 }
2078
Chad Rosier99ee7822011-07-26 07:03:04 +00002079 // FIXME: Override "preferred align" for double and long long.
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002080 } else if (Name == "aapcs") {
2081 // FIXME: Enumerated types are variable width in straight AAPCS.
2082 } else if (Name == "aapcs-linux") {
Chad Rosier99ee7822011-07-26 07:03:04 +00002083 ;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00002084 } else
2085 return false;
2086
2087 return true;
2088 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00002089
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002090 void getDefaultFeatures(const std::string &CPU,
2091 llvm::StringMap<bool> &Features) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002092 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2093 Features["vfp2"] = true;
2094 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2095 Features["neon"] = true;
2096 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002097
Daniel Dunbar893d4752009-12-19 04:15:38 +00002098 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2099 const std::string &Name,
2100 bool Enabled) const {
Evan Cheng491f56d2011-07-08 06:40:11 +00002101 if (Name == "soft-float" || Name == "soft-float-abi" ||
2102 Name == "vfp2" || Name == "vfp3" || Name == "neon") {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002103 Features[Name] = Enabled;
2104 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00002105 return false;
2106
Daniel Dunbar893d4752009-12-19 04:15:38 +00002107 return true;
2108 }
2109
2110 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002111 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00002112 SoftFloat = SoftFloatABI = false;
2113 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2114 if (Features[i] == "+soft-float")
2115 SoftFloat = true;
2116 else if (Features[i] == "+soft-float-abi")
2117 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002118 else if (Features[i] == "+vfp2")
2119 FPU = VFP2FPU;
2120 else if (Features[i] == "+vfp3")
2121 FPU = VFP3FPU;
2122 else if (Features[i] == "+neon")
2123 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00002124 }
2125
2126 // Remove front-end specific options which the backend handles differently.
2127 std::vector<std::string>::iterator it;
2128 it = std::find(Features.begin(), Features.end(), "+soft-float");
2129 if (it != Features.end())
2130 Features.erase(it);
2131 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2132 if (it != Features.end())
2133 Features.erase(it);
2134 }
2135
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002136 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002137 return llvm::StringSwitch<const char*>(Name)
2138 .Cases("arm8", "arm810", "4")
2139 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2140 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2141 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2142 .Case("ep9312", "4T")
2143 .Cases("arm10tdmi", "arm1020t", "5T")
2144 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2145 .Case("arm926ej-s", "5TEJ")
2146 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2147 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002148 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002149 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002150 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002151 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2152 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00002153 .Case("cortex-m3", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00002154 .Case("cortex-m0", "6M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002155 .Default(0);
2156 }
2157 virtual bool setCPU(const std::string &Name) {
2158 if (!getCPUDefineSuffix(Name))
2159 return false;
2160
2161 CPU = Name;
2162 return true;
2163 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002164 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002165 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002166 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002167 Builder.defineMacro("__arm");
2168 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002169
Chris Lattnerecd49032009-03-02 22:27:17 +00002170 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002171 Builder.defineMacro("__ARMEL__");
2172 Builder.defineMacro("__LITTLE_ENDIAN__");
2173 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002174
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002175 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002176 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002177
Mike Stump9d54bd72009-04-08 02:07:04 +00002178 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002179
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002180 // FIXME: It's more complicated than this and we don't really support
2181 // interworking.
2182 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002183 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002184
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002185 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002186 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002187
Daniel Dunbar893d4752009-12-19 04:15:38 +00002188 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002189 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002190
2191 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002192 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002193
Bob Wilson19c1b882011-05-13 18:56:03 +00002194 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002195 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002196 Builder.defineMacro("__THUMBEL__");
2197 Builder.defineMacro("__thumb__");
Bob Wilson19c1b882011-05-13 18:56:03 +00002198 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002199 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002200 }
2201
2202 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002203 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002204
2205 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002206 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002207
2208 // This only gets set when Neon instructions are actually available, unlike
2209 // the VFP define, hence the soft float and arch check. This is subtly
2210 // different from gcc, we follow the intent which was that it should be set
2211 // when Neon instructions are actually available.
Bob Wilson19c1b882011-05-13 18:56:03 +00002212 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002213 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00002214 }
2215 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2216 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00002217 Records = BuiltinInfo;
2218 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00002219 }
2220 virtual const char *getVAListDeclaration() const {
John McCalle155a3d2011-05-09 02:19:37 +00002221 return "typedef void* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00002222 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002223 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002224 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002225 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002226 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002227 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002228 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002229 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00002230 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002231 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00002232 case 'l': // r0-r7
2233 case 'h': // r8-r15
2234 case 'w': // VFP Floating point register single precision
2235 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00002236 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00002237 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00002238 case 'Q': // A memory address that is a single base register.
2239 Info.setAllowsMemory();
2240 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002241 case 'U': // a memory reference...
2242 switch (Name[1]) {
2243 case 'q': // ...ARMV4 ldrsb
2244 case 'v': // ...VFP load/store (reg+constant offset)
2245 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00002246 case 't': // address valid for load/store opaque types wider
2247 // than 128-bits
2248 case 'n': // valid address for Neon doubleword vector load/store
2249 case 'm': // valid address for Neon element and structure load/store
2250 case 's': // valid address for non-offset loads/stores of quad-word
2251 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002252 Info.setAllowsMemory();
2253 Name++;
2254 return true;
2255 }
Nate Begeman2908fa02008-04-22 05:03:19 +00002256 }
Chris Lattner17df24e2008-04-21 18:56:49 +00002257 return false;
2258 }
Evan Chengd863adb2011-06-16 19:13:15 +00002259 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002260 std::string R;
2261 switch (*Constraint) {
2262 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00002263 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002264 Constraint++;
2265 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00002266 case 'p': // 'p' should be translated to 'r' by default.
2267 R = std::string("r");
2268 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002269 default:
2270 return std::string(1, *Constraint);
2271 }
2272 return R;
2273 }
Chris Lattner17df24e2008-04-21 18:56:49 +00002274 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002275 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00002276 return "";
2277 }
2278};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002279
2280const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002281 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002282 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002283 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2284
2285 // Float registers
2286 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2287 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2288 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002289 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002290
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002291 // Double registers
2292 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2293 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002294 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2295 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002296
2297 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002298 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2299 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002300};
2301
2302void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002303 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002304 Names = GCCRegNames;
2305 NumNames = llvm::array_lengthof(GCCRegNames);
2306}
2307
2308const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002309 { { "a1" }, "r0" },
2310 { { "a2" }, "r1" },
2311 { { "a3" }, "r2" },
2312 { { "a4" }, "r3" },
2313 { { "v1" }, "r4" },
2314 { { "v2" }, "r5" },
2315 { { "v3" }, "r6" },
2316 { { "v4" }, "r7" },
2317 { { "v5" }, "r8" },
2318 { { "v6", "rfp" }, "r9" },
2319 { { "sl" }, "r10" },
2320 { { "fp" }, "r11" },
2321 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002322 { { "r13" }, "sp" },
2323 { { "r14" }, "lr" },
2324 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002325 // The S, D and Q registers overlap, but aren't really aliases; we
2326 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002327};
2328
2329void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2330 unsigned &NumAliases) const {
2331 Aliases = GCCRegAliases;
2332 NumAliases = llvm::array_lengthof(GCCRegAliases);
2333}
Chris Lattner5cc15e02010-03-03 19:03:45 +00002334
2335const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00002336#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00002337#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00002338 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00002339#include "clang/Basic/BuiltinsARM.def"
2340};
Chris Lattner17df24e2008-04-21 18:56:49 +00002341} // end anonymous namespace.
2342
Eli Friedmanf05b7722008-08-20 07:44:10 +00002343
2344namespace {
Mike Stump11289f42009-09-09 15:08:12 +00002345class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002346 public DarwinTargetInfo<ARMTargetInfo> {
2347protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00002348 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002349 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00002350 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00002351 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002352
Torok Edwinb2b37c62009-06-30 17:10:35 +00002353public:
Mike Stump11289f42009-09-09 15:08:12 +00002354 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002355 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2356 HasAlignMac68kSupport = true;
2357 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002358};
2359} // end anonymous namespace.
2360
Chris Lattner5ba61f02006-10-14 07:39:34 +00002361namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002362class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00002363 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2364 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002365 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00002366public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002367 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2368 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00002369 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 +00002370 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002371 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002372 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2373 const std::string &Name,
2374 bool Enabled) const {
2375 if (Name == "soft-float")
2376 Features[Name] = Enabled;
2377 else
2378 return false;
2379
2380 return true;
2381 }
2382 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2383 SoftFloat = false;
2384 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2385 if (Features[i] == "+soft-float")
2386 SoftFloat = true;
2387 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002388 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002389 MacroBuilder &Builder) const {
2390 DefineStd(Builder, "sparc", Opts);
2391 Builder.defineMacro("__sparcv8");
2392 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002393
2394 if (SoftFloat)
2395 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00002396 }
2397 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2398 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002399 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00002400 }
2401 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002402 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00002403 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002404 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002405 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002406 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002407 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002408 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00002409 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002410 // FIXME: Implement!
2411 return false;
Gabor Greif49991682008-02-21 16:29:08 +00002412 }
2413 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002414 // FIXME: Implement!
2415 return "";
Gabor Greif49991682008-02-21 16:29:08 +00002416 }
2417};
2418
Chris Lattner9b415d62009-01-27 01:58:38 +00002419const char * const SparcV8TargetInfo::GCCRegNames[] = {
2420 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2421 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2422 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2423 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2424};
2425
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002426void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002427 unsigned &NumNames) const {
2428 Names = GCCRegNames;
2429 NumNames = llvm::array_lengthof(GCCRegNames);
2430}
2431
2432const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002433 { { "g0" }, "r0" },
2434 { { "g1" }, "r1" },
2435 { { "g2" }, "r2" },
2436 { { "g3" }, "r3" },
2437 { { "g4" }, "r4" },
2438 { { "g5" }, "r5" },
2439 { { "g6" }, "r6" },
2440 { { "g7" }, "r7" },
2441 { { "o0" }, "r8" },
2442 { { "o1" }, "r9" },
2443 { { "o2" }, "r10" },
2444 { { "o3" }, "r11" },
2445 { { "o4" }, "r12" },
2446 { { "o5" }, "r13" },
2447 { { "o6", "sp" }, "r14" },
2448 { { "o7" }, "r15" },
2449 { { "l0" }, "r16" },
2450 { { "l1" }, "r17" },
2451 { { "l2" }, "r18" },
2452 { { "l3" }, "r19" },
2453 { { "l4" }, "r20" },
2454 { { "l5" }, "r21" },
2455 { { "l6" }, "r22" },
2456 { { "l7" }, "r23" },
2457 { { "i0" }, "r24" },
2458 { { "i1" }, "r25" },
2459 { { "i2" }, "r26" },
2460 { { "i3" }, "r27" },
2461 { { "i4" }, "r28" },
2462 { { "i5" }, "r29" },
2463 { { "i6", "fp" }, "r30" },
2464 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00002465};
2466
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002467void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002468 unsigned &NumAliases) const {
2469 Aliases = GCCRegAliases;
2470 NumAliases = llvm::array_lengthof(GCCRegAliases);
2471}
Gabor Greif49991682008-02-21 16:29:08 +00002472} // end anonymous namespace.
2473
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002474namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002475class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2476public:
2477 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2478 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2479 SizeType = UnsignedInt;
2480 PtrDiffType = SignedInt;
2481 }
2482};
Torok Edwinb2b37c62009-06-30 17:10:35 +00002483class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002484public:
2485 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002486 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00002487 SizeType = UnsignedInt;
2488 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002489 }
2490};
2491} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00002492
Chris Lattnerb781dc792008-05-08 05:58:21 +00002493namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002494 class MSP430TargetInfo : public TargetInfo {
2495 static const char * const GCCRegNames[];
2496 public:
2497 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2498 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00002499 IntWidth = 16; IntAlign = 16;
2500 LongWidth = 32; LongLongWidth = 64;
2501 LongAlign = LongLongAlign = 16;
2502 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002503 SizeType = UnsignedInt;
2504 IntMaxType = SignedLong;
2505 UIntMaxType = UnsignedLong;
2506 IntPtrType = SignedShort;
2507 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00002508 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00002509 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002510 }
2511 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002512 MacroBuilder &Builder) const {
2513 Builder.defineMacro("MSP430");
2514 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002515 // FIXME: defines for different 'flavours' of MCU
2516 }
2517 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2518 unsigned &NumRecords) const {
2519 // FIXME: Implement.
2520 Records = 0;
2521 NumRecords = 0;
2522 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002523 virtual void getGCCRegNames(const char * const *&Names,
2524 unsigned &NumNames) const;
2525 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2526 unsigned &NumAliases) const {
2527 // No aliases.
2528 Aliases = 0;
2529 NumAliases = 0;
2530 }
2531 virtual bool validateAsmConstraint(const char *&Name,
2532 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00002533 // No target constraints for now.
2534 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002535 }
2536 virtual const char *getClobbers() const {
2537 // FIXME: Is this really right?
2538 return "";
2539 }
2540 virtual const char *getVAListDeclaration() const {
2541 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00002542 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002543 }
2544 };
2545
2546 const char * const MSP430TargetInfo::GCCRegNames[] = {
2547 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2548 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2549 };
2550
2551 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2552 unsigned &NumNames) const {
2553 Names = GCCRegNames;
2554 NumNames = llvm::array_lengthof(GCCRegNames);
2555 }
2556}
2557
2558
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002559namespace {
2560 class SystemZTargetInfo : public TargetInfo {
2561 static const char * const GCCRegNames[];
2562 public:
2563 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2564 TLSSupported = false;
2565 IntWidth = IntAlign = 32;
2566 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2567 PointerWidth = PointerAlign = 64;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002568 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2569 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002570 }
2571 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002572 MacroBuilder &Builder) const {
2573 Builder.defineMacro("__s390__");
2574 Builder.defineMacro("__s390x__");
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002575 }
2576 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2577 unsigned &NumRecords) const {
2578 // FIXME: Implement.
2579 Records = 0;
2580 NumRecords = 0;
2581 }
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002582
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002583 virtual void getGCCRegNames(const char * const *&Names,
2584 unsigned &NumNames) const;
2585 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2586 unsigned &NumAliases) const {
2587 // No aliases.
2588 Aliases = 0;
2589 NumAliases = 0;
2590 }
2591 virtual bool validateAsmConstraint(const char *&Name,
2592 TargetInfo::ConstraintInfo &info) const {
2593 // FIXME: implement
2594 return true;
2595 }
2596 virtual const char *getClobbers() const {
2597 // FIXME: Is this really right?
2598 return "";
2599 }
2600 virtual const char *getVAListDeclaration() const {
2601 // FIXME: implement
2602 return "typedef char* __builtin_va_list;";
2603 }
2604 };
2605
2606 const char * const SystemZTargetInfo::GCCRegNames[] = {
2607 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2608 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2609 };
2610
2611 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2612 unsigned &NumNames) const {
2613 Names = GCCRegNames;
2614 NumNames = llvm::array_lengthof(GCCRegNames);
2615 }
2616}
2617
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002618namespace {
2619 class BlackfinTargetInfo : public TargetInfo {
2620 static const char * const GCCRegNames[];
2621 public:
2622 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2623 TLSSupported = false;
2624 DoubleAlign = 32;
2625 LongLongAlign = 32;
2626 LongDoubleAlign = 32;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002627 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002628 }
2629
2630 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002631 MacroBuilder &Builder) const {
2632 DefineStd(Builder, "bfin", Opts);
2633 DefineStd(Builder, "BFIN", Opts);
2634 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002635 // FIXME: This one is really dependent on -mcpu
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002636 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002637 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2638 }
2639
2640 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2641 unsigned &NumRecords) const {
2642 // FIXME: Implement.
2643 Records = 0;
2644 NumRecords = 0;
2645 }
2646
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002647 virtual void getGCCRegNames(const char * const *&Names,
2648 unsigned &NumNames) const;
2649
2650 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2651 unsigned &NumAliases) const {
2652 // No aliases.
2653 Aliases = 0;
2654 NumAliases = 0;
2655 }
2656
2657 virtual bool validateAsmConstraint(const char *&Name,
2658 TargetInfo::ConstraintInfo &Info) const {
2659 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2660 Info.setAllowsRegister();
2661 return true;
2662 }
2663 return false;
2664 }
2665
2666 virtual const char *getClobbers() const {
2667 return "";
2668 }
2669
2670 virtual const char *getVAListDeclaration() const {
2671 return "typedef char* __builtin_va_list;";
2672 }
2673 };
2674
2675 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2676 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2677 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2678 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2679 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2680 "a0", "a1", "cc",
2681 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2682 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2683 };
2684
2685 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2686 unsigned &NumNames) const {
2687 Names = GCCRegNames;
2688 NumNames = llvm::array_lengthof(GCCRegNames);
2689 }
2690}
2691
Eli Friedmana9c3d712009-08-19 20:47:07 +00002692namespace {
2693
Mike Stump11289f42009-09-09 15:08:12 +00002694 // LLVM and Clang cannot be used directly to output native binaries for
2695 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00002696 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00002697 //
2698 // TCE uses the llvm bitcode as input and uses it for generating customized
2699 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00002700 // publicly available in http://tce.cs.tut.fi
2701
2702 class TCETargetInfo : public TargetInfo{
2703 public:
2704 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2705 TLSSupported = false;
2706 IntWidth = 32;
2707 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00002708 PointerWidth = 32;
2709 IntAlign = 32;
2710 LongAlign = LongLongAlign = 32;
2711 PointerAlign = 32;
2712 SizeType = UnsignedInt;
2713 IntMaxType = SignedLong;
2714 UIntMaxType = UnsignedLong;
2715 IntPtrType = SignedInt;
2716 PtrDiffType = SignedInt;
2717 FloatWidth = 32;
2718 FloatAlign = 32;
2719 DoubleWidth = 32;
2720 DoubleAlign = 32;
2721 LongDoubleWidth = 32;
2722 LongDoubleAlign = 32;
2723 FloatFormat = &llvm::APFloat::IEEEsingle;
2724 DoubleFormat = &llvm::APFloat::IEEEsingle;
2725 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00002726 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2727 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00002728 "f32:32:32-f64:32:32-v64:32:32-"
2729 "v128:32:32-a0:0:32-n32";
Eli Friedmana9c3d712009-08-19 20:47:07 +00002730 }
2731
2732 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002733 MacroBuilder &Builder) const {
2734 DefineStd(Builder, "tce", Opts);
2735 Builder.defineMacro("__TCE__");
2736 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00002737 }
2738 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2739 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00002740 virtual const char *getClobbers() const {
2741 return "";
2742 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002743 virtual const char *getVAListDeclaration() const {
2744 return "typedef void* __builtin_va_list;";
2745 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002746 virtual void getGCCRegNames(const char * const *&Names,
2747 unsigned &NumNames) const {}
2748 virtual bool validateAsmConstraint(const char *&Name,
2749 TargetInfo::ConstraintInfo &info) const {
2750 return true;
2751 }
2752 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2753 unsigned &NumAliases) const {}
2754 };
2755}
2756
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002757namespace {
2758class MipsTargetInfo : public TargetInfo {
Eric Christopher0b26a612010-03-02 02:41:08 +00002759 std::string ABI, CPU;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002760 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2761 static const char * const GCCRegNames[];
2762public:
Eric Christopher0b26a612010-03-02 02:41:08 +00002763 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002764 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 +00002765 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2766 SizeType = UnsignedInt;
2767 PtrDiffType = SignedInt;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002768 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002769 virtual const char *getABI() const { return ABI.c_str(); }
2770 virtual bool setABI(const std::string &Name) {
2771
2772 if ((Name == "o32") || (Name == "eabi")) {
2773 ABI = Name;
2774 return true;
2775 } else
2776 return false;
2777 }
2778 virtual bool setCPU(const std::string &Name) {
2779 CPU = Name;
2780 return true;
2781 }
2782 void getDefaultFeatures(const std::string &CPU,
2783 llvm::StringMap<bool> &Features) const {
2784 Features[ABI] = true;
2785 Features[CPU] = true;
2786 }
2787 virtual void getArchDefines(const LangOptions &Opts,
2788 MacroBuilder &Builder) const {
Akira Hatanakaf0bbc1c2011-09-14 17:24:05 +00002789 // NOTE: O64 will not be supported.
Bruno Cardoso Lopes3aa2f0a2011-07-21 15:10:57 +00002790 if (ABI == "o32") {
Eric Christopher0b26a612010-03-02 02:41:08 +00002791 Builder.defineMacro("__mips_o32");
Bruno Cardoso Lopes3aa2f0a2011-07-21 15:10:57 +00002792 Builder.defineMacro("_ABIO32", "1");
2793 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
2794 }
2795 else if (ABI == "n32") {
2796 Builder.defineMacro("__mips_n32");
2797 Builder.defineMacro("_ABIN32", "2");
2798 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
2799 }
2800 else if (ABI == "n64") {
2801 Builder.defineMacro("__mips_n64");
2802 Builder.defineMacro("_ABI64", "3");
2803 Builder.defineMacro("_MIPS_SIM", "_ABI64");
2804 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002805 else if (ABI == "eabi")
2806 Builder.defineMacro("__mips_eabi");
2807 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002808 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002809 MacroBuilder &Builder) const {
2810 DefineStd(Builder, "mips", Opts);
2811 Builder.defineMacro("_mips");
2812 DefineStd(Builder, "MIPSEB", Opts);
2813 Builder.defineMacro("_MIPSEB");
2814 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002815 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002816 }
2817 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2818 unsigned &NumRecords) const {
2819 // FIXME: Implement!
2820 }
2821 virtual const char *getVAListDeclaration() const {
2822 return "typedef void* __builtin_va_list;";
2823 }
2824 virtual void getGCCRegNames(const char * const *&Names,
2825 unsigned &NumNames) const;
2826 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2827 unsigned &NumAliases) const;
2828 virtual bool validateAsmConstraint(const char *&Name,
2829 TargetInfo::ConstraintInfo &Info) const {
2830 switch (*Name) {
2831 default:
2832 case 'r': // CPU registers.
2833 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2834 case 'y': // Equivalent to "r", backwards compatibility only.
2835 case 'f': // floating-point registers.
2836 Info.setAllowsRegister();
2837 return true;
2838 }
2839 return false;
2840 }
2841
2842 virtual const char *getClobbers() const {
2843 // FIXME: Implement!
2844 return "";
2845 }
2846};
2847
2848const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002849 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002850 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2851 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2852 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2853 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2854 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2855 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2856 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2857 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2858 "$fcc5","$fcc6","$fcc7"
2859};
2860
2861void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2862 unsigned &NumNames) const {
2863 Names = GCCRegNames;
2864 NumNames = llvm::array_lengthof(GCCRegNames);
2865}
2866
2867const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2868 { { "at" }, "$1" },
2869 { { "v0" }, "$2" },
2870 { { "v1" }, "$3" },
2871 { { "a0" }, "$4" },
2872 { { "a1" }, "$5" },
2873 { { "a2" }, "$6" },
2874 { { "a3" }, "$7" },
2875 { { "t0" }, "$8" },
2876 { { "t1" }, "$9" },
2877 { { "t2" }, "$10" },
2878 { { "t3" }, "$11" },
2879 { { "t4" }, "$12" },
2880 { { "t5" }, "$13" },
2881 { { "t6" }, "$14" },
2882 { { "t7" }, "$15" },
2883 { { "s0" }, "$16" },
2884 { { "s1" }, "$17" },
2885 { { "s2" }, "$18" },
2886 { { "s3" }, "$19" },
2887 { { "s4" }, "$20" },
2888 { { "s5" }, "$21" },
2889 { { "s6" }, "$22" },
2890 { { "s7" }, "$23" },
2891 { { "t8" }, "$24" },
2892 { { "t9" }, "$25" },
2893 { { "k0" }, "$26" },
2894 { { "k1" }, "$27" },
2895 { { "gp" }, "$28" },
2896 { { "sp" }, "$29" },
2897 { { "fp" }, "$30" },
2898 { { "ra" }, "$31" }
2899};
2900
2901void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2902 unsigned &NumAliases) const {
2903 Aliases = GCCRegAliases;
2904 NumAliases = llvm::array_lengthof(GCCRegAliases);
2905}
2906} // end anonymous namespace.
2907
2908namespace {
2909class MipselTargetInfo : public MipsTargetInfo {
2910public:
2911 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2912 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 +00002913 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002914 }
2915
2916 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002917 MacroBuilder &Builder) const;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002918};
2919
2920void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002921 MacroBuilder &Builder) const {
2922 DefineStd(Builder, "mips", Opts);
2923 Builder.defineMacro("_mips");
2924 DefineStd(Builder, "MIPSEL", Opts);
2925 Builder.defineMacro("_MIPSEL");
2926 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002927 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002928}
2929} // end anonymous namespace.
2930
Ivan Krasindd7403e2011-08-24 20:22:22 +00002931namespace {
2932class PNaClTargetInfo : public TargetInfo {
2933public:
2934 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
2935 this->UserLabelPrefix = "";
2936 this->LongAlign = 32;
2937 this->LongWidth = 32;
2938 this->PointerAlign = 32;
2939 this->PointerWidth = 32;
2940 this->IntMaxType = TargetInfo::SignedLongLong;
2941 this->UIntMaxType = TargetInfo::UnsignedLongLong;
2942 this->Int64Type = TargetInfo::SignedLongLong;
2943 this->SizeType = TargetInfo::UnsignedInt;
Ivan Krasin69a990b2011-08-29 22:39:12 +00002944 this->DoubleAlign = 64;
2945 this->LongDoubleAlign = 64;
Ivan Krasindd7403e2011-08-24 20:22:22 +00002946 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
2947 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
2948 }
2949
2950 void getDefaultFeatures(const std::string &CPU,
2951 llvm::StringMap<bool> &Features) const {
2952 }
2953 virtual void getArchDefines(const LangOptions &Opts,
2954 MacroBuilder &Builder) const {
2955 Builder.defineMacro("__le32__");
2956 Builder.defineMacro("__pnacl__");
2957 }
2958 virtual void getTargetDefines(const LangOptions &Opts,
2959 MacroBuilder &Builder) const {
Ivan Krasin9b2cbdf2011-08-25 23:49:20 +00002960 DefineStd(Builder, "unix", Opts);
2961 Builder.defineMacro("__ELF__");
2962 if (Opts.POSIXThreads)
2963 Builder.defineMacro("_REENTRANT");
2964 if (Opts.CPlusPlus)
2965 Builder.defineMacro("_GNU_SOURCE");
2966
Ivan Krasindd7403e2011-08-24 20:22:22 +00002967 Builder.defineMacro("__native_client__");
2968 getArchDefines(Opts, Builder);
2969 }
2970 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2971 unsigned &NumRecords) const {
2972 }
2973 virtual const char *getVAListDeclaration() const {
Ivan Krasin7a09d122011-08-24 21:22:25 +00002974 return "typedef struct __va_list_tag {"
2975 " void* ptr;"
2976 " void* padding1;"
2977 " void* padding2;"
2978 " void* padding3;"
2979 "} __builtin_va_list[1];";
Ivan Krasindd7403e2011-08-24 20:22:22 +00002980 }
2981 virtual void getGCCRegNames(const char * const *&Names,
2982 unsigned &NumNames) const;
2983 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2984 unsigned &NumAliases) const;
2985 virtual bool validateAsmConstraint(const char *&Name,
2986 TargetInfo::ConstraintInfo &Info) const {
2987 return false;
2988 }
2989
2990 virtual const char *getClobbers() const {
2991 return "";
2992 }
2993};
2994
2995void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
2996 unsigned &NumNames) const {
2997 Names = NULL;
2998 NumNames = 0;
2999}
3000
3001void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3002 unsigned &NumAliases) const {
3003 Aliases = NULL;
3004 NumAliases = 0;
3005}
3006} // end anonymous namespace.
3007
3008
Chris Lattner5ba61f02006-10-14 07:39:34 +00003009//===----------------------------------------------------------------------===//
3010// Driver code
3011//===----------------------------------------------------------------------===//
3012
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003013static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00003014 llvm::Triple Triple(T);
3015 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00003016
Daniel Dunbar52322032009-08-18 05:47:58 +00003017 switch (Triple.getArch()) {
3018 default:
3019 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00003020
Daniel Dunbar52322032009-08-18 05:47:58 +00003021 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00003022 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003023 if (Triple.isOSDarwin())
3024 return new DarwinARMTargetInfo(T);
3025
Daniel Dunbar52322032009-08-18 05:47:58 +00003026 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00003027 case llvm::Triple::Linux:
3028 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003029 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00003030 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003031 case llvm::Triple::NetBSD:
3032 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00003033 case llvm::Triple::RTEMS:
3034 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003035 default:
3036 return new ARMTargetInfo(T);
3037 }
Eli Friedmanb5366062008-05-20 14:21:01 +00003038
Daniel Dunbar52322032009-08-18 05:47:58 +00003039 case llvm::Triple::bfin:
Douglas Gregor9fabd852011-07-01 22:41:14 +00003040 if ( os == llvm::Triple::RTEMS )
3041 return new RTEMSTargetInfo<BlackfinTargetInfo>(T);
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00003042 return new BlackfinTargetInfo(T);
3043
Daniel Dunbar52322032009-08-18 05:47:58 +00003044 case llvm::Triple::msp430:
3045 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00003046
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003047 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003048 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003049 case llvm::Triple::Linux:
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003050 return new LinuxTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003051 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00003052 return new RTEMSTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003053 case llvm::Triple::FreeBSD:
Joerg Sonnenbergerc46e3ce2011-07-07 17:01:45 +00003054 return new FreeBSDTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00003055 case llvm::Triple::NetBSD:
3056 return new NetBSDTargetInfo<MipsTargetInfo>(T);
3057 default:
3058 return new MipsTargetInfo(T);
3059 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003060
3061 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003062 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003063 case llvm::Triple::Linux:
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003064 return new LinuxTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003065 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00003066 return new RTEMSTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003067 case llvm::Triple::FreeBSD:
Joerg Sonnenbergerfbc0b3a2011-07-06 11:00:56 +00003068 return new FreeBSDTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00003069 case llvm::Triple::NetBSD:
3070 return new NetBSDTargetInfo<MipselTargetInfo>(T);
3071 default:
3072 return new MipsTargetInfo(T);
3073 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00003074
Ivan Krasindd7403e2011-08-24 20:22:22 +00003075 case llvm::Triple::le32:
3076 switch (os) {
3077 case llvm::Triple::NativeClient:
3078 return new PNaClTargetInfo(T);
3079 default:
3080 return NULL;
3081 }
3082
Daniel Dunbar52322032009-08-18 05:47:58 +00003083 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003084 if (Triple.isOSDarwin())
Roman Divacky965b0b72011-01-06 08:27:10 +00003085 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003086 switch (os) {
3087 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00003088 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003089 case llvm::Triple::NetBSD:
3090 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
3091 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00003092 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003093 default:
3094 return new PPC32TargetInfo(T);
3095 }
Daniel Dunbar52322032009-08-18 05:47:58 +00003096
3097 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003098 if (Triple.isOSDarwin())
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00003099 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003100 switch (os) {
3101 case llvm::Triple::Lv2:
John Thompsone467e192009-11-19 17:18:50 +00003102 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003103 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00003104 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003105 case llvm::Triple::NetBSD:
3106 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
3107 default:
3108 return new PPC64TargetInfo(T);
3109 }
Daniel Dunbar52322032009-08-18 05:47:58 +00003110
Justin Holewinski514cce82011-04-20 19:34:15 +00003111 case llvm::Triple::ptx32:
3112 return new PTX32TargetInfo(T);
3113 case llvm::Triple::ptx64:
3114 return new PTX64TargetInfo(T);
3115
Chris Lattner5178f562010-03-06 21:21:27 +00003116 case llvm::Triple::mblaze:
3117 return new MBlazeTargetInfo(T);
3118
Daniel Dunbar52322032009-08-18 05:47:58 +00003119 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003120 switch (os) {
3121 case llvm::Triple::AuroraUX:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003122 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003123 case llvm::Triple::Solaris:
Daniel Dunbar52322032009-08-18 05:47:58 +00003124 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003125 case llvm::Triple::NetBSD:
3126 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
3127 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00003128 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003129 default:
3130 return new SparcV8TargetInfo(T);
3131 }
Daniel Dunbar52322032009-08-18 05:47:58 +00003132
John Thompsone467e192009-11-19 17:18:50 +00003133 // FIXME: Need a real SPU target.
3134 case llvm::Triple::cellspu:
3135 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
3136
Daniel Dunbar52322032009-08-18 05:47:58 +00003137 case llvm::Triple::systemz:
3138 return new SystemZTargetInfo(T);
3139
Eli Friedmana9c3d712009-08-19 20:47:07 +00003140 case llvm::Triple::tce:
3141 return new TCETargetInfo(T);
3142
Daniel Dunbar52322032009-08-18 05:47:58 +00003143 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003144 if (Triple.isOSDarwin())
3145 return new DarwinI386TargetInfo(T);
3146
Daniel Dunbar52322032009-08-18 05:47:58 +00003147 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003148 case llvm::Triple::AuroraUX:
3149 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003150 case llvm::Triple::Linux:
3151 return new LinuxTargetInfo<X86_32TargetInfo>(T);
3152 case llvm::Triple::DragonFly:
3153 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
3154 case llvm::Triple::NetBSD:
3155 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
3156 case llvm::Triple::OpenBSD:
3157 return new OpenBSDI386TargetInfo(T);
3158 case llvm::Triple::FreeBSD:
3159 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00003160 case llvm::Triple::Minix:
3161 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003162 case llvm::Triple::Solaris:
3163 return new SolarisTargetInfo<X86_32TargetInfo>(T);
3164 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003165 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003166 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003167 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003168 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003169 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00003170 case llvm::Triple::Haiku:
3171 return new HaikuX86_32TargetInfo(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00003172 case llvm::Triple::RTEMS:
3173 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003174 default:
3175 return new X86_32TargetInfo(T);
3176 }
3177
3178 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003179 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
3180 return new DarwinX86_64TargetInfo(T);
3181
Daniel Dunbar52322032009-08-18 05:47:58 +00003182 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003183 case llvm::Triple::AuroraUX:
3184 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003185 case llvm::Triple::Linux:
3186 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00003187 case llvm::Triple::DragonFly:
3188 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003189 case llvm::Triple::NetBSD:
3190 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
3191 case llvm::Triple::OpenBSD:
3192 return new OpenBSDX86_64TargetInfo(T);
3193 case llvm::Triple::FreeBSD:
3194 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
3195 case llvm::Triple::Solaris:
3196 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00003197 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003198 return new MinGWX86_64TargetInfo(T);
3199 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003200 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003201 default:
3202 return new X86_64TargetInfo(T);
3203 }
3204 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003205}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003206
3207/// CreateTargetInfo - Return the target info object for the specified target
3208/// triple.
3209TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00003210 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003211 llvm::Triple Triple(Opts.Triple);
3212
3213 // Construct the target
3214 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3215 if (!Target) {
3216 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3217 return 0;
3218 }
3219
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003220 // Set the target CPU if specified.
3221 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3222 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3223 return 0;
3224 }
3225
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003226 // Set the target ABI if specified.
3227 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3228 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3229 return 0;
3230 }
3231
Charles Davis95a546e2010-06-11 01:06:47 +00003232 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00003233 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00003234 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3235 return 0;
3236 }
3237
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003238 // Compute the default target features, we need the target to handle this
3239 // because features may have dependencies on one another.
3240 llvm::StringMap<bool> Features;
3241 Target->getDefaultFeatures(Opts.CPU, Features);
3242
3243 // Apply the user specified deltas.
3244 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3245 ie = Opts.Features.end(); it != ie; ++it) {
3246 const char *Name = it->c_str();
3247
3248 // Apply the feature via the target.
3249 if ((Name[0] != '-' && Name[0] != '+') ||
3250 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
3251 Diags.Report(diag::err_target_invalid_feature) << Name;
3252 return 0;
3253 }
3254 }
3255
3256 // Add the features to the compile options.
3257 //
3258 // FIXME: If we are completely confident that we have the right set, we only
3259 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00003260 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003261 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
3262 ie = Features.end(); it != ie; ++it)
Chris Lattnerd386df42011-07-14 18:24:21 +00003263 Opts.Features.push_back(std::string(it->second ? "+" : "-") +
Chris Lattner2dc4b552011-07-14 18:45:41 +00003264 it->first().str());
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00003265 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003266
3267 return Target.take();
3268}