blob: fd7168d16ccf0101cba298027e7f0b2b9ba6b62b [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.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000040static void DefineStd(MacroBuilder &Builder, llvm::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,
80 llvm::StringRef &PlatformName,
81 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
Chris Lattner2a5c0a32009-04-07 16:50:40 +000087 // __weak is always defined, for use in blocks and with objc pointers.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000089
Chris Lattner2a5c0a32009-04-07 16:50:40 +000090 // Darwin defines __strong even in C mode (just to nothing).
91 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__strong", "");
Chris Lattner2a5c0a32009-04-07 16:50:40 +000093 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
Eli Friedmanfd4b1552009-06-04 23:00:29 +000095
96 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000097 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +000098 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000099 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000100
101 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000102 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000103
Daniel Dunbarecf13562011-04-19 21:40:34 +0000104 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000105 unsigned Maj, Min, Rev;
Mike Stump11289f42009-09-09 15:08:12 +0000106
Daniel Dunbard86666f2010-01-26 01:44:04 +0000107 // If no version was given, default to to 10.4.0, for simplifying tests.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000108 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
109 PlatformName = "macosx";
Daniel Dunbard86666f2010-01-26 01:44:04 +0000110 Min = Rev = 0;
111 Maj = 8;
Daniel Dunbarecf13562011-04-19 21:40:34 +0000112 } else {
113 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
114 // "-osxNNN", and "-iosNNN").
115
116 if (Triple.getOS() == llvm::Triple::Darwin) {
117 // For historical reasons that make little sense, the version passed here
118 // is the "darwin" version, which drops the 10 and offsets by 4.
119 Triple.getOSVersion(Maj, Min, Rev);
120
121 if (Triple.getEnvironmentName() == "iphoneos") {
122 PlatformName = "ios";
123 } else {
124 assert(Rev == 0 && "invalid triple, unexpected micro version!");
125 PlatformName = "macosx";
126 Rev = Min;
127 Min = Maj - 4;
128 Maj = 10;
129 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000130 } else {
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 Triple.getOSVersion(Maj, Min, Rev);
Daniel Dunbarfcd23892011-04-19 23:34:21 +0000132 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000133 }
134 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000135
136 // Set the appropriate OS version define.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000137 if (PlatformName == "ios") {
Daniel Dunbard86666f2010-01-26 01:44:04 +0000138 assert(Maj < 10 && Min < 99 && Rev < 99 && "Invalid version!");
139 char Str[6];
140 Str[0] = '0' + Maj;
141 Str[1] = '0' + (Min / 10);
142 Str[2] = '0' + (Min % 10);
143 Str[3] = '0' + (Rev / 10);
144 Str[4] = '0' + (Rev % 10);
145 Str[5] = '\0';
146 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
147 } else {
Daniel Dunbard86666f2010-01-26 01:44:04 +0000148 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
149 assert(Maj < 99 && Min < 10 && Rev < 10 && "Invalid version!");
150 char Str[5];
151 Str[0] = '0' + (Maj / 10);
152 Str[1] = '0' + (Maj % 10);
153 Str[2] = '0' + Min;
154 Str[3] = '0' + Rev;
155 Str[4] = '\0';
156 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000157 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000158
159 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000160}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000161
Chris Lattner30ba6742009-08-10 19:03:04 +0000162namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000163template<typename Target>
164class DarwinTargetInfo : public OSTargetInfo<Target> {
165protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000166 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000167 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000168 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
169 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000170 }
Mike Stump11289f42009-09-09 15:08:12 +0000171
Torok Edwinb2b37c62009-06-30 17:10:35 +0000172public:
173 DarwinTargetInfo(const std::string& triple) :
174 OSTargetInfo<Target>(triple) {
Eric Christopher17c7b892010-06-25 19:04:52 +0000175 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
Daniel Dunbar13adc7f2011-02-21 23:12:51 +0000176 this->MCountName = "\01mcount";
Torok Edwinb2b37c62009-06-30 17:10:35 +0000177 }
178
Anders Carlsson0b0a1222010-01-30 18:33:31 +0000179 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000180 // Let MCSectionMachO validate this.
181 llvm::StringRef Segment, Section;
182 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000183 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000184 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000185 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000186 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000187
Anders Carlsson851318a2010-06-08 22:47:50 +0000188 virtual const char *getStaticInitSectionSpecifier() const {
189 // FIXME: We should return 0 when building kexts.
190 return "__TEXT,__StaticInit,regular,pure_instructions";
191 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000192
Torok Edwinb2b37c62009-06-30 17:10:35 +0000193};
194
Chris Lattner30ba6742009-08-10 19:03:04 +0000195
Torok Edwinb2b37c62009-06-30 17:10:35 +0000196// DragonFlyBSD Target
197template<typename Target>
198class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
199protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000200 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000201 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000202 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000203 Builder.defineMacro("__DragonFly__");
204 Builder.defineMacro("__DragonFly_cc_version", "100001");
205 Builder.defineMacro("__ELF__");
206 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
207 Builder.defineMacro("__tune_i386__");
208 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000209 }
210public:
Mike Stump11289f42009-09-09 15:08:12 +0000211 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000212 : OSTargetInfo<Target>(triple) {}
213};
214
215// FreeBSD Target
216template<typename Target>
217class FreeBSDTargetInfo : public OSTargetInfo<Target> {
218protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000219 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000220 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221 // FreeBSD defines; list based off of gcc output
222
Daniel Dunbar40165182009-08-24 09:10:05 +0000223 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000224 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000225
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000226 Builder.defineMacro("__FreeBSD__", Release);
227 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000228 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
229 DefineStd(Builder, "unix", Opts);
230 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000231 }
232public:
Mike Stump11289f42009-09-09 15:08:12 +0000233 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000234 : OSTargetInfo<Target>(triple) {
235 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000236
237 llvm::Triple Triple(triple);
238 switch (Triple.getArch()) {
239 default:
240 case llvm::Triple::x86:
241 case llvm::Triple::x86_64:
242 this->MCountName = ".mcount";
243 break;
244 case llvm::Triple::mips:
245 case llvm::Triple::mipsel:
246 case llvm::Triple::ppc:
247 case llvm::Triple::ppc64:
248 this->MCountName = "_mcount";
249 break;
250 case llvm::Triple::arm:
251 this->MCountName = "__mcount";
252 break;
253 }
254
Duncan Sands9cb27e92009-07-08 13:55:08 +0000255 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000256};
257
Chris Lattner3e2ee142010-07-07 16:01:42 +0000258// Minix Target
259template<typename Target>
260class MinixTargetInfo : public OSTargetInfo<Target> {
261protected:
262 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
263 MacroBuilder &Builder) const {
264 // Minix defines
265
266 Builder.defineMacro("__minix", "3");
267 Builder.defineMacro("_EM_WSIZE", "4");
268 Builder.defineMacro("_EM_PSIZE", "4");
269 Builder.defineMacro("_EM_SSIZE", "2");
270 Builder.defineMacro("_EM_LSIZE", "4");
271 Builder.defineMacro("_EM_FSIZE", "4");
272 Builder.defineMacro("_EM_DSIZE", "8");
273 DefineStd(Builder, "unix", Opts);
274 }
275public:
276 MinixTargetInfo(const std::string &triple)
277 : OSTargetInfo<Target>(triple) {
278 this->UserLabelPrefix = "";
279 }
280};
281
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282// Linux target
283template<typename Target>
284class LinuxTargetInfo : public OSTargetInfo<Target> {
285protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000286 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000287 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000288 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000289 DefineStd(Builder, "unix", Opts);
290 DefineStd(Builder, "linux", Opts);
291 Builder.defineMacro("__gnu_linux__");
292 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000293 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000294 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000295 if (Opts.CPlusPlus)
296 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297 }
298public:
Mike Stump11289f42009-09-09 15:08:12 +0000299 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000300 : OSTargetInfo<Target>(triple) {
301 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000302 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 }
304};
305
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000306// NetBSD Target
307template<typename Target>
308class NetBSDTargetInfo : public OSTargetInfo<Target> {
309protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000310 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000311 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000312 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000313 Builder.defineMacro("__NetBSD__");
314 Builder.defineMacro("__unix__");
315 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000316 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000317 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000318 }
319public:
Mike Stump11289f42009-09-09 15:08:12 +0000320 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000321 : OSTargetInfo<Target>(triple) {
322 this->UserLabelPrefix = "";
323 }
324};
325
Torok Edwinb2b37c62009-06-30 17:10:35 +0000326// OpenBSD Target
327template<typename Target>
328class OpenBSDTargetInfo : public OSTargetInfo<Target> {
329protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000330 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000331 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000332 // OpenBSD defines; list based off of gcc output
333
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000334 Builder.defineMacro("__OpenBSD__");
335 DefineStd(Builder, "unix", Opts);
336 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000337 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000338 Builder.defineMacro("_POSIX_THREADS");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000339 }
340public:
Mike Stump11289f42009-09-09 15:08:12 +0000341 OpenBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342 : OSTargetInfo<Target>(triple) {}
343};
344
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000345// PSP Target
346template<typename Target>
347class PSPTargetInfo : public OSTargetInfo<Target> {
348protected:
349 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000350 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000351 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000352 Builder.defineMacro("PSP");
353 Builder.defineMacro("_PSP");
354 Builder.defineMacro("__psp__");
355 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000356 }
357public:
358 PSPTargetInfo(const std::string& triple)
359 : OSTargetInfo<Target>(triple) {
360 this->UserLabelPrefix = "";
361 }
362};
363
John Thompsone467e192009-11-19 17:18:50 +0000364// PS3 PPU Target
365template<typename Target>
366class PS3PPUTargetInfo : public OSTargetInfo<Target> {
367protected:
368 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000369 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000370 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000371 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000372 Builder.defineMacro("__PPU__");
373 Builder.defineMacro("__CELLOS_LV2__");
374 Builder.defineMacro("__ELF__");
375 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000376 Builder.defineMacro("_ARCH_PPC64");
377 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000378 }
379public:
380 PS3PPUTargetInfo(const std::string& triple)
381 : OSTargetInfo<Target>(triple) {
382 this->UserLabelPrefix = "";
John Thompson6f8dba72009-12-18 14:21:08 +0000383 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000384 this->IntMaxType = TargetInfo::SignedLongLong;
385 this->UIntMaxType = TargetInfo::UnsignedLongLong;
386 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000387 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000388 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
389 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000390 }
391};
392
393// FIXME: Need a real SPU target.
394// PS3 SPU Target
395template<typename Target>
396class PS3SPUTargetInfo : public OSTargetInfo<Target> {
397protected:
398 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000399 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000400 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000401 Builder.defineMacro("__SPU__");
402 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000403 }
404public:
405 PS3SPUTargetInfo(const std::string& triple)
406 : OSTargetInfo<Target>(triple) {
407 this->UserLabelPrefix = "";
408 }
409};
410
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000411// AuroraUX target
412template<typename Target>
413class AuroraUXTargetInfo : public OSTargetInfo<Target> {
414protected:
415 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000416 MacroBuilder &Builder) const {
417 DefineStd(Builder, "sun", Opts);
418 DefineStd(Builder, "unix", Opts);
419 Builder.defineMacro("__ELF__");
420 Builder.defineMacro("__svr4__");
421 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000422 }
423public:
424 AuroraUXTargetInfo(const std::string& triple)
425 : OSTargetInfo<Target>(triple) {
426 this->UserLabelPrefix = "";
427 this->WCharType = this->SignedLong;
428 // FIXME: WIntType should be SignedLong
429 }
430};
431
Torok Edwinb2b37c62009-06-30 17:10:35 +0000432// Solaris target
433template<typename Target>
434class SolarisTargetInfo : public OSTargetInfo<Target> {
435protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000436 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000437 MacroBuilder &Builder) const {
438 DefineStd(Builder, "sun", Opts);
439 DefineStd(Builder, "unix", Opts);
440 Builder.defineMacro("__ELF__");
441 Builder.defineMacro("__svr4__");
442 Builder.defineMacro("__SVR4");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000443 }
444public:
Mike Stump11289f42009-09-09 15:08:12 +0000445 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000446 : OSTargetInfo<Target>(triple) {
447 this->UserLabelPrefix = "";
448 this->WCharType = this->SignedLong;
449 // FIXME: WIntType should be SignedLong
450 }
451};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000452
453// Windows target
454template<typename Target>
455class WindowsTargetInfo : public OSTargetInfo<Target> {
456protected:
457 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
458 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000459 Builder.defineMacro("_WIN32");
460 }
461 void getVisualStudioDefines(const LangOptions &Opts,
462 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000463 if (Opts.CPlusPlus) {
464 if (Opts.RTTI)
465 Builder.defineMacro("_CPPRTTI");
466
467 if (Opts.Exceptions)
468 Builder.defineMacro("_CPPUNWIND");
469 }
470
471 if (!Opts.CharIsSigned)
472 Builder.defineMacro("_CHAR_UNSIGNED");
473
474 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
475 // but it works for now.
476 if (Opts.POSIXThreads)
477 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000478
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000479 if (Opts.MSCVersion != 0)
480 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
481
482 if (Opts.Microsoft) {
483 Builder.defineMacro("_MSC_EXTENSIONS");
484
485 if (Opts.CPlusPlus0x) {
486 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
487 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
488 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
489 }
490 }
491
492 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000493 }
494
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000495public:
496 WindowsTargetInfo(const std::string &triple)
497 : OSTargetInfo<Target>(triple) {}
498};
499
Mike Stump11289f42009-09-09 15:08:12 +0000500} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000501
Chris Lattner09d98f52008-10-05 21:50:58 +0000502//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000503// Specific target implementations.
504//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000505
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000506namespace {
507// PPC abstract base class
508class PPCTargetInfo : public TargetInfo {
509 static const Builtin::Info BuiltinInfo[];
510 static const char * const GCCRegNames[];
511 static const TargetInfo::GCCRegAlias GCCRegAliases[];
512
513public:
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000514 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
515
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000516 virtual void getTargetBuiltins(const Builtin::Info *&Records,
517 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000518 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000519 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000520 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000521
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000522 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000523 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000524
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000525 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000526 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000527 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000528 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000529 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000530 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000531 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000532 default: return false;
533 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000534 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000535 case 'b': // Base register
536 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000537 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000538 break;
539 // FIXME: The following are added to allow parsing.
540 // I just took a guess at what the actions should be.
541 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000542 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000543 case 'v': // Altivec vector register
544 Info.setAllowsRegister();
545 break;
546 case 'w':
547 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000548 case 'd':// VSX vector register to hold vector double data
549 case 'f':// VSX vector register to hold vector float data
550 case 's':// VSX vector register to hold scalar float data
551 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000552 break;
553 default:
554 return false;
555 }
556 Info.setAllowsRegister();
557 Name++; // Skip over 'w'.
558 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000559 case 'h': // `MQ', `CTR', or `LINK' register
560 case 'q': // `MQ' register
561 case 'c': // `CTR' register
562 case 'l': // `LINK' register
563 case 'x': // `CR' register (condition register) number 0
564 case 'y': // `CR' register (condition register)
565 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000566 Info.setAllowsRegister();
567 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000568 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000569 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000570 // (use `L' instead for SImode constants)
571 case 'K': // Unsigned 16-bit constant
572 case 'L': // Signed 16-bit constant shifted left 16 bits
573 case 'M': // Constant larger than 31
574 case 'N': // Exact power of 2
575 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000576 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000577 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000578 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000579 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000580 break;
581 case 'm': // Memory operand. Note that on PowerPC targets, m can
582 // include addresses that update the base register. It
583 // is therefore only safe to use `m' in an asm statement
584 // if that asm statement accesses the operand exactly once.
585 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000586 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000587 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000588 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000589 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000590 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
591 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000592 // register to be updated.
593 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000594 if (Name[1] != 's')
595 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000596 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000597 // include any automodification of the base register. Unlike
598 // `m', this constraint can be used in asm statements that
599 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000600 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000601 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000602 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000603 break;
604 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000605 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000606 case 'Z': // Memory operand that is an indexed or indirect from a
607 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000608 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000609 Info.setAllowsMemory();
610 Info.setAllowsRegister();
611 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000612 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000613 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000614 // register (`p' is preferable for asm statements)
615 case 'S': // Constant suitable as a 64-bit mask operand
616 case 'T': // Constant suitable as a 32-bit mask operand
617 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000618 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000619 // instructions
620 case 'W': // Vector constant that does not require memory
621 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000622 break;
623 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000624 }
John Thompson07a61a42010-06-24 22:44:13 +0000625 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000626 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000627 virtual const char *getClobbers() const {
628 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000629 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000630};
Anders Carlssonf511f642007-11-27 04:11:28 +0000631
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000632const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000633#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
634#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
635 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000636#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000637};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000638
639
Chris Lattnerecd49032009-03-02 22:27:17 +0000640/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
641/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000642void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000643 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000644 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000645 Builder.defineMacro("__ppc__");
646 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000647 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000648 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000649 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000650 Builder.defineMacro("_ARCH_PPC64");
651 Builder.defineMacro("_LP64");
652 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000653 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000654 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000655 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000656 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000657 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000658
Chris Lattnerecd49032009-03-02 22:27:17 +0000659 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000660 Builder.defineMacro("_BIG_ENDIAN");
661 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000662
Chris Lattnerecd49032009-03-02 22:27:17 +0000663 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000664 Builder.defineMacro("__NATURAL_ALIGNMENT__");
665 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000666
Chris Lattnerecd49032009-03-02 22:27:17 +0000667 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000668 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000669
John Thompsone467e192009-11-19 17:18:50 +0000670 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000671 Builder.defineMacro("__VEC__", "10206");
672 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000673 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000674}
675
Chris Lattner17df24e2008-04-21 18:56:49 +0000676
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000677const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000678 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
679 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
680 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
681 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
682 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
683 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
684 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
685 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000686 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000687 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000688 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000689 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
690 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
691 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
692 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000693 "vrsave", "vscr",
694 "spe_acc", "spefscr",
695 "sfp"
696};
Chris Lattner10a5b382007-01-29 05:24:35 +0000697
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000698void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000699 unsigned &NumNames) const {
700 Names = GCCRegNames;
701 NumNames = llvm::array_lengthof(GCCRegNames);
702}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000703
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000704const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
705 // While some of these aliases do map to different registers
706 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000707 { { "0" }, "r0" },
708 { { "1"}, "r1" },
709 { { "2" }, "r2" },
710 { { "3" }, "r3" },
711 { { "4" }, "r4" },
712 { { "5" }, "r5" },
713 { { "6" }, "r6" },
714 { { "7" }, "r7" },
715 { { "8" }, "r8" },
716 { { "9" }, "r9" },
717 { { "10" }, "r10" },
718 { { "11" }, "r11" },
719 { { "12" }, "r12" },
720 { { "13" }, "r13" },
721 { { "14" }, "r14" },
722 { { "15" }, "r15" },
723 { { "16" }, "r16" },
724 { { "17" }, "r17" },
725 { { "18" }, "r18" },
726 { { "19" }, "r19" },
727 { { "20" }, "r20" },
728 { { "21" }, "r21" },
729 { { "22" }, "r22" },
730 { { "23" }, "r23" },
731 { { "24" }, "r24" },
732 { { "25" }, "r25" },
733 { { "26" }, "r26" },
734 { { "27" }, "r27" },
735 { { "28" }, "r28" },
736 { { "29" }, "r29" },
737 { { "30" }, "r30" },
738 { { "31" }, "r31" },
739 { { "fr0" }, "f0" },
740 { { "fr1" }, "f1" },
741 { { "fr2" }, "f2" },
742 { { "fr3" }, "f3" },
743 { { "fr4" }, "f4" },
744 { { "fr5" }, "f5" },
745 { { "fr6" }, "f6" },
746 { { "fr7" }, "f7" },
747 { { "fr8" }, "f8" },
748 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000749 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000750 { { "fr11" }, "f11" },
751 { { "fr12" }, "f12" },
752 { { "fr13" }, "f13" },
753 { { "fr14" }, "f14" },
754 { { "fr15" }, "f15" },
755 { { "fr16" }, "f16" },
756 { { "fr17" }, "f17" },
757 { { "fr18" }, "f18" },
758 { { "fr19" }, "f19" },
759 { { "fr20" }, "f20" },
760 { { "fr21" }, "f21" },
761 { { "fr22" }, "f22" },
762 { { "fr23" }, "f23" },
763 { { "fr24" }, "f24" },
764 { { "fr25" }, "f25" },
765 { { "fr26" }, "f26" },
766 { { "fr27" }, "f27" },
767 { { "fr28" }, "f28" },
768 { { "fr29" }, "f29" },
769 { { "fr30" }, "f30" },
770 { { "fr31" }, "f31" },
771 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000772};
773
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000774void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000775 unsigned &NumAliases) const {
776 Aliases = GCCRegAliases;
777 NumAliases = llvm::array_lengthof(GCCRegAliases);
778}
779} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000780
Chris Lattner5ba61f02006-10-14 07:39:34 +0000781namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000782class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000783public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000784 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000785 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 +0000786 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000787
788 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divacky965b0b72011-01-06 08:27:10 +0000789 SizeType = UnsignedInt;
790 }
791
792 virtual const char *getVAListDeclaration() const {
793 // This is the ELF definition, and is overridden by the Darwin sub-target
794 return "typedef struct __va_list_tag {"
795 " unsigned char gpr;"
796 " unsigned char fpr;"
797 " unsigned short reserved;"
798 " void* overflow_arg_area;"
799 " void* reg_save_area;"
800 "} __builtin_va_list[1];";
Eli Friedman873f65a2008-08-21 00:13:15 +0000801 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000802};
803} // end anonymous namespace.
804
805namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000806class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000807public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000808 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000809 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000810 IntMaxType = SignedLong;
811 UIntMaxType = UnsignedLong;
812 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000813 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 +0000814 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000815 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000816 virtual const char *getVAListDeclaration() const {
817 return "typedef char* __builtin_va_list;";
818 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000819};
820} // end anonymous namespace.
821
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000822
823namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +0000824class DarwinPPC32TargetInfo :
825 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000826public:
Roman Divacky965b0b72011-01-06 08:27:10 +0000827 DarwinPPC32TargetInfo(const std::string& triple)
828 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000829 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +0000830 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
831 }
832 virtual const char *getVAListDeclaration() const {
833 return "typedef char* __builtin_va_list;";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000834 }
835};
836
837class DarwinPPC64TargetInfo :
838 public DarwinTargetInfo<PPC64TargetInfo> {
839public:
840 DarwinPPC64TargetInfo(const std::string& triple)
841 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
842 HasAlignMac68kSupport = true;
843 }
844};
845} // end anonymous namespace.
846
Chris Lattner5ba61f02006-10-14 07:39:34 +0000847namespace {
Justin Holewinski514cce82011-04-20 19:34:15 +0000848 class PTXTargetInfo : public TargetInfo {
849 static const char * const GCCRegNames[];
850 static const Builtin::Info BuiltinInfo[];
851 public:
852 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
853 TLSSupported = false;
854 LongWidth = LongAlign = 64;
855 }
856 virtual void getTargetDefines(const LangOptions &Opts,
857 MacroBuilder &Builder) const {
858 Builder.defineMacro("__PTX__");
859 }
860 virtual void getTargetBuiltins(const Builtin::Info *&Records,
861 unsigned &NumRecords) const {
862 Records = BuiltinInfo;
863 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
864 }
865
866 virtual void getGCCRegNames(const char * const *&Names,
867 unsigned &NumNames) const;
868 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
869 unsigned &NumAliases) const {
870 // No aliases.
871 Aliases = 0;
872 NumAliases = 0;
873 }
874 virtual bool validateAsmConstraint(const char *&Name,
875 TargetInfo::ConstraintInfo &info) const {
876 // FIXME: implement
877 return true;
878 }
879 virtual const char *getClobbers() const {
880 // FIXME: Is this really right?
881 return "";
882 }
883 virtual const char *getVAListDeclaration() const {
884 // FIXME: implement
885 return "typedef char* __builtin_va_list;";
886 }
887 };
888
889 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
890#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
891#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
892 ALL_LANGUAGES, false },
893#include "clang/Basic/BuiltinsPTX.def"
894 };
895
896 const char * const PTXTargetInfo::GCCRegNames[] = {
897 "r0"
898 };
899
900 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
901 unsigned &NumNames) const {
902 Names = GCCRegNames;
903 NumNames = llvm::array_lengthof(GCCRegNames);
904 }
905
906
907 class PTX32TargetInfo : public PTXTargetInfo {
908 public:
909 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
910 PointerWidth = PointerAlign = 32;
911 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
912 DescriptionString
913 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
914 }
915 };
916
917 class PTX64TargetInfo : public PTXTargetInfo {
918 public:
919 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
920 PointerWidth = PointerAlign = 64;
921 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
922 DescriptionString
923 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
924 }
925 };
926}
927
928namespace {
Chris Lattner5178f562010-03-06 21:21:27 +0000929// MBlaze abstract base class
930class MBlazeTargetInfo : public TargetInfo {
931 static const char * const GCCRegNames[];
932 static const TargetInfo::GCCRegAlias GCCRegAliases[];
933
934public:
935 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +0000936 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +0000937 }
938
939 virtual void getTargetBuiltins(const Builtin::Info *&Records,
940 unsigned &NumRecords) const {
941 // FIXME: Implement.
942 Records = 0;
943 NumRecords = 0;
944 }
945
946 virtual void getTargetDefines(const LangOptions &Opts,
947 MacroBuilder &Builder) const;
948
949 virtual const char *getVAListDeclaration() const {
950 return "typedef char* __builtin_va_list;";
951 }
952 virtual const char *getTargetPrefix() const {
953 return "mblaze";
954 }
955 virtual void getGCCRegNames(const char * const *&Names,
956 unsigned &NumNames) const;
957 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
958 unsigned &NumAliases) const;
959 virtual bool validateAsmConstraint(const char *&Name,
960 TargetInfo::ConstraintInfo &Info) const {
961 switch (*Name) {
962 default: return false;
963 case 'O': // Zero
964 return true;
965 case 'b': // Base register
966 case 'f': // Floating point register
967 Info.setAllowsRegister();
968 return true;
969 }
970 }
971 virtual const char *getClobbers() const {
972 return "";
973 }
974};
975
976/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
977/// #defines that are not tied to a specific subtarget.
978void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
979 MacroBuilder &Builder) const {
980 // Target identification.
981 Builder.defineMacro("__microblaze__");
982 Builder.defineMacro("_ARCH_MICROBLAZE");
983 Builder.defineMacro("__MICROBLAZE__");
984
985 // Target properties.
986 Builder.defineMacro("_BIG_ENDIAN");
987 Builder.defineMacro("__BIG_ENDIAN__");
988
989 // Subtarget options.
990 Builder.defineMacro("__REGISTER_PREFIX__", "");
991}
992
993
994const char * const MBlazeTargetInfo::GCCRegNames[] = {
995 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
996 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
997 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
998 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
999 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1000 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1001 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1002 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1003 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1004 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1005};
1006
1007void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1008 unsigned &NumNames) const {
1009 Names = GCCRegNames;
1010 NumNames = llvm::array_lengthof(GCCRegNames);
1011}
1012
1013const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1014 { {"f0"}, "r0" },
1015 { {"f1"}, "r1" },
1016 { {"f2"}, "r2" },
1017 { {"f3"}, "r3" },
1018 { {"f4"}, "r4" },
1019 { {"f5"}, "r5" },
1020 { {"f6"}, "r6" },
1021 { {"f7"}, "r7" },
1022 { {"f8"}, "r8" },
1023 { {"f9"}, "r9" },
1024 { {"f10"}, "r10" },
1025 { {"f11"}, "r11" },
1026 { {"f12"}, "r12" },
1027 { {"f13"}, "r13" },
1028 { {"f14"}, "r14" },
1029 { {"f15"}, "r15" },
1030 { {"f16"}, "r16" },
1031 { {"f17"}, "r17" },
1032 { {"f18"}, "r18" },
1033 { {"f19"}, "r19" },
1034 { {"f20"}, "r20" },
1035 { {"f21"}, "r21" },
1036 { {"f22"}, "r22" },
1037 { {"f23"}, "r23" },
1038 { {"f24"}, "r24" },
1039 { {"f25"}, "r25" },
1040 { {"f26"}, "r26" },
1041 { {"f27"}, "r27" },
1042 { {"f28"}, "r28" },
1043 { {"f29"}, "r29" },
1044 { {"f30"}, "r30" },
1045 { {"f31"}, "r31" },
1046};
1047
1048void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1049 unsigned &NumAliases) const {
1050 Aliases = GCCRegAliases;
1051 NumAliases = llvm::array_lengthof(GCCRegAliases);
1052}
1053} // end anonymous namespace.
1054
1055namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001056// Namespace for x86 abstract base class
1057const Builtin::Info BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001058#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
1059#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1060 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +00001061#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001062};
Eli Friedmanb5366062008-05-20 14:21:01 +00001063
Nuno Lopescfca1f02009-12-23 17:49:57 +00001064static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001065 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1066 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1067 "argp", "flags", "fspr", "dirflag", "frame",
1068 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1069 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1070 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1071 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
1072};
1073
1074const TargetInfo::GCCRegAlias GCCRegAliases[] = {
1075 { { "al", "ah", "eax", "rax" }, "ax" },
1076 { { "bl", "bh", "ebx", "rbx" }, "bx" },
1077 { { "cl", "ch", "ecx", "rcx" }, "cx" },
1078 { { "dl", "dh", "edx", "rdx" }, "dx" },
1079 { { "esi", "rsi" }, "si" },
1080 { { "edi", "rdi" }, "di" },
1081 { { "esp", "rsp" }, "sp" },
1082 { { "ebp", "rbp" }, "bp" },
1083};
1084
1085// X86 target abstract base class; x86-32 and x86-64 are very close, so
1086// most of the implementation can be shared.
1087class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001088 enum X86SSEEnum {
1089 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
1090 } SSELevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001091 enum AMD3DNowEnum {
1092 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
1093 } AMD3DNowLevel;
1094
Eric Christophere1ddaf92010-04-02 23:50:19 +00001095 bool HasAES;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001096 bool HasAVX;
1097
Eli Friedman3fd920a2008-08-20 02:34:37 +00001098public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001099 X86TargetInfo(const std::string& triple)
Eric Christophere1ddaf92010-04-02 23:50:19 +00001100 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001101 HasAES(false), HasAVX(false) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001102 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001103 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001104 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1105 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001106 Records = BuiltinInfo;
1107 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001108 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001109 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001110 unsigned &NumNames) const {
1111 Names = GCCRegNames;
1112 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001113 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001114 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001115 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001116 Aliases = GCCRegAliases;
1117 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +00001118 }
Anders Carlsson58436352009-02-28 17:11:49 +00001119 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001120 TargetInfo::ConstraintInfo &info) const;
1121 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001122 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001123 return "~{dirflag},~{fpsr},~{flags}";
1124 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001125 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001126 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001127 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1128 const std::string &Name,
1129 bool Enabled) const;
Mike Stump11289f42009-09-09 15:08:12 +00001130 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001131 llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001132 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Chris Lattner5ba61f02006-10-14 07:39:34 +00001133};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001134
Mike Stump11289f42009-09-09 15:08:12 +00001135void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001136 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001137 // FIXME: This should not be here.
1138 Features["3dnow"] = false;
1139 Features["3dnowa"] = false;
1140 Features["mmx"] = false;
1141 Features["sse"] = false;
1142 Features["sse2"] = false;
1143 Features["sse3"] = false;
1144 Features["ssse3"] = false;
1145 Features["sse41"] = false;
1146 Features["sse42"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001147 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001148 Features["avx"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001149
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001150 // LLVM does not currently recognize this.
1151 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001152
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001153 // FIXME: This *really* should not be here.
1154
1155 // X86_64 always has SSE2.
1156 if (PointerWidth == 64)
1157 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1158
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001159 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1160 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1161 ;
1162 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1163 setFeatureEnabled(Features, "mmx", true);
1164 else if (CPU == "pentium3")
1165 setFeatureEnabled(Features, "sse", true);
1166 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1167 setFeatureEnabled(Features, "sse2", true);
1168 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1169 setFeatureEnabled(Features, "sse3", true);
1170 else if (CPU == "core2")
1171 setFeatureEnabled(Features, "ssse3", true);
1172 else if (CPU == "penryn") {
1173 setFeatureEnabled(Features, "sse4", true);
1174 Features["sse42"] = false;
1175 } else if (CPU == "atom")
1176 setFeatureEnabled(Features, "sse3", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001177 else if (CPU == "corei7") {
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001178 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001179 setFeatureEnabled(Features, "aes", true);
Roman Divacky27ec14f2011-04-05 20:32:44 +00001180 } else if (CPU == "sandybridge") {
1181 setFeatureEnabled(Features, "sse4", true);
1182 setFeatureEnabled(Features, "aes", true);
1183// setFeatureEnabled(Features, "avx", true);
1184 } else if (CPU == "k6" || CPU == "winchip-c6")
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001185 setFeatureEnabled(Features, "mmx", true);
Mike Stump11289f42009-09-09 15:08:12 +00001186 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001187 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1188 setFeatureEnabled(Features, "mmx", true);
1189 setFeatureEnabled(Features, "3dnow", true);
1190 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1191 setFeatureEnabled(Features, "sse", true);
1192 setFeatureEnabled(Features, "3dnowa", true);
1193 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1194 CPU == "athlon-fx") {
Mike Stump11289f42009-09-09 15:08:12 +00001195 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001196 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001197 } else if (CPU == "k8-sse3") {
1198 setFeatureEnabled(Features, "sse3", true);
1199 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001200 } else if (CPU == "c3-2")
1201 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001202}
1203
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001204bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001205 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001206 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001207 // FIXME: This *really* should not be here. We need some way of translating
1208 // options into llvm subtarget features.
1209 if (!Features.count(Name) &&
1210 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001211 return false;
1212
1213 if (Enabled) {
1214 if (Name == "mmx")
1215 Features["mmx"] = true;
1216 else if (Name == "sse")
1217 Features["mmx"] = Features["sse"] = true;
1218 else if (Name == "sse2")
1219 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1220 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001221 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001222 Features["sse3"] = true;
1223 else if (Name == "ssse3")
Mike Stump11289f42009-09-09 15:08:12 +00001224 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001225 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001226 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump11289f42009-09-09 15:08:12 +00001227 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001228 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001229 else if (Name == "sse4.1")
1230 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1231 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001232 else if (Name == "3dnow")
1233 Features["3dnowa"] = true;
1234 else if (Name == "3dnowa")
1235 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001236 else if (Name == "aes")
1237 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001238 else if (Name == "avx")
1239 Features["avx"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001240 } else {
1241 if (Name == "mmx")
Michael J. Spencera9e41172011-04-17 19:22:03 +00001242 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] =
1243 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001244 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1245 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001246 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001247 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1248 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001249 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001250 Features["sse41"] = Features["sse42"] = false;
1251 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001252 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001253 Features["sse42"] = false;
1254 else if (Name == "ssse3")
1255 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencera9e41172011-04-17 19:22:03 +00001256 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001257 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001258 else if (Name == "sse4.2")
1259 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001260 else if (Name == "3dnow")
1261 Features["3dnow"] = Features["3dnowa"] = false;
1262 else if (Name == "3dnowa")
1263 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001264 else if (Name == "aes")
1265 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001266 else if (Name == "avx")
1267 Features["avx"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001268 }
1269
1270 return true;
1271}
1272
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001273/// HandleTargetOptions - Perform initialization based on the user
1274/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001275void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001276 // Remember the maximum enabled sselevel.
1277 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1278 // Ignore disabled features.
1279 if (Features[i][0] == '-')
1280 continue;
1281
Eric Christophere1ddaf92010-04-02 23:50:19 +00001282 if (Features[i].substr(1) == "aes") {
1283 HasAES = true;
1284 continue;
1285 }
1286
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001287 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1288 // For now let it be enabled together with other SSE levels.
1289 if (Features[i].substr(1) == "avx") {
1290 HasAVX = true;
1291 continue;
1292 }
1293
Daniel Dunbar979586e2009-11-11 09:38:56 +00001294 assert(Features[i][0] == '+' && "Invalid target feature!");
1295 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1296 .Case("sse42", SSE42)
1297 .Case("sse41", SSE41)
1298 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001299 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001300 .Case("sse2", SSE2)
1301 .Case("sse", SSE1)
1302 .Case("mmx", MMX)
1303 .Default(NoMMXSSE);
1304 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001305
1306 AMD3DNowEnum ThreeDNowLevel =
Anders Carlssone437c682010-01-27 03:47:49 +00001307 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1308 .Case("3dnowa", AMD3DNowAthlon)
1309 .Case("3dnow", AMD3DNow)
1310 .Default(NoAMD3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001311
Anders Carlssone437c682010-01-27 03:47:49 +00001312 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001313 }
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001314}
Chris Lattnerecd49032009-03-02 22:27:17 +00001315
1316/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1317/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001318void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001319 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001320 // Target identification.
1321 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001322 Builder.defineMacro("_LP64");
1323 Builder.defineMacro("__LP64__");
1324 Builder.defineMacro("__amd64__");
1325 Builder.defineMacro("__amd64");
1326 Builder.defineMacro("__x86_64");
1327 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001328 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001329 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001330 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001331
Eric Christophere1ddaf92010-04-02 23:50:19 +00001332 if (HasAES)
1333 Builder.defineMacro("__AES__");
1334
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001335 if (HasAVX)
1336 Builder.defineMacro("__AVX__");
1337
Chris Lattnerecd49032009-03-02 22:27:17 +00001338 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001339 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001340
Chris Lattnerecd49032009-03-02 22:27:17 +00001341 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001342 Builder.defineMacro("__nocona");
1343 Builder.defineMacro("__nocona__");
1344 Builder.defineMacro("__tune_nocona__");
1345 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +00001346
Chris Lattner6df41af2009-04-19 17:32:33 +00001347 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1348 // functions in glibc header files that use FP Stack inline asm which the
1349 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001350 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001351
Chris Lattner96e43572009-03-02 22:40:39 +00001352 // Each case falls through to the previous one here.
1353 switch (SSELevel) {
1354 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001355 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00001356 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001357 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00001358 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001359 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001360 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001361 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001362 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001363 Builder.defineMacro("__SSE2__");
1364 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001365 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001366 Builder.defineMacro("__SSE__");
1367 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001368 case MMX:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001369 Builder.defineMacro("__MMX__");
Chris Lattner96e43572009-03-02 22:40:39 +00001370 case NoMMXSSE:
1371 break;
1372 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001373
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001374 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001375 switch (SSELevel) {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001376 case SSE42:
1377 case SSE41:
1378 case SSSE3:
1379 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001380 case SSE2:
1381 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1382 break;
1383 case SSE1:
1384 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1385 break;
1386 default:
1387 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1388 }
1389 }
1390
Anders Carlssone437c682010-01-27 03:47:49 +00001391 // Each case falls through to the previous one here.
1392 switch (AMD3DNowLevel) {
1393 case AMD3DNowAthlon:
1394 Builder.defineMacro("__3dNOW_A__");
1395 case AMD3DNow:
1396 Builder.defineMacro("__3dNOW__");
1397 case NoAMD3DNow:
1398 break;
1399 }
Chris Lattnerecd49032009-03-02 22:27:17 +00001400}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001401
1402
Eli Friedman3fd920a2008-08-20 02:34:37 +00001403bool
Anders Carlsson58436352009-02-28 17:11:49 +00001404X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001405 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00001406 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001407 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00001408 case 'Y': // first letter of a pair:
1409 switch (*(Name+1)) {
1410 default: return false;
1411 case '0': // First SSE register.
1412 case 't': // Any SSE register, when SSE2 is enabled.
1413 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1414 case 'm': // any MMX register, when inter-unit moves enabled.
1415 break; // falls through to setAllowsRegister.
1416 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001417 case 'a': // eax.
1418 case 'b': // ebx.
1419 case 'c': // ecx.
1420 case 'd': // edx.
1421 case 'S': // esi.
1422 case 'D': // edi.
1423 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00001424 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001425 case 't': // top of floating point stack.
1426 case 'u': // second from top of floating point stack.
1427 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00001428 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00001429 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001430 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00001431 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1432 case 'l': // "Index" registers: any general register that can be used as an
1433 // index in a base+index memory access.
1434 Info.setAllowsRegister();
1435 return true;
1436 case 'C': // SSE floating point constant.
1437 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001438 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001439 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001440 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001441 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001442 return true;
1443 }
Dale Johannesen46742a42010-08-24 22:33:12 +00001444 return false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001445}
1446
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00001447
Eli Friedman3fd920a2008-08-20 02:34:37 +00001448std::string
1449X86TargetInfo::convertConstraint(const char Constraint) const {
1450 switch (Constraint) {
1451 case 'a': return std::string("{ax}");
1452 case 'b': return std::string("{bx}");
1453 case 'c': return std::string("{cx}");
1454 case 'd': return std::string("{dx}");
1455 case 'S': return std::string("{si}");
1456 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00001457 case 'p': // address
1458 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00001459 case 't': // top of floating point stack.
1460 return std::string("{st}");
1461 case 'u': // second from top of floating point stack.
1462 return std::string("{st(1)}"); // second from top of floating point stack.
1463 default:
1464 return std::string(1, Constraint);
1465 }
1466}
Eli Friedman3fd920a2008-08-20 02:34:37 +00001467} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00001468
1469namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001470// X86-32 generic target
1471class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001472public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00001473 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1474 DoubleAlign = LongLongAlign = 32;
1475 LongDoubleWidth = 96;
1476 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +00001477 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1478 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001479 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +00001480 SizeType = UnsignedInt;
1481 PtrDiffType = SignedInt;
1482 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001483 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001484
1485 // Use fpret for all types.
1486 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1487 (1 << TargetInfo::Double) |
1488 (1 << TargetInfo::LongDouble));
Eli Friedman3fd920a2008-08-20 02:34:37 +00001489 }
1490 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001491 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00001492 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001493
Chris Lattnerd545ad12009-09-23 06:06:36 +00001494 int getEHDataRegisterNumber(unsigned RegNo) const {
1495 if (RegNo == 0) return 0;
1496 if (RegNo == 1) return 2;
1497 return -1;
1498 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001499};
1500} // end anonymous namespace
1501
1502namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00001503class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1504public:
1505 OpenBSDI386TargetInfo(const std::string& triple) :
1506 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1507 SizeType = UnsignedLong;
1508 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00001509 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00001510 }
1511};
1512} // end anonymous namespace
1513
1514namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00001515class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001516public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00001517 DarwinI386TargetInfo(const std::string& triple) :
1518 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001519 LongDoubleWidth = 128;
1520 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00001521 SizeType = UnsignedLong;
1522 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00001523 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1524 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001525 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbarbd606522010-05-27 00:35:16 +00001526 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00001527 }
1528
Eli Friedman3fd920a2008-08-20 02:34:37 +00001529};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00001530} // end anonymous namespace
1531
1532namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001533// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001534class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001535public:
1536 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001537 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001538 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00001539 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00001540 DoubleAlign = LongLongAlign = 64;
1541 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 +00001542 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1543 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001544 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001545 virtual void getTargetDefines(const LangOptions &Opts,
1546 MacroBuilder &Builder) const {
1547 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1548 }
1549};
1550} // end anonymous namespace
1551
1552namespace {
1553
1554// x86-32 Windows Visual Studio target
1555class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1556public:
1557 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1558 : WindowsX86_32TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00001559 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001560 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1561 }
1562 virtual void getTargetDefines(const LangOptions &Opts,
1563 MacroBuilder &Builder) const {
1564 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1565 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1566 // The value of the following reflects processor type.
1567 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1568 // We lost the original triple, so we use the default.
1569 Builder.defineMacro("_M_IX86", "600");
1570 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001571};
1572} // end anonymous namespace
1573
1574namespace {
1575// x86-32 MinGW target
1576class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1577public:
1578 MinGWX86_32TargetInfo(const std::string& triple)
1579 : WindowsX86_32TargetInfo(triple) {
1580 }
1581 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001582 MacroBuilder &Builder) const {
1583 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001584 DefineStd(Builder, "WIN32", Opts);
1585 DefineStd(Builder, "WINNT", Opts);
1586 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001587 Builder.defineMacro("__MSVCRT__");
1588 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001589
1590 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1591 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1592 if (Opts.Microsoft)
1593 // Provide "as-is" __declspec.
1594 Builder.defineMacro("__declspec", "__declspec");
1595 else
1596 // Provide alias of __attribute__ like mingw32-gcc.
1597 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001598 }
1599};
1600} // end anonymous namespace
1601
1602namespace {
1603// x86-32 Cygwin target
1604class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1605public:
1606 CygwinX86_32TargetInfo(const std::string& triple)
1607 : X86_32TargetInfo(triple) {
1608 TLSSupported = false;
1609 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001610 DoubleAlign = LongLongAlign = 64;
1611 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1612 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001613 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001614 }
1615 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001616 MacroBuilder &Builder) const {
1617 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1618 Builder.defineMacro("__CYGWIN__");
1619 Builder.defineMacro("__CYGWIN32__");
1620 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00001621 if (Opts.CPlusPlus)
1622 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00001623 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001624};
1625} // end anonymous namespace
1626
1627namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00001628// x86-32 Haiku target
1629class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1630public:
1631 HaikuX86_32TargetInfo(const std::string& triple)
1632 : X86_32TargetInfo(triple) {
1633 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00001634 IntPtrType = SignedLong;
1635 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00001636 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00001637 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00001638 virtual void getTargetDefines(const LangOptions &Opts,
1639 MacroBuilder &Builder) const {
1640 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1641 Builder.defineMacro("__INTEL__");
1642 Builder.defineMacro("__HAIKU__");
1643 }
1644};
1645} // end anonymous namespace
1646
1647namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001648// x86-64 generic target
1649class X86_64TargetInfo : public X86TargetInfo {
1650public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001651 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001652 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00001653 LongDoubleWidth = 128;
1654 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00001655 LargeArrayMinWidth = 128;
1656 LargeArrayAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001657 IntMaxType = SignedLong;
1658 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001659 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001660 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001661
Eli Friedman873f65a2008-08-21 00:13:15 +00001662 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1663 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001664 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001665
1666 // Use fpret only for long double.
1667 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Chris Lattner10a5b382007-01-29 05:24:35 +00001668 }
Anders Carlssona7408e72007-10-13 00:45:48 +00001669 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001670 return "typedef struct __va_list_tag {"
1671 " unsigned gp_offset;"
1672 " unsigned fp_offset;"
1673 " void* overflow_arg_area;"
1674 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00001675 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00001676 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001677 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001678
Chris Lattnerd545ad12009-09-23 06:06:36 +00001679 int getEHDataRegisterNumber(unsigned RegNo) const {
1680 if (RegNo == 0) return 0;
1681 if (RegNo == 1) return 1;
1682 return -1;
1683 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001684};
1685} // end anonymous namespace
1686
1687namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001688// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001689class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001690public:
1691 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001692 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001693 TLSSupported = false;
1694 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00001695 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001696 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00001697 IntMaxType = SignedLongLong;
1698 UIntMaxType = UnsignedLongLong;
1699 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00001700 SizeType = UnsignedLongLong;
1701 PtrDiffType = SignedLongLong;
1702 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00001703 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001704 }
1705 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001706 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001707 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001708 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001709 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00001710 virtual const char *getVAListDeclaration() const {
1711 return "typedef char* __builtin_va_list;";
1712 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001713};
1714} // end anonymous namespace
1715
1716namespace {
1717// x86-64 Windows Visual Studio target
1718class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1719public:
1720 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1721 : WindowsX86_64TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00001722 LongDoubleWidth = LongDoubleAlign = 64;
1723 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001724 }
1725 virtual void getTargetDefines(const LangOptions &Opts,
1726 MacroBuilder &Builder) const {
1727 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1728 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001729 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001730 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001731 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001732};
1733} // end anonymous namespace
1734
1735namespace {
1736// x86-64 MinGW target
1737class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1738public:
1739 MinGWX86_64TargetInfo(const std::string& triple)
1740 : WindowsX86_64TargetInfo(triple) {
1741 }
1742 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001743 MacroBuilder &Builder) const {
1744 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001745 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001746 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00001747 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001748 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001749
1750 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1751 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1752 if (Opts.Microsoft)
1753 // Provide "as-is" __declspec.
1754 Builder.defineMacro("__declspec", "__declspec");
1755 else
1756 // Provide alias of __attribute__ like mingw32-gcc.
1757 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001758 }
1759};
1760} // end anonymous namespace
1761
1762namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00001763class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1764public:
Mike Stump11289f42009-09-09 15:08:12 +00001765 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00001766 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1767 Int64Type = SignedLongLong;
1768 }
1769};
1770} // end anonymous namespace
1771
1772namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00001773class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1774public:
Mike Stump11289f42009-09-09 15:08:12 +00001775 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00001776 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1777 IntMaxType = SignedLongLong;
1778 UIntMaxType = UnsignedLongLong;
1779 Int64Type = SignedLongLong;
1780 }
1781};
1782} // end anonymous namespace
1783
1784namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001785class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001786 // Possible FPU choices.
1787 enum FPUMode {
1788 NoFPU,
1789 VFP2FPU,
1790 VFP3FPU,
1791 NeonFPU
1792 };
1793
1794 static bool FPUModeIsVFP(FPUMode Mode) {
1795 return Mode >= VFP2FPU && Mode <= NeonFPU;
1796 }
1797
1798 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1799 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001800
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001801 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001802
1803 unsigned FPU : 3;
1804
Daniel Dunbar893d4752009-12-19 04:15:38 +00001805 unsigned IsThumb : 1;
1806
1807 // Initialized via features.
1808 unsigned SoftFloat : 1;
1809 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001810
Chris Lattner5cc15e02010-03-03 19:03:45 +00001811 static const Builtin::Info BuiltinInfo[];
1812
Chris Lattner17df24e2008-04-21 18:56:49 +00001813public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001814 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001815 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001816 {
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001817 SizeType = UnsignedInt;
1818 PtrDiffType = SignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001819
Chris Lattner1a8f3942010-04-23 16:29:58 +00001820 // {} in inline assembly are neon specifiers, not assembly variant
1821 // specifiers.
1822 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001823
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001824 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00001825 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00001826 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00001827 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1828 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00001829 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1830 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001831 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001832 } else {
1833 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1834 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001835 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001836 }
John McCall86353412010-08-21 22:46:04 +00001837
1838 // ARM targets default to using the ARM C++ ABI.
1839 CXXABI = CXXABI_ARM;
Eli Friedmanb5366062008-05-20 14:21:01 +00001840 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001841 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001842 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001843 ABI = Name;
1844
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001845 // The defaults (above) are for AAPCS, check if we need to change them.
1846 //
1847 // FIXME: We need support for -meabi... we could just mangle it into the
1848 // name.
1849 if (Name == "apcs-gnu") {
Daniel Dunbar377dc2f2010-01-27 20:23:08 +00001850 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001851 SizeType = UnsignedLong;
1852
Daniel Dunbarf8125062010-04-22 16:14:54 +00001853 // Do not respect the alignment of bit-field types when laying out
1854 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1855 UseBitFieldTypeAlignment = false;
1856
Daniel Dunbar03184792009-09-22 21:44:58 +00001857 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00001858 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1859 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00001860 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1861 "i64:32:32-f32:32:32-f64:32:32-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001862 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001863 } else {
1864 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 +00001865 "i64:32:64-f32:32:32-f64:32:64-"
1866 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001867 }
1868
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001869 // FIXME: Override "preferred align" for double and long long.
1870 } else if (Name == "aapcs") {
1871 // FIXME: Enumerated types are variable width in straight AAPCS.
1872 } else if (Name == "aapcs-linux") {
1873 ;
1874 } else
1875 return false;
1876
1877 return true;
1878 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001879
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001880 void getDefaultFeatures(const std::string &CPU,
1881 llvm::StringMap<bool> &Features) const {
1882 // FIXME: This should not be here.
1883 Features["vfp2"] = false;
1884 Features["vfp3"] = false;
1885 Features["neon"] = false;
1886
1887 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1888 Features["vfp2"] = true;
1889 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1890 Features["neon"] = true;
1891 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001892
Daniel Dunbar893d4752009-12-19 04:15:38 +00001893 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1894 const std::string &Name,
1895 bool Enabled) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001896 if (Name == "soft-float" || Name == "soft-float-abi") {
1897 Features[Name] = Enabled;
1898 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1899 // These effectively are a single option, reset them when any is enabled.
1900 if (Enabled)
1901 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1902 Features[Name] = Enabled;
1903 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00001904 return false;
1905
Daniel Dunbar893d4752009-12-19 04:15:38 +00001906 return true;
1907 }
1908
1909 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001910 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001911 SoftFloat = SoftFloatABI = false;
1912 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1913 if (Features[i] == "+soft-float")
1914 SoftFloat = true;
1915 else if (Features[i] == "+soft-float-abi")
1916 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001917 else if (Features[i] == "+vfp2")
1918 FPU = VFP2FPU;
1919 else if (Features[i] == "+vfp3")
1920 FPU = VFP3FPU;
1921 else if (Features[i] == "+neon")
1922 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001923 }
1924
1925 // Remove front-end specific options which the backend handles differently.
1926 std::vector<std::string>::iterator it;
1927 it = std::find(Features.begin(), Features.end(), "+soft-float");
1928 if (it != Features.end())
1929 Features.erase(it);
1930 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1931 if (it != Features.end())
1932 Features.erase(it);
1933 }
1934
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001935 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1936 return llvm::StringSwitch<const char*>(Name)
1937 .Cases("arm8", "arm810", "4")
1938 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1939 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1940 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1941 .Case("ep9312", "4T")
1942 .Cases("arm10tdmi", "arm1020t", "5T")
1943 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1944 .Case("arm926ej-s", "5TEJ")
1945 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1946 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001947 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001948 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001949 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001950 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1951 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00001952 .Case("cortex-m3", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00001953 .Case("cortex-m0", "6M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001954 .Default(0);
1955 }
1956 virtual bool setCPU(const std::string &Name) {
1957 if (!getCPUDefineSuffix(Name))
1958 return false;
1959
1960 CPU = Name;
1961 return true;
1962 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001963 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001964 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001965 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001966 Builder.defineMacro("__arm");
1967 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001968
Chris Lattnerecd49032009-03-02 22:27:17 +00001969 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001970 Builder.defineMacro("__ARMEL__");
1971 Builder.defineMacro("__LITTLE_ENDIAN__");
1972 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001973
1974 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001975 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001976
Mike Stump9d54bd72009-04-08 02:07:04 +00001977 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001978
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001979 // FIXME: It's more complicated than this and we don't really support
1980 // interworking.
1981 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001982 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001983
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001984 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001985 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001986
Daniel Dunbar893d4752009-12-19 04:15:38 +00001987 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001988 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001989
1990 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001991 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001992
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001993 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001994 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001995 Builder.defineMacro("__THUMBEL__");
1996 Builder.defineMacro("__thumb__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001997 if (IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001998 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001999 }
2000
2001 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002002 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002003
2004 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002005 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002006
2007 // This only gets set when Neon instructions are actually available, unlike
2008 // the VFP define, hence the soft float and arch check. This is subtly
2009 // different from gcc, we follow the intent which was that it should be set
2010 // when Neon instructions are actually available.
2011 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002012 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00002013 }
2014 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2015 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00002016 Records = BuiltinInfo;
2017 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00002018 }
2019 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002020 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00002021 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002022 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002023 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002024 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002025 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002026 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002027 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002028 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00002029 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002030 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00002031 case 'l': // r0-r7
2032 case 'h': // r8-r15
2033 case 'w': // VFP Floating point register single precision
2034 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00002035 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00002036 return true;
2037 }
Chris Lattner17df24e2008-04-21 18:56:49 +00002038 return false;
2039 }
2040 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002041 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00002042 return "";
2043 }
2044};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002045
2046const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002047 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002048 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002049 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2050
2051 // Float registers
2052 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2053 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2054 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002055 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002056
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002057 // Double registers
2058 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2059 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002060 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2061 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002062
2063 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002064 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2065 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002066};
2067
2068void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002069 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002070 Names = GCCRegNames;
2071 NumNames = llvm::array_lengthof(GCCRegNames);
2072}
2073
2074const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002075 { { "a1" }, "r0" },
2076 { { "a2" }, "r1" },
2077 { { "a3" }, "r2" },
2078 { { "a4" }, "r3" },
2079 { { "v1" }, "r4" },
2080 { { "v2" }, "r5" },
2081 { { "v3" }, "r6" },
2082 { { "v4" }, "r7" },
2083 { { "v5" }, "r8" },
2084 { { "v6", "rfp" }, "r9" },
2085 { { "sl" }, "r10" },
2086 { { "fp" }, "r11" },
2087 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002088 { { "r13" }, "sp" },
2089 { { "r14" }, "lr" },
2090 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002091 // The S, D and Q registers overlap, but aren't really aliases; we
2092 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002093};
2094
2095void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2096 unsigned &NumAliases) const {
2097 Aliases = GCCRegAliases;
2098 NumAliases = llvm::array_lengthof(GCCRegAliases);
2099}
Chris Lattner5cc15e02010-03-03 19:03:45 +00002100
2101const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00002102#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
2103#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2104 ALL_LANGUAGES, false },
Chris Lattner5cc15e02010-03-03 19:03:45 +00002105#include "clang/Basic/BuiltinsARM.def"
2106};
Chris Lattner17df24e2008-04-21 18:56:49 +00002107} // end anonymous namespace.
2108
Eli Friedmanf05b7722008-08-20 07:44:10 +00002109
2110namespace {
Mike Stump11289f42009-09-09 15:08:12 +00002111class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002112 public DarwinTargetInfo<ARMTargetInfo> {
2113protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00002114 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002115 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00002116 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00002117 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002118
Torok Edwinb2b37c62009-06-30 17:10:35 +00002119public:
Mike Stump11289f42009-09-09 15:08:12 +00002120 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002121 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2122 HasAlignMac68kSupport = true;
2123 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002124};
2125} // end anonymous namespace.
2126
Chris Lattner5ba61f02006-10-14 07:39:34 +00002127namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002128class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00002129 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2130 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002131 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00002132public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002133 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2134 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00002135 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 +00002136 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002137 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002138 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2139 const std::string &Name,
2140 bool Enabled) const {
2141 if (Name == "soft-float")
2142 Features[Name] = Enabled;
2143 else
2144 return false;
2145
2146 return true;
2147 }
2148 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2149 SoftFloat = false;
2150 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2151 if (Features[i] == "+soft-float")
2152 SoftFloat = true;
2153 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002154 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002155 MacroBuilder &Builder) const {
2156 DefineStd(Builder, "sparc", Opts);
2157 Builder.defineMacro("__sparcv8");
2158 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002159
2160 if (SoftFloat)
2161 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00002162 }
2163 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2164 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002165 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00002166 }
2167 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002168 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00002169 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002170 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002171 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002172 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002173 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002174 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00002175 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002176 // FIXME: Implement!
2177 return false;
Gabor Greif49991682008-02-21 16:29:08 +00002178 }
2179 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002180 // FIXME: Implement!
2181 return "";
Gabor Greif49991682008-02-21 16:29:08 +00002182 }
2183};
2184
Chris Lattner9b415d62009-01-27 01:58:38 +00002185const char * const SparcV8TargetInfo::GCCRegNames[] = {
2186 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2187 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2188 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2189 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2190};
2191
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002192void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002193 unsigned &NumNames) const {
2194 Names = GCCRegNames;
2195 NumNames = llvm::array_lengthof(GCCRegNames);
2196}
2197
2198const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002199 { { "g0" }, "r0" },
2200 { { "g1" }, "r1" },
2201 { { "g2" }, "r2" },
2202 { { "g3" }, "r3" },
2203 { { "g4" }, "r4" },
2204 { { "g5" }, "r5" },
2205 { { "g6" }, "r6" },
2206 { { "g7" }, "r7" },
2207 { { "o0" }, "r8" },
2208 { { "o1" }, "r9" },
2209 { { "o2" }, "r10" },
2210 { { "o3" }, "r11" },
2211 { { "o4" }, "r12" },
2212 { { "o5" }, "r13" },
2213 { { "o6", "sp" }, "r14" },
2214 { { "o7" }, "r15" },
2215 { { "l0" }, "r16" },
2216 { { "l1" }, "r17" },
2217 { { "l2" }, "r18" },
2218 { { "l3" }, "r19" },
2219 { { "l4" }, "r20" },
2220 { { "l5" }, "r21" },
2221 { { "l6" }, "r22" },
2222 { { "l7" }, "r23" },
2223 { { "i0" }, "r24" },
2224 { { "i1" }, "r25" },
2225 { { "i2" }, "r26" },
2226 { { "i3" }, "r27" },
2227 { { "i4" }, "r28" },
2228 { { "i5" }, "r29" },
2229 { { "i6", "fp" }, "r30" },
2230 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00002231};
2232
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002233void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002234 unsigned &NumAliases) const {
2235 Aliases = GCCRegAliases;
2236 NumAliases = llvm::array_lengthof(GCCRegAliases);
2237}
Gabor Greif49991682008-02-21 16:29:08 +00002238} // end anonymous namespace.
2239
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002240namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002241class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2242public:
2243 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2244 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2245 SizeType = UnsignedInt;
2246 PtrDiffType = SignedInt;
2247 }
2248};
Torok Edwinb2b37c62009-06-30 17:10:35 +00002249class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002250public:
2251 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002252 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00002253 SizeType = UnsignedInt;
2254 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002255 }
2256};
2257} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00002258
Chris Lattnerb781dc792008-05-08 05:58:21 +00002259namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002260 class MSP430TargetInfo : public TargetInfo {
2261 static const char * const GCCRegNames[];
2262 public:
2263 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2264 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00002265 IntWidth = 16; IntAlign = 16;
2266 LongWidth = 32; LongLongWidth = 64;
2267 LongAlign = LongLongAlign = 16;
2268 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002269 SizeType = UnsignedInt;
2270 IntMaxType = SignedLong;
2271 UIntMaxType = UnsignedLong;
2272 IntPtrType = SignedShort;
2273 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00002274 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00002275 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002276 }
2277 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002278 MacroBuilder &Builder) const {
2279 Builder.defineMacro("MSP430");
2280 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002281 // FIXME: defines for different 'flavours' of MCU
2282 }
2283 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2284 unsigned &NumRecords) const {
2285 // FIXME: Implement.
2286 Records = 0;
2287 NumRecords = 0;
2288 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002289 virtual void getGCCRegNames(const char * const *&Names,
2290 unsigned &NumNames) const;
2291 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2292 unsigned &NumAliases) const {
2293 // No aliases.
2294 Aliases = 0;
2295 NumAliases = 0;
2296 }
2297 virtual bool validateAsmConstraint(const char *&Name,
2298 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00002299 // No target constraints for now.
2300 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002301 }
2302 virtual const char *getClobbers() const {
2303 // FIXME: Is this really right?
2304 return "";
2305 }
2306 virtual const char *getVAListDeclaration() const {
2307 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00002308 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002309 }
2310 };
2311
2312 const char * const MSP430TargetInfo::GCCRegNames[] = {
2313 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2314 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2315 };
2316
2317 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2318 unsigned &NumNames) const {
2319 Names = GCCRegNames;
2320 NumNames = llvm::array_lengthof(GCCRegNames);
2321 }
2322}
2323
2324
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002325namespace {
2326 class SystemZTargetInfo : public TargetInfo {
2327 static const char * const GCCRegNames[];
2328 public:
2329 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2330 TLSSupported = false;
2331 IntWidth = IntAlign = 32;
2332 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2333 PointerWidth = PointerAlign = 64;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002334 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2335 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002336 }
2337 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002338 MacroBuilder &Builder) const {
2339 Builder.defineMacro("__s390__");
2340 Builder.defineMacro("__s390x__");
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002341 }
2342 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2343 unsigned &NumRecords) const {
2344 // FIXME: Implement.
2345 Records = 0;
2346 NumRecords = 0;
2347 }
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002348
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002349 virtual void getGCCRegNames(const char * const *&Names,
2350 unsigned &NumNames) const;
2351 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2352 unsigned &NumAliases) const {
2353 // No aliases.
2354 Aliases = 0;
2355 NumAliases = 0;
2356 }
2357 virtual bool validateAsmConstraint(const char *&Name,
2358 TargetInfo::ConstraintInfo &info) const {
2359 // FIXME: implement
2360 return true;
2361 }
2362 virtual const char *getClobbers() const {
2363 // FIXME: Is this really right?
2364 return "";
2365 }
2366 virtual const char *getVAListDeclaration() const {
2367 // FIXME: implement
2368 return "typedef char* __builtin_va_list;";
2369 }
2370 };
2371
2372 const char * const SystemZTargetInfo::GCCRegNames[] = {
2373 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2374 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2375 };
2376
2377 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2378 unsigned &NumNames) const {
2379 Names = GCCRegNames;
2380 NumNames = llvm::array_lengthof(GCCRegNames);
2381 }
2382}
2383
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002384namespace {
2385 class BlackfinTargetInfo : public TargetInfo {
2386 static const char * const GCCRegNames[];
2387 public:
2388 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2389 TLSSupported = false;
2390 DoubleAlign = 32;
2391 LongLongAlign = 32;
2392 LongDoubleAlign = 32;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002393 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002394 }
2395
2396 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002397 MacroBuilder &Builder) const {
2398 DefineStd(Builder, "bfin", Opts);
2399 DefineStd(Builder, "BFIN", Opts);
2400 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002401 // FIXME: This one is really dependent on -mcpu
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002402 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002403 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2404 }
2405
2406 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2407 unsigned &NumRecords) const {
2408 // FIXME: Implement.
2409 Records = 0;
2410 NumRecords = 0;
2411 }
2412
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002413 virtual void getGCCRegNames(const char * const *&Names,
2414 unsigned &NumNames) const;
2415
2416 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2417 unsigned &NumAliases) const {
2418 // No aliases.
2419 Aliases = 0;
2420 NumAliases = 0;
2421 }
2422
2423 virtual bool validateAsmConstraint(const char *&Name,
2424 TargetInfo::ConstraintInfo &Info) const {
2425 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2426 Info.setAllowsRegister();
2427 return true;
2428 }
2429 return false;
2430 }
2431
2432 virtual const char *getClobbers() const {
2433 return "";
2434 }
2435
2436 virtual const char *getVAListDeclaration() const {
2437 return "typedef char* __builtin_va_list;";
2438 }
2439 };
2440
2441 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2442 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2443 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2444 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2445 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2446 "a0", "a1", "cc",
2447 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2448 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2449 };
2450
2451 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2452 unsigned &NumNames) const {
2453 Names = GCCRegNames;
2454 NumNames = llvm::array_lengthof(GCCRegNames);
2455 }
2456}
2457
Eli Friedmana9c3d712009-08-19 20:47:07 +00002458namespace {
2459
Mike Stump11289f42009-09-09 15:08:12 +00002460 // LLVM and Clang cannot be used directly to output native binaries for
2461 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00002462 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00002463 //
2464 // TCE uses the llvm bitcode as input and uses it for generating customized
2465 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00002466 // publicly available in http://tce.cs.tut.fi
2467
2468 class TCETargetInfo : public TargetInfo{
2469 public:
2470 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2471 TLSSupported = false;
2472 IntWidth = 32;
2473 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00002474 PointerWidth = 32;
2475 IntAlign = 32;
2476 LongAlign = LongLongAlign = 32;
2477 PointerAlign = 32;
2478 SizeType = UnsignedInt;
2479 IntMaxType = SignedLong;
2480 UIntMaxType = UnsignedLong;
2481 IntPtrType = SignedInt;
2482 PtrDiffType = SignedInt;
2483 FloatWidth = 32;
2484 FloatAlign = 32;
2485 DoubleWidth = 32;
2486 DoubleAlign = 32;
2487 LongDoubleWidth = 32;
2488 LongDoubleAlign = 32;
2489 FloatFormat = &llvm::APFloat::IEEEsingle;
2490 DoubleFormat = &llvm::APFloat::IEEEsingle;
2491 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00002492 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2493 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00002494 "f32:32:32-f64:32:32-v64:32:32-"
2495 "v128:32:32-a0:0:32-n32";
Eli Friedmana9c3d712009-08-19 20:47:07 +00002496 }
2497
2498 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002499 MacroBuilder &Builder) const {
2500 DefineStd(Builder, "tce", Opts);
2501 Builder.defineMacro("__TCE__");
2502 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00002503 }
2504 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2505 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00002506 virtual const char *getClobbers() const {
2507 return "";
2508 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002509 virtual const char *getVAListDeclaration() const {
2510 return "typedef void* __builtin_va_list;";
2511 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002512 virtual void getGCCRegNames(const char * const *&Names,
2513 unsigned &NumNames) const {}
2514 virtual bool validateAsmConstraint(const char *&Name,
2515 TargetInfo::ConstraintInfo &info) const {
2516 return true;
2517 }
2518 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2519 unsigned &NumAliases) const {}
2520 };
2521}
2522
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002523namespace {
2524class MipsTargetInfo : public TargetInfo {
Eric Christopher0b26a612010-03-02 02:41:08 +00002525 std::string ABI, CPU;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002526 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2527 static const char * const GCCRegNames[];
2528public:
Eric Christopher0b26a612010-03-02 02:41:08 +00002529 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002530 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2531 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2532 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002533 virtual const char *getABI() const { return ABI.c_str(); }
2534 virtual bool setABI(const std::string &Name) {
2535
2536 if ((Name == "o32") || (Name == "eabi")) {
2537 ABI = Name;
2538 return true;
2539 } else
2540 return false;
2541 }
2542 virtual bool setCPU(const std::string &Name) {
2543 CPU = Name;
2544 return true;
2545 }
2546 void getDefaultFeatures(const std::string &CPU,
2547 llvm::StringMap<bool> &Features) const {
2548 Features[ABI] = true;
2549 Features[CPU] = true;
2550 }
2551 virtual void getArchDefines(const LangOptions &Opts,
2552 MacroBuilder &Builder) const {
2553 if (ABI == "o32")
2554 Builder.defineMacro("__mips_o32");
2555 else if (ABI == "eabi")
2556 Builder.defineMacro("__mips_eabi");
2557 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002558 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002559 MacroBuilder &Builder) const {
2560 DefineStd(Builder, "mips", Opts);
2561 Builder.defineMacro("_mips");
2562 DefineStd(Builder, "MIPSEB", Opts);
2563 Builder.defineMacro("_MIPSEB");
2564 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002565 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002566 }
2567 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2568 unsigned &NumRecords) const {
2569 // FIXME: Implement!
2570 }
2571 virtual const char *getVAListDeclaration() const {
2572 return "typedef void* __builtin_va_list;";
2573 }
2574 virtual void getGCCRegNames(const char * const *&Names,
2575 unsigned &NumNames) const;
2576 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2577 unsigned &NumAliases) const;
2578 virtual bool validateAsmConstraint(const char *&Name,
2579 TargetInfo::ConstraintInfo &Info) const {
2580 switch (*Name) {
2581 default:
2582 case 'r': // CPU registers.
2583 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2584 case 'y': // Equivalent to "r", backwards compatibility only.
2585 case 'f': // floating-point registers.
2586 Info.setAllowsRegister();
2587 return true;
2588 }
2589 return false;
2590 }
2591
2592 virtual const char *getClobbers() const {
2593 // FIXME: Implement!
2594 return "";
2595 }
2596};
2597
2598const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002599 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002600 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2601 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2602 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2603 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2604 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2605 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2606 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2607 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2608 "$fcc5","$fcc6","$fcc7"
2609};
2610
2611void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2612 unsigned &NumNames) const {
2613 Names = GCCRegNames;
2614 NumNames = llvm::array_lengthof(GCCRegNames);
2615}
2616
2617const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2618 { { "at" }, "$1" },
2619 { { "v0" }, "$2" },
2620 { { "v1" }, "$3" },
2621 { { "a0" }, "$4" },
2622 { { "a1" }, "$5" },
2623 { { "a2" }, "$6" },
2624 { { "a3" }, "$7" },
2625 { { "t0" }, "$8" },
2626 { { "t1" }, "$9" },
2627 { { "t2" }, "$10" },
2628 { { "t3" }, "$11" },
2629 { { "t4" }, "$12" },
2630 { { "t5" }, "$13" },
2631 { { "t6" }, "$14" },
2632 { { "t7" }, "$15" },
2633 { { "s0" }, "$16" },
2634 { { "s1" }, "$17" },
2635 { { "s2" }, "$18" },
2636 { { "s3" }, "$19" },
2637 { { "s4" }, "$20" },
2638 { { "s5" }, "$21" },
2639 { { "s6" }, "$22" },
2640 { { "s7" }, "$23" },
2641 { { "t8" }, "$24" },
2642 { { "t9" }, "$25" },
2643 { { "k0" }, "$26" },
2644 { { "k1" }, "$27" },
2645 { { "gp" }, "$28" },
2646 { { "sp" }, "$29" },
2647 { { "fp" }, "$30" },
2648 { { "ra" }, "$31" }
2649};
2650
2651void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2652 unsigned &NumAliases) const {
2653 Aliases = GCCRegAliases;
2654 NumAliases = llvm::array_lengthof(GCCRegAliases);
2655}
2656} // end anonymous namespace.
2657
2658namespace {
2659class MipselTargetInfo : public MipsTargetInfo {
2660public:
2661 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2662 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2663 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2664 }
2665
2666 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002667 MacroBuilder &Builder) const;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002668};
2669
2670void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002671 MacroBuilder &Builder) const {
2672 DefineStd(Builder, "mips", Opts);
2673 Builder.defineMacro("_mips");
2674 DefineStd(Builder, "MIPSEL", Opts);
2675 Builder.defineMacro("_MIPSEL");
2676 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002677 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002678}
2679} // end anonymous namespace.
2680
Chris Lattner5ba61f02006-10-14 07:39:34 +00002681//===----------------------------------------------------------------------===//
2682// Driver code
2683//===----------------------------------------------------------------------===//
2684
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002685static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00002686 llvm::Triple Triple(T);
2687 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00002688
Daniel Dunbar52322032009-08-18 05:47:58 +00002689 switch (Triple.getArch()) {
2690 default:
2691 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00002692
Daniel Dunbar52322032009-08-18 05:47:58 +00002693 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00002694 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002695 if (Triple.isOSDarwin())
2696 return new DarwinARMTargetInfo(T);
2697
Daniel Dunbar52322032009-08-18 05:47:58 +00002698 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00002699 case llvm::Triple::Linux:
2700 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002701 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002702 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002703 default:
2704 return new ARMTargetInfo(T);
2705 }
Eli Friedmanb5366062008-05-20 14:21:01 +00002706
Daniel Dunbar52322032009-08-18 05:47:58 +00002707 case llvm::Triple::bfin:
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002708 return new BlackfinTargetInfo(T);
2709
Daniel Dunbar52322032009-08-18 05:47:58 +00002710 case llvm::Triple::msp430:
2711 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00002712
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002713 case llvm::Triple::mips:
2714 if (os == llvm::Triple::Psp)
2715 return new PSPTargetInfo<MipsTargetInfo>(T);
2716 if (os == llvm::Triple::Linux)
2717 return new LinuxTargetInfo<MipsTargetInfo>(T);
2718 return new MipsTargetInfo(T);
2719
2720 case llvm::Triple::mipsel:
2721 if (os == llvm::Triple::Psp)
2722 return new PSPTargetInfo<MipselTargetInfo>(T);
2723 if (os == llvm::Triple::Linux)
2724 return new LinuxTargetInfo<MipselTargetInfo>(T);
2725 return new MipselTargetInfo(T);
2726
Daniel Dunbar52322032009-08-18 05:47:58 +00002727 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002728 if (Triple.isOSDarwin())
Roman Divacky965b0b72011-01-06 08:27:10 +00002729 return new DarwinPPC32TargetInfo(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002730 else if (os == llvm::Triple::FreeBSD)
2731 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002732 return new PPC32TargetInfo(T);
2733
2734 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002735 if (Triple.isOSDarwin())
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00002736 return new DarwinPPC64TargetInfo(T);
John Thompsone467e192009-11-19 17:18:50 +00002737 else if (os == llvm::Triple::Lv2)
2738 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002739 else if (os == llvm::Triple::FreeBSD)
2740 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002741 return new PPC64TargetInfo(T);
2742
Justin Holewinski514cce82011-04-20 19:34:15 +00002743 case llvm::Triple::ptx32:
2744 return new PTX32TargetInfo(T);
2745 case llvm::Triple::ptx64:
2746 return new PTX64TargetInfo(T);
2747
Chris Lattner5178f562010-03-06 21:21:27 +00002748 case llvm::Triple::mblaze:
2749 return new MBlazeTargetInfo(T);
2750
Daniel Dunbar52322032009-08-18 05:47:58 +00002751 case llvm::Triple::sparc:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002752 if (os == llvm::Triple::AuroraUX)
2753 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002754 if (os == llvm::Triple::Solaris)
2755 return new SolarisSparcV8TargetInfo(T);
2756 return new SparcV8TargetInfo(T);
2757
John Thompsone467e192009-11-19 17:18:50 +00002758 // FIXME: Need a real SPU target.
2759 case llvm::Triple::cellspu:
2760 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2761
Daniel Dunbar52322032009-08-18 05:47:58 +00002762 case llvm::Triple::systemz:
2763 return new SystemZTargetInfo(T);
2764
Eli Friedmana9c3d712009-08-19 20:47:07 +00002765 case llvm::Triple::tce:
2766 return new TCETargetInfo(T);
2767
Daniel Dunbar52322032009-08-18 05:47:58 +00002768 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002769 if (Triple.isOSDarwin())
2770 return new DarwinI386TargetInfo(T);
2771
Daniel Dunbar52322032009-08-18 05:47:58 +00002772 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002773 case llvm::Triple::AuroraUX:
2774 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002775 case llvm::Triple::Linux:
2776 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2777 case llvm::Triple::DragonFly:
2778 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2779 case llvm::Triple::NetBSD:
2780 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2781 case llvm::Triple::OpenBSD:
2782 return new OpenBSDI386TargetInfo(T);
2783 case llvm::Triple::FreeBSD:
2784 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00002785 case llvm::Triple::Minix:
2786 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002787 case llvm::Triple::Solaris:
2788 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2789 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002790 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002791 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002792 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002793 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002794 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00002795 case llvm::Triple::Haiku:
2796 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002797 default:
2798 return new X86_32TargetInfo(T);
2799 }
2800
2801 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002802 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
2803 return new DarwinX86_64TargetInfo(T);
2804
Daniel Dunbar52322032009-08-18 05:47:58 +00002805 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002806 case llvm::Triple::AuroraUX:
2807 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002808 case llvm::Triple::Linux:
2809 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00002810 case llvm::Triple::DragonFly:
2811 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002812 case llvm::Triple::NetBSD:
2813 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2814 case llvm::Triple::OpenBSD:
2815 return new OpenBSDX86_64TargetInfo(T);
2816 case llvm::Triple::FreeBSD:
2817 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2818 case llvm::Triple::Solaris:
2819 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00002820 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002821 return new MinGWX86_64TargetInfo(T);
2822 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002823 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002824 default:
2825 return new X86_64TargetInfo(T);
2826 }
2827 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002828}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002829
2830/// CreateTargetInfo - Return the target info object for the specified target
2831/// triple.
2832TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002833 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002834 llvm::Triple Triple(Opts.Triple);
2835
2836 // Construct the target
2837 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2838 if (!Target) {
2839 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2840 return 0;
2841 }
2842
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002843 // Set the target CPU if specified.
2844 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2845 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2846 return 0;
2847 }
2848
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002849 // Set the target ABI if specified.
2850 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2851 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2852 return 0;
2853 }
2854
Charles Davis95a546e2010-06-11 01:06:47 +00002855 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00002856 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00002857 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2858 return 0;
2859 }
2860
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002861 // Compute the default target features, we need the target to handle this
2862 // because features may have dependencies on one another.
2863 llvm::StringMap<bool> Features;
2864 Target->getDefaultFeatures(Opts.CPU, Features);
2865
2866 // Apply the user specified deltas.
2867 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2868 ie = Opts.Features.end(); it != ie; ++it) {
2869 const char *Name = it->c_str();
2870
2871 // Apply the feature via the target.
2872 if ((Name[0] != '-' && Name[0] != '+') ||
2873 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2874 Diags.Report(diag::err_target_invalid_feature) << Name;
2875 return 0;
2876 }
2877 }
2878
2879 // Add the features to the compile options.
2880 //
2881 // FIXME: If we are completely confident that we have the right set, we only
2882 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002883 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002884 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2885 ie = Features.end(); it != ie; ++it)
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002886 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2887 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002888
2889 return Target.take();
2890}