blob: 7399d5a359581debe91c2b86186abea8477d4e55 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
Dale Johannesen182addf2010-10-29 23:24:33 +000029#include "llvm/Type.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Chris Lattner5ba61f02006-10-14 07:39:34 +000031using namespace clang;
32
Chris Lattner5ba61f02006-10-14 07:39:34 +000033//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000034// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
36
Chris Lattner1e1c0b92009-03-20 16:06:38 +000037/// DefineStd - Define a macro name and standard variants. For example if
38/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
39/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000040static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041 const LangOptions &Opts) {
42 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000043
Chris Lattner1e1c0b92009-03-20 16:06:38 +000044 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
45 // in the user's namespace.
46 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000047 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000048
Chris Lattner1e1c0b92009-03-20 16:06:38 +000049 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000050 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000051
Chris Lattner1e1c0b92009-03-20 16:06:38 +000052 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054}
55
Chris Lattner09d98f52008-10-05 21:50:58 +000056//===----------------------------------------------------------------------===//
57// Defines specific to certain operating systems.
58//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000059
Torok Edwinb2b37c62009-06-30 17:10:35 +000060namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000061template<typename TgtInfo>
62class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000063protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000064 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000065 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000066public:
Douglas Gregorc05d2a12009-07-01 15:12:53 +000067 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwinb2b37c62009-06-30 17:10:35 +000068 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000069 MacroBuilder &Builder) const {
70 TgtInfo::getTargetDefines(Opts, Builder);
71 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000072 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000073
74};
Chris Lattner859c37a2009-08-12 06:24:27 +000075} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000076
Chris Lattner30ba6742009-08-10 19:03:04 +000077
Daniel Dunbard86666f2010-01-26 01:44:04 +000078static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000079 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000080 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000081 VersionTuple &PlatformMinVersion) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 Builder.defineMacro("__APPLE_CC__", "5621");
83 Builder.defineMacro("__APPLE__");
84 Builder.defineMacro("__MACH__");
85 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000086
John McCall5d36a8c2011-06-16 00:03:19 +000087 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +000088 // __weak is always defined, for use in blocks and with objc pointers.
89 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000090
John McCall31168b02011-06-15 23:02:42 +000091 // Darwin defines __strong even in C mode (just to nothing).
92 if (Opts.getGCMode() != LangOptions::NonGC)
93 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
94 else
95 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +000096
John McCall31168b02011-06-15 23:02:42 +000097 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
98 // allow this in C, since one might have block pointers in structs that
99 // are used in pure C code and in Objective-C ARC.
100 Builder.defineMacro("__unsafe_unretained", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000101
John McCall31168b02011-06-15 23:02:42 +0000102 // The Objective-C bridged cast keywords are defined to nothing in non-ARC
103 // mode; then they become normal, C-style casts.
104 Builder.defineMacro("__bridge", "");
105 Builder.defineMacro("__bridge_transfer", "");
106 Builder.defineMacro("__bridge_retained", "");
John McCall0c329252011-06-17 21:23:37 +0000107 Builder.defineMacro("__bridge_retain", "");
John McCall31168b02011-06-15 23:02:42 +0000108 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000109
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000110 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000111 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000112 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000113 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000114
115 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000117
Daniel Dunbarecf13562011-04-19 21:40:34 +0000118 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000119 unsigned Maj, Min, Rev;
Mike Stump11289f42009-09-09 15:08:12 +0000120
Daniel Dunbard86666f2010-01-26 01:44:04 +0000121 // If no version was given, default to to 10.4.0, for simplifying tests.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000122 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
123 PlatformName = "macosx";
Daniel Dunbard86666f2010-01-26 01:44:04 +0000124 Min = Rev = 0;
125 Maj = 8;
Daniel Dunbarecf13562011-04-19 21:40:34 +0000126 } else {
127 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
128 // "-osxNNN", and "-iosNNN").
129
130 if (Triple.getOS() == llvm::Triple::Darwin) {
131 // For historical reasons that make little sense, the version passed here
132 // is the "darwin" version, which drops the 10 and offsets by 4.
133 Triple.getOSVersion(Maj, Min, Rev);
134
135 if (Triple.getEnvironmentName() == "iphoneos") {
136 PlatformName = "ios";
137 } else {
Daniel Dunbarecf13562011-04-19 21:40:34 +0000138 PlatformName = "macosx";
139 Rev = Min;
140 Min = Maj - 4;
141 Maj = 10;
142 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000143 } else {
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 Triple.getOSVersion(Maj, Min, Rev);
Daniel Dunbarfcd23892011-04-19 23:34:21 +0000145 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000146 }
147 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000148
Chad Rosierb90e4022011-07-19 20:00:06 +0000149 // If -ccc-host-triple arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000150 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000151 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
152 if (PlatformName == "win32") {
153 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
154 return;
155 }
156
Daniel Dunbard86666f2010-01-26 01:44:04 +0000157 // Set the appropriate OS version define.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000158 if (PlatformName == "ios") {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000159 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000160 char Str[6];
161 Str[0] = '0' + Maj;
162 Str[1] = '0' + (Min / 10);
163 Str[2] = '0' + (Min % 10);
164 Str[3] = '0' + (Rev / 10);
165 Str[4] = '0' + (Rev % 10);
166 Str[5] = '\0';
167 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
168 } else {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000169 // Note that the Driver allows versions which aren't representable in the
170 // define (because we only get a single digit for the minor and micro
171 // revision numbers). So, we limit them to the maximum representable
172 // version.
Daniel Dunbard86666f2010-01-26 01:44:04 +0000173 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000174 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000175 char Str[5];
176 Str[0] = '0' + (Maj / 10);
177 Str[1] = '0' + (Maj % 10);
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000178 Str[2] = '0' + std::min(Min, 9U);
179 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbard86666f2010-01-26 01:44:04 +0000180 Str[4] = '\0';
181 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000182 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000183
184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000185}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000186
Chris Lattner30ba6742009-08-10 19:03:04 +0000187namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000188template<typename Target>
189class DarwinTargetInfo : public OSTargetInfo<Target> {
190protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000191 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000192 MacroBuilder &Builder) const {
Eric Christopher0c912c52011-07-07 22:55:26 +0000193 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000194 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000195 }
Mike Stump11289f42009-09-09 15:08:12 +0000196
Torok Edwinb2b37c62009-06-30 17:10:35 +0000197public:
198 DarwinTargetInfo(const std::string& triple) :
199 OSTargetInfo<Target>(triple) {
Eric Christopherbf15d2b2011-07-02 00:20:22 +0000200 llvm::Triple T = llvm::Triple(triple);
201 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbar13adc7f2011-02-21 23:12:51 +0000202 this->MCountName = "\01mcount";
Torok Edwinb2b37c62009-06-30 17:10:35 +0000203 }
204
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000205 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000206 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000207 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000208 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000209 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000210 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000211 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000212 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000213
Anders Carlsson851318a2010-06-08 22:47:50 +0000214 virtual const char *getStaticInitSectionSpecifier() const {
215 // FIXME: We should return 0 when building kexts.
216 return "__TEXT,__StaticInit,regular,pure_instructions";
217 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000218
Torok Edwinb2b37c62009-06-30 17:10:35 +0000219};
220
Chris Lattner30ba6742009-08-10 19:03:04 +0000221
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222// DragonFlyBSD Target
223template<typename Target>
224class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
225protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000226 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000227 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000228 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000229 Builder.defineMacro("__DragonFly__");
230 Builder.defineMacro("__DragonFly_cc_version", "100001");
231 Builder.defineMacro("__ELF__");
232 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
233 Builder.defineMacro("__tune_i386__");
234 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000235 }
236public:
Mike Stump11289f42009-09-09 15:08:12 +0000237 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000238 : OSTargetInfo<Target>(triple) {}
239};
240
241// FreeBSD Target
242template<typename Target>
243class FreeBSDTargetInfo : public OSTargetInfo<Target> {
244protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000245 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000246 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000247 // FreeBSD defines; list based off of gcc output
248
Daniel Dunbar40165182009-08-24 09:10:05 +0000249 // FIXME: Move version number handling to llvm::Triple.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000250 StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000251
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000252 Builder.defineMacro("__FreeBSD__", Release);
253 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000254 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
255 DefineStd(Builder, "unix", Opts);
256 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000257 }
258public:
Mike Stump11289f42009-09-09 15:08:12 +0000259 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000260 : OSTargetInfo<Target>(triple) {
261 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000262
263 llvm::Triple Triple(triple);
264 switch (Triple.getArch()) {
265 default:
266 case llvm::Triple::x86:
267 case llvm::Triple::x86_64:
268 this->MCountName = ".mcount";
269 break;
270 case llvm::Triple::mips:
271 case llvm::Triple::mipsel:
272 case llvm::Triple::ppc:
273 case llvm::Triple::ppc64:
274 this->MCountName = "_mcount";
275 break;
276 case llvm::Triple::arm:
277 this->MCountName = "__mcount";
278 break;
279 }
280
Duncan Sands9cb27e92009-07-08 13:55:08 +0000281 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282};
283
Chris Lattner3e2ee142010-07-07 16:01:42 +0000284// Minix Target
285template<typename Target>
286class MinixTargetInfo : public OSTargetInfo<Target> {
287protected:
288 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
289 MacroBuilder &Builder) const {
290 // Minix defines
291
292 Builder.defineMacro("__minix", "3");
293 Builder.defineMacro("_EM_WSIZE", "4");
294 Builder.defineMacro("_EM_PSIZE", "4");
295 Builder.defineMacro("_EM_SSIZE", "2");
296 Builder.defineMacro("_EM_LSIZE", "4");
297 Builder.defineMacro("_EM_FSIZE", "4");
298 Builder.defineMacro("_EM_DSIZE", "8");
299 DefineStd(Builder, "unix", Opts);
300 }
301public:
302 MinixTargetInfo(const std::string &triple)
303 : OSTargetInfo<Target>(triple) {
304 this->UserLabelPrefix = "";
305 }
306};
307
Torok Edwinb2b37c62009-06-30 17:10:35 +0000308// Linux target
309template<typename Target>
310class LinuxTargetInfo : public OSTargetInfo<Target> {
311protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000312 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000313 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000314 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000315 DefineStd(Builder, "unix", Opts);
316 DefineStd(Builder, "linux", Opts);
317 Builder.defineMacro("__gnu_linux__");
318 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000319 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000320 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000321 if (Opts.CPlusPlus)
322 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000323 }
324public:
Mike Stump11289f42009-09-09 15:08:12 +0000325 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000326 : OSTargetInfo<Target>(triple) {
327 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000328 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000329 }
330};
331
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000332// NetBSD Target
333template<typename Target>
334class NetBSDTargetInfo : public OSTargetInfo<Target> {
335protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000336 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000337 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000338 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000339 Builder.defineMacro("__NetBSD__");
340 Builder.defineMacro("__unix__");
341 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000342 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000343 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000344 }
345public:
Mike Stump11289f42009-09-09 15:08:12 +0000346 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000347 : OSTargetInfo<Target>(triple) {
348 this->UserLabelPrefix = "";
349 }
350};
351
Torok Edwinb2b37c62009-06-30 17:10:35 +0000352// OpenBSD Target
353template<typename Target>
354class OpenBSDTargetInfo : public OSTargetInfo<Target> {
355protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000356 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000357 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000358 // OpenBSD defines; list based off of gcc output
359
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000360 Builder.defineMacro("__OpenBSD__");
361 DefineStd(Builder, "unix", Opts);
362 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000363 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000364 Builder.defineMacro("_POSIX_THREADS");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000365 }
366public:
Mike Stump11289f42009-09-09 15:08:12 +0000367 OpenBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368 : OSTargetInfo<Target>(triple) {}
369};
370
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000371// PSP Target
372template<typename Target>
373class PSPTargetInfo : public OSTargetInfo<Target> {
374protected:
375 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000376 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000377 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000378 Builder.defineMacro("PSP");
379 Builder.defineMacro("_PSP");
380 Builder.defineMacro("__psp__");
381 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000382 }
383public:
384 PSPTargetInfo(const std::string& triple)
385 : OSTargetInfo<Target>(triple) {
386 this->UserLabelPrefix = "";
387 }
388};
389
John Thompsone467e192009-11-19 17:18:50 +0000390// PS3 PPU Target
391template<typename Target>
392class PS3PPUTargetInfo : public OSTargetInfo<Target> {
393protected:
394 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000395 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000396 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000397 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000398 Builder.defineMacro("__PPU__");
399 Builder.defineMacro("__CELLOS_LV2__");
400 Builder.defineMacro("__ELF__");
401 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000402 Builder.defineMacro("_ARCH_PPC64");
403 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000404 }
405public:
406 PS3PPUTargetInfo(const std::string& triple)
407 : OSTargetInfo<Target>(triple) {
408 this->UserLabelPrefix = "";
John Thompson6f8dba72009-12-18 14:21:08 +0000409 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000410 this->IntMaxType = TargetInfo::SignedLongLong;
411 this->UIntMaxType = TargetInfo::UnsignedLongLong;
412 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000413 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000414 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
415 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000416 }
417};
418
419// FIXME: Need a real SPU target.
420// PS3 SPU Target
421template<typename Target>
422class PS3SPUTargetInfo : public OSTargetInfo<Target> {
423protected:
424 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000425 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000426 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000427 Builder.defineMacro("__SPU__");
428 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000429 }
430public:
431 PS3SPUTargetInfo(const std::string& triple)
432 : OSTargetInfo<Target>(triple) {
433 this->UserLabelPrefix = "";
434 }
435};
436
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000437// AuroraUX target
438template<typename Target>
439class AuroraUXTargetInfo : public OSTargetInfo<Target> {
440protected:
441 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000442 MacroBuilder &Builder) const {
443 DefineStd(Builder, "sun", Opts);
444 DefineStd(Builder, "unix", Opts);
445 Builder.defineMacro("__ELF__");
446 Builder.defineMacro("__svr4__");
447 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000448 }
449public:
450 AuroraUXTargetInfo(const std::string& triple)
451 : OSTargetInfo<Target>(triple) {
452 this->UserLabelPrefix = "";
453 this->WCharType = this->SignedLong;
454 // FIXME: WIntType should be SignedLong
455 }
456};
457
Torok Edwinb2b37c62009-06-30 17:10:35 +0000458// Solaris target
459template<typename Target>
460class SolarisTargetInfo : public OSTargetInfo<Target> {
461protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000462 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000463 MacroBuilder &Builder) const {
464 DefineStd(Builder, "sun", Opts);
465 DefineStd(Builder, "unix", Opts);
466 Builder.defineMacro("__ELF__");
467 Builder.defineMacro("__svr4__");
468 Builder.defineMacro("__SVR4");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000469 }
470public:
Mike Stump11289f42009-09-09 15:08:12 +0000471 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000472 : OSTargetInfo<Target>(triple) {
473 this->UserLabelPrefix = "";
474 this->WCharType = this->SignedLong;
475 // FIXME: WIntType should be SignedLong
476 }
477};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000478
479// Windows target
480template<typename Target>
481class WindowsTargetInfo : public OSTargetInfo<Target> {
482protected:
483 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
484 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000485 Builder.defineMacro("_WIN32");
486 }
487 void getVisualStudioDefines(const LangOptions &Opts,
488 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000489 if (Opts.CPlusPlus) {
490 if (Opts.RTTI)
491 Builder.defineMacro("_CPPRTTI");
492
493 if (Opts.Exceptions)
494 Builder.defineMacro("_CPPUNWIND");
495 }
496
497 if (!Opts.CharIsSigned)
498 Builder.defineMacro("_CHAR_UNSIGNED");
499
500 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
501 // but it works for now.
502 if (Opts.POSIXThreads)
503 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000504
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000505 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000506 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000507
508 if (Opts.Microsoft) {
509 Builder.defineMacro("_MSC_EXTENSIONS");
510
511 if (Opts.CPlusPlus0x) {
512 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
513 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
514 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
515 }
516 }
517
518 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000519 }
520
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000521public:
522 WindowsTargetInfo(const std::string &triple)
523 : OSTargetInfo<Target>(triple) {}
524};
525
Mike Stump11289f42009-09-09 15:08:12 +0000526} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000527
Chris Lattner09d98f52008-10-05 21:50:58 +0000528//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000529// Specific target implementations.
530//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000531
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000532namespace {
533// PPC abstract base class
534class PPCTargetInfo : public TargetInfo {
535 static const Builtin::Info BuiltinInfo[];
536 static const char * const GCCRegNames[];
537 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000538public:
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000539 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
540
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000541 virtual void getTargetBuiltins(const Builtin::Info *&Records,
542 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000543 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000544 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000545 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000546
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000547 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000548 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000549
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000550 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000551 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000552 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000553 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000554 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000555 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000556 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000557 default: return false;
558 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000559 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000560 case 'b': // Base register
561 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000562 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000563 break;
564 // FIXME: The following are added to allow parsing.
565 // I just took a guess at what the actions should be.
566 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000567 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000568 case 'v': // Altivec vector register
569 Info.setAllowsRegister();
570 break;
571 case 'w':
572 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000573 case 'd':// VSX vector register to hold vector double data
574 case 'f':// VSX vector register to hold vector float data
575 case 's':// VSX vector register to hold scalar float data
576 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000577 break;
578 default:
579 return false;
580 }
581 Info.setAllowsRegister();
582 Name++; // Skip over 'w'.
583 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000584 case 'h': // `MQ', `CTR', or `LINK' register
585 case 'q': // `MQ' register
586 case 'c': // `CTR' register
587 case 'l': // `LINK' register
588 case 'x': // `CR' register (condition register) number 0
589 case 'y': // `CR' register (condition register)
590 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000591 Info.setAllowsRegister();
592 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000593 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000594 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000595 // (use `L' instead for SImode constants)
596 case 'K': // Unsigned 16-bit constant
597 case 'L': // Signed 16-bit constant shifted left 16 bits
598 case 'M': // Constant larger than 31
599 case 'N': // Exact power of 2
600 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000601 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000602 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000603 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000604 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000605 break;
606 case 'm': // Memory operand. Note that on PowerPC targets, m can
607 // include addresses that update the base register. It
608 // is therefore only safe to use `m' in an asm statement
609 // if that asm statement accesses the operand exactly once.
610 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000611 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000612 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000613 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000614 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000615 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
616 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000617 // register to be updated.
618 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000619 if (Name[1] != 's')
620 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000621 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000622 // include any automodification of the base register. Unlike
623 // `m', this constraint can be used in asm statements that
624 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000625 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000626 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000627 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000628 break;
629 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000630 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000631 case 'Z': // Memory operand that is an indexed or indirect from a
632 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000633 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000634 Info.setAllowsMemory();
635 Info.setAllowsRegister();
636 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000637 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000638 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000639 // register (`p' is preferable for asm statements)
640 case 'S': // Constant suitable as a 64-bit mask operand
641 case 'T': // Constant suitable as a 32-bit mask operand
642 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000643 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000644 // instructions
645 case 'W': // Vector constant that does not require memory
646 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000647 break;
648 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000649 }
John Thompson07a61a42010-06-24 22:44:13 +0000650 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000651 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000652 virtual const char *getClobbers() const {
653 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000654 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000655};
Anders Carlssonf511f642007-11-27 04:11:28 +0000656
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000657const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000658#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000659#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000660 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000661#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000662};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000663
664
Chris Lattnerecd49032009-03-02 22:27:17 +0000665/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
666/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000667void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000668 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000669 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000670 Builder.defineMacro("__ppc__");
671 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000672 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000673 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000674 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000675 Builder.defineMacro("_ARCH_PPC64");
676 Builder.defineMacro("_LP64");
677 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000678 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000679 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000680 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000681 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000682 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000683
Chris Lattnerecd49032009-03-02 22:27:17 +0000684 // Target properties.
Joerg Sonnenberger870b3c52011-07-05 14:56:12 +0000685 if (getTriple().getOS() != llvm::Triple::NetBSD)
686 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000687 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000688
Chris Lattnerecd49032009-03-02 22:27:17 +0000689 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000690 Builder.defineMacro("__NATURAL_ALIGNMENT__");
691 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000692
Chris Lattnerecd49032009-03-02 22:27:17 +0000693 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000694 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000695
John Thompsone467e192009-11-19 17:18:50 +0000696 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000697 Builder.defineMacro("__VEC__", "10206");
698 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000699 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000700}
701
Chris Lattner17df24e2008-04-21 18:56:49 +0000702
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000703const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000704 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
705 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
706 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
707 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
708 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
709 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
710 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
711 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000712 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000713 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000714 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000715 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
716 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
717 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
718 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000719 "vrsave", "vscr",
720 "spe_acc", "spefscr",
721 "sfp"
722};
Chris Lattner10a5b382007-01-29 05:24:35 +0000723
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000724void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000725 unsigned &NumNames) const {
726 Names = GCCRegNames;
727 NumNames = llvm::array_lengthof(GCCRegNames);
728}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000729
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000730const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
731 // While some of these aliases do map to different registers
732 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000733 { { "0" }, "r0" },
734 { { "1"}, "r1" },
735 { { "2" }, "r2" },
736 { { "3" }, "r3" },
737 { { "4" }, "r4" },
738 { { "5" }, "r5" },
739 { { "6" }, "r6" },
740 { { "7" }, "r7" },
741 { { "8" }, "r8" },
742 { { "9" }, "r9" },
743 { { "10" }, "r10" },
744 { { "11" }, "r11" },
745 { { "12" }, "r12" },
746 { { "13" }, "r13" },
747 { { "14" }, "r14" },
748 { { "15" }, "r15" },
749 { { "16" }, "r16" },
750 { { "17" }, "r17" },
751 { { "18" }, "r18" },
752 { { "19" }, "r19" },
753 { { "20" }, "r20" },
754 { { "21" }, "r21" },
755 { { "22" }, "r22" },
756 { { "23" }, "r23" },
757 { { "24" }, "r24" },
758 { { "25" }, "r25" },
759 { { "26" }, "r26" },
760 { { "27" }, "r27" },
761 { { "28" }, "r28" },
762 { { "29" }, "r29" },
763 { { "30" }, "r30" },
764 { { "31" }, "r31" },
765 { { "fr0" }, "f0" },
766 { { "fr1" }, "f1" },
767 { { "fr2" }, "f2" },
768 { { "fr3" }, "f3" },
769 { { "fr4" }, "f4" },
770 { { "fr5" }, "f5" },
771 { { "fr6" }, "f6" },
772 { { "fr7" }, "f7" },
773 { { "fr8" }, "f8" },
774 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000775 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000776 { { "fr11" }, "f11" },
777 { { "fr12" }, "f12" },
778 { { "fr13" }, "f13" },
779 { { "fr14" }, "f14" },
780 { { "fr15" }, "f15" },
781 { { "fr16" }, "f16" },
782 { { "fr17" }, "f17" },
783 { { "fr18" }, "f18" },
784 { { "fr19" }, "f19" },
785 { { "fr20" }, "f20" },
786 { { "fr21" }, "f21" },
787 { { "fr22" }, "f22" },
788 { { "fr23" }, "f23" },
789 { { "fr24" }, "f24" },
790 { { "fr25" }, "f25" },
791 { { "fr26" }, "f26" },
792 { { "fr27" }, "f27" },
793 { { "fr28" }, "f28" },
794 { { "fr29" }, "f29" },
795 { { "fr30" }, "f30" },
796 { { "fr31" }, "f31" },
797 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000798};
799
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000800void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000801 unsigned &NumAliases) const {
802 Aliases = GCCRegAliases;
803 NumAliases = llvm::array_lengthof(GCCRegAliases);
804}
805} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000806
Chris Lattner5ba61f02006-10-14 07:39:34 +0000807namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000808class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000809public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000810 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000811 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +0000812 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000813
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +0000814 switch (getTriple().getOS()) {
815 case llvm::Triple::FreeBSD:
816 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +0000817 SizeType = UnsignedInt;
818 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +0000819 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +0000820 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +0000821 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000822 }
823
824 virtual const char *getVAListDeclaration() const {
825 // This is the ELF definition, and is overridden by the Darwin sub-target
826 return "typedef struct __va_list_tag {"
827 " unsigned char gpr;"
828 " unsigned char fpr;"
829 " unsigned short reserved;"
830 " void* overflow_arg_area;"
831 " void* reg_save_area;"
832 "} __builtin_va_list[1];";
Eli Friedman873f65a2008-08-21 00:13:15 +0000833 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000834};
835} // end anonymous namespace.
836
837namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000838class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000839public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000840 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000841 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000842 IntMaxType = SignedLong;
843 UIntMaxType = UnsignedLong;
844 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000845 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +0000846 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000847 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000848 virtual const char *getVAListDeclaration() const {
849 return "typedef char* __builtin_va_list;";
850 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000851};
852} // end anonymous namespace.
853
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000854
855namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +0000856class DarwinPPC32TargetInfo :
857 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000858public:
Roman Divacky965b0b72011-01-06 08:27:10 +0000859 DarwinPPC32TargetInfo(const std::string& triple)
860 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000861 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +0000862 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
863 }
864 virtual const char *getVAListDeclaration() const {
865 return "typedef char* __builtin_va_list;";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000866 }
867};
868
869class DarwinPPC64TargetInfo :
870 public DarwinTargetInfo<PPC64TargetInfo> {
871public:
872 DarwinPPC64TargetInfo(const std::string& triple)
873 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
874 HasAlignMac68kSupport = true;
875 }
876};
877} // end anonymous namespace.
878
Chris Lattner5ba61f02006-10-14 07:39:34 +0000879namespace {
Justin Holewinski514cce82011-04-20 19:34:15 +0000880 class PTXTargetInfo : public TargetInfo {
881 static const char * const GCCRegNames[];
882 static const Builtin::Info BuiltinInfo[];
883 public:
884 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
885 TLSSupported = false;
886 LongWidth = LongAlign = 64;
887 }
888 virtual void getTargetDefines(const LangOptions &Opts,
889 MacroBuilder &Builder) const {
890 Builder.defineMacro("__PTX__");
891 }
892 virtual void getTargetBuiltins(const Builtin::Info *&Records,
893 unsigned &NumRecords) const {
894 Records = BuiltinInfo;
895 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
896 }
897
898 virtual void getGCCRegNames(const char * const *&Names,
899 unsigned &NumNames) const;
900 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
901 unsigned &NumAliases) const {
902 // No aliases.
903 Aliases = 0;
904 NumAliases = 0;
905 }
906 virtual bool validateAsmConstraint(const char *&Name,
907 TargetInfo::ConstraintInfo &info) const {
908 // FIXME: implement
909 return true;
910 }
911 virtual const char *getClobbers() const {
912 // FIXME: Is this really right?
913 return "";
914 }
915 virtual const char *getVAListDeclaration() const {
916 // FIXME: implement
917 return "typedef char* __builtin_va_list;";
918 }
919 };
920
921 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000922#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski514cce82011-04-20 19:34:15 +0000923#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000924 ALL_LANGUAGES },
Justin Holewinski514cce82011-04-20 19:34:15 +0000925#include "clang/Basic/BuiltinsPTX.def"
926 };
927
928 const char * const PTXTargetInfo::GCCRegNames[] = {
929 "r0"
930 };
931
932 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
933 unsigned &NumNames) const {
934 Names = GCCRegNames;
935 NumNames = llvm::array_lengthof(GCCRegNames);
936 }
937
938
939 class PTX32TargetInfo : public PTXTargetInfo {
940 public:
941 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
942 PointerWidth = PointerAlign = 32;
943 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
944 DescriptionString
945 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
946 }
947 };
948
949 class PTX64TargetInfo : public PTXTargetInfo {
950 public:
951 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
952 PointerWidth = PointerAlign = 64;
953 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
954 DescriptionString
955 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
956 }
957 };
958}
959
960namespace {
Chris Lattner5178f562010-03-06 21:21:27 +0000961// MBlaze abstract base class
962class MBlazeTargetInfo : public TargetInfo {
963 static const char * const GCCRegNames[];
964 static const TargetInfo::GCCRegAlias GCCRegAliases[];
965
966public:
967 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +0000968 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +0000969 }
970
971 virtual void getTargetBuiltins(const Builtin::Info *&Records,
972 unsigned &NumRecords) const {
973 // FIXME: Implement.
974 Records = 0;
975 NumRecords = 0;
976 }
977
978 virtual void getTargetDefines(const LangOptions &Opts,
979 MacroBuilder &Builder) const;
980
981 virtual const char *getVAListDeclaration() const {
982 return "typedef char* __builtin_va_list;";
983 }
984 virtual const char *getTargetPrefix() const {
985 return "mblaze";
986 }
987 virtual void getGCCRegNames(const char * const *&Names,
988 unsigned &NumNames) const;
989 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
990 unsigned &NumAliases) const;
991 virtual bool validateAsmConstraint(const char *&Name,
992 TargetInfo::ConstraintInfo &Info) const {
993 switch (*Name) {
994 default: return false;
995 case 'O': // Zero
996 return true;
997 case 'b': // Base register
998 case 'f': // Floating point register
999 Info.setAllowsRegister();
1000 return true;
1001 }
1002 }
1003 virtual const char *getClobbers() const {
1004 return "";
1005 }
1006};
1007
1008/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1009/// #defines that are not tied to a specific subtarget.
1010void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1011 MacroBuilder &Builder) const {
1012 // Target identification.
1013 Builder.defineMacro("__microblaze__");
1014 Builder.defineMacro("_ARCH_MICROBLAZE");
1015 Builder.defineMacro("__MICROBLAZE__");
1016
1017 // Target properties.
1018 Builder.defineMacro("_BIG_ENDIAN");
1019 Builder.defineMacro("__BIG_ENDIAN__");
1020
1021 // Subtarget options.
1022 Builder.defineMacro("__REGISTER_PREFIX__", "");
1023}
1024
1025
1026const char * const MBlazeTargetInfo::GCCRegNames[] = {
1027 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1028 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1029 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1030 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1031 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1032 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1033 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1034 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1035 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1036 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1037};
1038
1039void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1040 unsigned &NumNames) const {
1041 Names = GCCRegNames;
1042 NumNames = llvm::array_lengthof(GCCRegNames);
1043}
1044
1045const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1046 { {"f0"}, "r0" },
1047 { {"f1"}, "r1" },
1048 { {"f2"}, "r2" },
1049 { {"f3"}, "r3" },
1050 { {"f4"}, "r4" },
1051 { {"f5"}, "r5" },
1052 { {"f6"}, "r6" },
1053 { {"f7"}, "r7" },
1054 { {"f8"}, "r8" },
1055 { {"f9"}, "r9" },
1056 { {"f10"}, "r10" },
1057 { {"f11"}, "r11" },
1058 { {"f12"}, "r12" },
1059 { {"f13"}, "r13" },
1060 { {"f14"}, "r14" },
1061 { {"f15"}, "r15" },
1062 { {"f16"}, "r16" },
1063 { {"f17"}, "r17" },
1064 { {"f18"}, "r18" },
1065 { {"f19"}, "r19" },
1066 { {"f20"}, "r20" },
1067 { {"f21"}, "r21" },
1068 { {"f22"}, "r22" },
1069 { {"f23"}, "r23" },
1070 { {"f24"}, "r24" },
1071 { {"f25"}, "r25" },
1072 { {"f26"}, "r26" },
1073 { {"f27"}, "r27" },
1074 { {"f28"}, "r28" },
1075 { {"f29"}, "r29" },
1076 { {"f30"}, "r30" },
1077 { {"f31"}, "r31" },
1078};
1079
1080void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1081 unsigned &NumAliases) const {
1082 Aliases = GCCRegAliases;
1083 NumAliases = llvm::array_lengthof(GCCRegAliases);
1084}
1085} // end anonymous namespace.
1086
1087namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001088// Namespace for x86 abstract base class
1089const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001090#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001091#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001092 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001093#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001094};
Eli Friedmanb5366062008-05-20 14:21:01 +00001095
Nuno Lopescfca1f02009-12-23 17:49:57 +00001096static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001097 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1098 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001099 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001100 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1101 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1102 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001103 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001104};
1105
Eric Christophercdd36352011-06-21 00:05:20 +00001106const TargetInfo::AddlRegName AddlRegNames[] = {
1107 { { "al", "ah", "eax", "rax" }, 0 },
1108 { { "bl", "bh", "ebx", "rbx" }, 3 },
1109 { { "cl", "ch", "ecx", "rcx" }, 2 },
1110 { { "dl", "dh", "edx", "rdx" }, 1 },
1111 { { "esi", "rsi" }, 4 },
1112 { { "edi", "rdi" }, 5 },
1113 { { "esp", "rsp" }, 7 },
1114 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001115};
1116
1117// X86 target abstract base class; x86-32 and x86-64 are very close, so
1118// most of the implementation can be shared.
1119class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001120 enum X86SSEEnum {
Eli Friedman33465822011-07-08 23:31:17 +00001121 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
Chris Lattner96e43572009-03-02 22:40:39 +00001122 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001123 enum MMX3DNowEnum {
1124 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1125 } MMX3DNowLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001126
Eric Christophere1ddaf92010-04-02 23:50:19 +00001127 bool HasAES;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001128 bool HasAVX;
1129
Eli Friedman3fd920a2008-08-20 02:34:37 +00001130public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001131 X86TargetInfo(const std::string& triple)
Eli Friedman33465822011-07-08 23:31:17 +00001132 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001133 HasAES(false), HasAVX(false) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001134 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001135 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001136 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1137 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001138 Records = BuiltinInfo;
1139 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001140 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001141 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001142 unsigned &NumNames) const {
1143 Names = GCCRegNames;
1144 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001145 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001146 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001147 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001148 Aliases = 0;
1149 NumAliases = 0;
1150 }
1151 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1152 unsigned &NumNames) const {
1153 Names = AddlRegNames;
1154 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001155 }
Anders Carlsson58436352009-02-28 17:11:49 +00001156 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001157 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001158 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001159 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001160 return "~{dirflag},~{fpsr},~{flags}";
1161 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001162 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001163 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001164 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1165 const std::string &Name,
1166 bool Enabled) const;
Mike Stump11289f42009-09-09 15:08:12 +00001167 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001168 llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001169 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedman33465822011-07-08 23:31:17 +00001170 virtual const char* getABI() const {
1171 return MMX3DNowLevel == NoMMX3DNow ? "no-mmx" : "";
1172 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001173};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001174
Mike Stump11289f42009-09-09 15:08:12 +00001175void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001176 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001177 // FIXME: This should not be here.
1178 Features["3dnow"] = false;
1179 Features["3dnowa"] = false;
1180 Features["mmx"] = false;
1181 Features["sse"] = false;
1182 Features["sse2"] = false;
1183 Features["sse3"] = false;
1184 Features["ssse3"] = false;
1185 Features["sse41"] = false;
1186 Features["sse42"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001187 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001188 Features["avx"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001189
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001190 // LLVM does not currently recognize this.
1191 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001192
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001193 // FIXME: This *really* should not be here.
1194
1195 // X86_64 always has SSE2.
1196 if (PointerWidth == 64)
1197 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1198
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001199 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1200 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1201 ;
1202 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1203 setFeatureEnabled(Features, "mmx", true);
Eli Friedman33465822011-07-08 23:31:17 +00001204 else if (CPU == "pentium3") {
1205 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001206 setFeatureEnabled(Features, "sse", true);
Eli Friedman33465822011-07-08 23:31:17 +00001207 } else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64") {
1208 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001209 setFeatureEnabled(Features, "sse2", true);
Eli Friedman33465822011-07-08 23:31:17 +00001210 } else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona") {
1211 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001212 setFeatureEnabled(Features, "sse3", true);
Eli Friedman33465822011-07-08 23:31:17 +00001213 } else if (CPU == "core2") {
1214 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001215 setFeatureEnabled(Features, "ssse3", true);
Eli Friedman33465822011-07-08 23:31:17 +00001216 } else if (CPU == "penryn") {
1217 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001218 setFeatureEnabled(Features, "sse4", true);
1219 Features["sse42"] = false;
Eli Friedman33465822011-07-08 23:31:17 +00001220 } else if (CPU == "atom") {
1221 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001222 setFeatureEnabled(Features, "sse3", true);
Eli Friedman33465822011-07-08 23:31:17 +00001223 } else if (CPU == "corei7") {
1224 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001225 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001226 setFeatureEnabled(Features, "aes", true);
Benjamin Kramer85e16642011-05-20 15:11:23 +00001227 } else if (CPU == "corei7-avx") {
Eli Friedman33465822011-07-08 23:31:17 +00001228 setFeatureEnabled(Features, "mmx", true);
Roman Divacky27ec14f2011-04-05 20:32:44 +00001229 setFeatureEnabled(Features, "sse4", true);
1230 setFeatureEnabled(Features, "aes", true);
Bruno Cardoso Lopes34728382011-07-11 23:33:46 +00001231 //setFeatureEnabled(Features, "avx", true);
Roman Divacky27ec14f2011-04-05 20:32:44 +00001232 } else if (CPU == "k6" || CPU == "winchip-c6")
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001233 setFeatureEnabled(Features, "mmx", true);
Mike Stump11289f42009-09-09 15:08:12 +00001234 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001235 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001236 setFeatureEnabled(Features, "3dnow", true);
1237 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1238 setFeatureEnabled(Features, "sse", true);
1239 setFeatureEnabled(Features, "3dnowa", true);
1240 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1241 CPU == "athlon-fx") {
Mike Stump11289f42009-09-09 15:08:12 +00001242 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001243 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001244 } else if (CPU == "k8-sse3") {
1245 setFeatureEnabled(Features, "sse3", true);
1246 setFeatureEnabled(Features, "3dnowa", true);
Eli Friedman33465822011-07-08 23:31:17 +00001247 } else if (CPU == "c3-2") {
1248 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001249 setFeatureEnabled(Features, "sse", true);
Eli Friedman33465822011-07-08 23:31:17 +00001250 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001251}
1252
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001253bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001254 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001255 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001256 // FIXME: This *really* should not be here. We need some way of translating
1257 // options into llvm subtarget features.
1258 if (!Features.count(Name) &&
1259 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001260 return false;
1261
1262 if (Enabled) {
1263 if (Name == "mmx")
1264 Features["mmx"] = true;
1265 else if (Name == "sse")
Eli Friedman33465822011-07-08 23:31:17 +00001266 Features["sse"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001267 else if (Name == "sse2")
Eli Friedman33465822011-07-08 23:31:17 +00001268 Features["sse"] = Features["sse2"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001269 else if (Name == "sse3")
Eli Friedman33465822011-07-08 23:31:17 +00001270 Features["sse"] = Features["sse2"] = Features["sse3"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001271 else if (Name == "ssse3")
Eli Friedman33465822011-07-08 23:31:17 +00001272 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001273 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001274 else if (Name == "sse4" || Name == "sse4.2")
Eli Friedman33465822011-07-08 23:31:17 +00001275 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001276 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001277 else if (Name == "sse4.1")
Eli Friedman33465822011-07-08 23:31:17 +00001278 Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopher399ffa52010-03-04 02:26:37 +00001279 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001280 else if (Name == "3dnow")
Eli Friedman33465822011-07-08 23:31:17 +00001281 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001282 else if (Name == "3dnowa")
Eli Friedman33465822011-07-08 23:31:17 +00001283 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001284 else if (Name == "aes")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001285 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001286 else if (Name == "avx")
Bruno Cardoso Lopesbf9246d2011-08-18 00:07:03 +00001287 Features["avx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1288 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001289 } else {
1290 if (Name == "mmx")
Eli Friedman33465822011-07-08 23:31:17 +00001291 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001292 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001293 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001294 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001295 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001296 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001297 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001298 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001299 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001300 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001301 else if (Name == "ssse3")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001302 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencera9e41172011-04-17 19:22:03 +00001303 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001304 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001305 else if (Name == "sse4.2")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001306 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001307 else if (Name == "3dnow")
1308 Features["3dnow"] = Features["3dnowa"] = false;
1309 else if (Name == "3dnowa")
1310 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001311 else if (Name == "aes")
1312 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001313 else if (Name == "avx")
1314 Features["avx"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001315 }
1316
1317 return true;
1318}
1319
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001320/// HandleTargetOptions - Perform initialization based on the user
1321/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001322void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001323 // Remember the maximum enabled sselevel.
1324 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1325 // Ignore disabled features.
1326 if (Features[i][0] == '-')
1327 continue;
1328
Eric Christophere1ddaf92010-04-02 23:50:19 +00001329 if (Features[i].substr(1) == "aes") {
1330 HasAES = true;
1331 continue;
1332 }
1333
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001334 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1335 // For now let it be enabled together with other SSE levels.
1336 if (Features[i].substr(1) == "avx") {
1337 HasAVX = true;
1338 continue;
1339 }
1340
Daniel Dunbar979586e2009-11-11 09:38:56 +00001341 assert(Features[i][0] == '+' && "Invalid target feature!");
1342 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1343 .Case("sse42", SSE42)
1344 .Case("sse41", SSE41)
1345 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001346 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001347 .Case("sse2", SSE2)
1348 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00001349 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001350 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001351
Eli Friedman33465822011-07-08 23:31:17 +00001352 MMX3DNowEnum ThreeDNowLevel =
1353 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
Anders Carlssone437c682010-01-27 03:47:49 +00001354 .Case("3dnowa", AMD3DNowAthlon)
1355 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00001356 .Case("mmx", MMX)
1357 .Default(NoMMX3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001358
Eli Friedman33465822011-07-08 23:31:17 +00001359 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001360 }
Eli Friedman33465822011-07-08 23:31:17 +00001361
1362 // Don't tell the backend if we're turning off mmx; it will end up disabling
1363 // SSE, which we don't want.
1364 std::vector<std::string>::iterator it;
1365 it = std::find(Features.begin(), Features.end(), "-mmx");
1366 if (it != Features.end())
1367 Features.erase(it);
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001368}
Chris Lattnerecd49032009-03-02 22:27:17 +00001369
1370/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1371/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001372void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001373 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001374 // Target identification.
1375 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001376 Builder.defineMacro("_LP64");
1377 Builder.defineMacro("__LP64__");
1378 Builder.defineMacro("__amd64__");
1379 Builder.defineMacro("__amd64");
1380 Builder.defineMacro("__x86_64");
1381 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001382 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001383 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001384 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001385
Eric Christophere1ddaf92010-04-02 23:50:19 +00001386 if (HasAES)
1387 Builder.defineMacro("__AES__");
1388
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001389 if (HasAVX)
1390 Builder.defineMacro("__AVX__");
1391
Chris Lattnerecd49032009-03-02 22:27:17 +00001392 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001393 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001394
Chris Lattnerecd49032009-03-02 22:27:17 +00001395 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001396 Builder.defineMacro("__nocona");
1397 Builder.defineMacro("__nocona__");
1398 Builder.defineMacro("__tune_nocona__");
1399 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +00001400
Chris Lattner6df41af2009-04-19 17:32:33 +00001401 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1402 // functions in glibc header files that use FP Stack inline asm which the
1403 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001404 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001405
Chris Lattner96e43572009-03-02 22:40:39 +00001406 // Each case falls through to the previous one here.
1407 switch (SSELevel) {
1408 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001409 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00001410 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001411 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00001412 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001413 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001414 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001415 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001416 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001417 Builder.defineMacro("__SSE2__");
1418 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001419 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001420 Builder.defineMacro("__SSE__");
1421 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00001422 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00001423 break;
1424 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001425
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001426 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001427 switch (SSELevel) {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001428 case SSE42:
1429 case SSE41:
1430 case SSSE3:
1431 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001432 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001433 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001434 break;
1435 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001436 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001437 break;
1438 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001439 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001440 }
1441 }
1442
Anders Carlssone437c682010-01-27 03:47:49 +00001443 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00001444 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00001445 case AMD3DNowAthlon:
1446 Builder.defineMacro("__3dNOW_A__");
1447 case AMD3DNow:
1448 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00001449 case MMX:
1450 Builder.defineMacro("__MMX__");
1451 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00001452 break;
1453 }
Chris Lattnerecd49032009-03-02 22:27:17 +00001454}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001455
1456
Eli Friedman3fd920a2008-08-20 02:34:37 +00001457bool
Anders Carlsson58436352009-02-28 17:11:49 +00001458X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001459 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00001460 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001461 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00001462 case 'Y': // first letter of a pair:
1463 switch (*(Name+1)) {
1464 default: return false;
1465 case '0': // First SSE register.
1466 case 't': // Any SSE register, when SSE2 is enabled.
1467 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1468 case 'm': // any MMX register, when inter-unit moves enabled.
1469 break; // falls through to setAllowsRegister.
1470 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001471 case 'a': // eax.
1472 case 'b': // ebx.
1473 case 'c': // ecx.
1474 case 'd': // edx.
1475 case 'S': // esi.
1476 case 'D': // edi.
1477 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00001478 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001479 case 't': // top of floating point stack.
1480 case 'u': // second from top of floating point stack.
1481 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00001482 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00001483 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001484 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00001485 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1486 case 'l': // "Index" registers: any general register that can be used as an
1487 // index in a base+index memory access.
1488 Info.setAllowsRegister();
1489 return true;
1490 case 'C': // SSE floating point constant.
1491 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001492 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001493 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001494 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001495 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001496 return true;
1497 }
Dale Johannesen46742a42010-08-24 22:33:12 +00001498 return false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001499}
1500
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00001501
Eli Friedman3fd920a2008-08-20 02:34:37 +00001502std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001503X86TargetInfo::convertConstraint(const char *&Constraint) const {
1504 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001505 case 'a': return std::string("{ax}");
1506 case 'b': return std::string("{bx}");
1507 case 'c': return std::string("{cx}");
1508 case 'd': return std::string("{dx}");
1509 case 'S': return std::string("{si}");
1510 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00001511 case 'p': // address
1512 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00001513 case 't': // top of floating point stack.
1514 return std::string("{st}");
1515 case 'u': // second from top of floating point stack.
1516 return std::string("{st(1)}"); // second from top of floating point stack.
1517 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001518 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00001519 }
1520}
Eli Friedman3fd920a2008-08-20 02:34:37 +00001521} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00001522
1523namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001524// X86-32 generic target
1525class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001526public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00001527 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1528 DoubleAlign = LongLongAlign = 32;
1529 LongDoubleWidth = 96;
1530 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +00001531 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1532 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001533 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +00001534 SizeType = UnsignedInt;
1535 PtrDiffType = SignedInt;
1536 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001537 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001538
1539 // Use fpret for all types.
1540 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1541 (1 << TargetInfo::Double) |
1542 (1 << TargetInfo::LongDouble));
Eli Friedman3fd920a2008-08-20 02:34:37 +00001543 }
1544 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001545 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00001546 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001547
Chris Lattnerd545ad12009-09-23 06:06:36 +00001548 int getEHDataRegisterNumber(unsigned RegNo) const {
1549 if (RegNo == 0) return 0;
1550 if (RegNo == 1) return 2;
1551 return -1;
1552 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001553};
1554} // end anonymous namespace
1555
1556namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00001557class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1558public:
1559 OpenBSDI386TargetInfo(const std::string& triple) :
1560 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1561 SizeType = UnsignedLong;
1562 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00001563 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00001564 }
1565};
1566} // end anonymous namespace
1567
1568namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00001569class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001570public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00001571 DarwinI386TargetInfo(const std::string& triple) :
1572 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001573 LongDoubleWidth = 128;
1574 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00001575 SizeType = UnsignedLong;
1576 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00001577 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1578 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001579 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbarbd606522010-05-27 00:35:16 +00001580 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00001581 }
1582
Eli Friedman3fd920a2008-08-20 02:34:37 +00001583};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00001584} // end anonymous namespace
1585
1586namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001587// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001588class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001589public:
1590 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001591 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001592 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00001593 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00001594 DoubleAlign = LongLongAlign = 64;
1595 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 +00001596 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1597 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001598 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001599 virtual void getTargetDefines(const LangOptions &Opts,
1600 MacroBuilder &Builder) const {
1601 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1602 }
1603};
1604} // end anonymous namespace
1605
1606namespace {
1607
1608// x86-32 Windows Visual Studio target
1609class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1610public:
1611 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1612 : WindowsX86_32TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00001613 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001614 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1615 }
1616 virtual void getTargetDefines(const LangOptions &Opts,
1617 MacroBuilder &Builder) const {
1618 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1619 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1620 // The value of the following reflects processor type.
1621 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1622 // We lost the original triple, so we use the default.
1623 Builder.defineMacro("_M_IX86", "600");
1624 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001625};
1626} // end anonymous namespace
1627
1628namespace {
1629// x86-32 MinGW target
1630class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1631public:
1632 MinGWX86_32TargetInfo(const std::string& triple)
1633 : WindowsX86_32TargetInfo(triple) {
1634 }
1635 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001636 MacroBuilder &Builder) const {
1637 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001638 DefineStd(Builder, "WIN32", Opts);
1639 DefineStd(Builder, "WINNT", Opts);
1640 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001641 Builder.defineMacro("__MSVCRT__");
1642 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001643
1644 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1645 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1646 if (Opts.Microsoft)
1647 // Provide "as-is" __declspec.
1648 Builder.defineMacro("__declspec", "__declspec");
1649 else
1650 // Provide alias of __attribute__ like mingw32-gcc.
1651 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001652 }
1653};
1654} // end anonymous namespace
1655
1656namespace {
1657// x86-32 Cygwin target
1658class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1659public:
1660 CygwinX86_32TargetInfo(const std::string& triple)
1661 : X86_32TargetInfo(triple) {
1662 TLSSupported = false;
1663 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001664 DoubleAlign = LongLongAlign = 64;
1665 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1666 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001667 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001668 }
1669 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001670 MacroBuilder &Builder) const {
1671 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1672 Builder.defineMacro("__CYGWIN__");
1673 Builder.defineMacro("__CYGWIN32__");
1674 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00001675 if (Opts.CPlusPlus)
1676 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00001677 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001678};
1679} // end anonymous namespace
1680
1681namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00001682// x86-32 Haiku target
1683class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1684public:
1685 HaikuX86_32TargetInfo(const std::string& triple)
1686 : X86_32TargetInfo(triple) {
1687 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00001688 IntPtrType = SignedLong;
1689 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00001690 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00001691 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00001692 virtual void getTargetDefines(const LangOptions &Opts,
1693 MacroBuilder &Builder) const {
1694 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1695 Builder.defineMacro("__INTEL__");
1696 Builder.defineMacro("__HAIKU__");
1697 }
1698};
1699} // end anonymous namespace
1700
Douglas Gregor9fabd852011-07-01 22:41:14 +00001701// RTEMS Target
1702template<typename Target>
1703class RTEMSTargetInfo : public OSTargetInfo<Target> {
1704protected:
1705 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1706 MacroBuilder &Builder) const {
1707 // RTEMS defines; list based off of gcc output
1708
Douglas Gregor9fabd852011-07-01 22:41:14 +00001709 Builder.defineMacro("__rtems__");
1710 Builder.defineMacro("__ELF__");
1711 }
1712public:
1713 RTEMSTargetInfo(const std::string &triple)
1714 : OSTargetInfo<Target>(triple) {
1715 this->UserLabelPrefix = "";
1716
1717 llvm::Triple Triple(triple);
1718 switch (Triple.getArch()) {
1719 default:
1720 case llvm::Triple::x86:
1721 // this->MCountName = ".mcount";
1722 break;
1723 case llvm::Triple::mips:
1724 case llvm::Triple::mipsel:
1725 case llvm::Triple::ppc:
1726 case llvm::Triple::ppc64:
1727 // this->MCountName = "_mcount";
1728 break;
1729 case llvm::Triple::arm:
1730 // this->MCountName = "__mcount";
1731 break;
1732 }
1733
1734 }
1735};
1736
1737namespace {
1738// x86-32 RTEMS target
1739class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
1740public:
1741 RTEMSX86_32TargetInfo(const std::string& triple)
1742 : X86_32TargetInfo(triple) {
1743 SizeType = UnsignedLong;
1744 IntPtrType = SignedLong;
1745 PtrDiffType = SignedLong;
1746 this->UserLabelPrefix = "";
1747 }
1748 virtual void getTargetDefines(const LangOptions &Opts,
1749 MacroBuilder &Builder) const {
1750 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1751 Builder.defineMacro("__INTEL__");
1752 Builder.defineMacro("__rtems__");
1753 }
1754};
1755} // end anonymous namespace
1756
Chris Lattnerb986aba2010-04-11 19:29:39 +00001757namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001758// x86-64 generic target
1759class X86_64TargetInfo : public X86TargetInfo {
1760public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001761 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001762 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00001763 LongDoubleWidth = 128;
1764 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00001765 LargeArrayMinWidth = 128;
1766 LargeArrayAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001767 IntMaxType = SignedLong;
1768 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001769 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001770 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001771
Eli Friedman873f65a2008-08-21 00:13:15 +00001772 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1773 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001774 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001775
1776 // Use fpret only for long double.
1777 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Chris Lattner10a5b382007-01-29 05:24:35 +00001778 }
Anders Carlssona7408e72007-10-13 00:45:48 +00001779 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001780 return "typedef struct __va_list_tag {"
1781 " unsigned gp_offset;"
1782 " unsigned fp_offset;"
1783 " void* overflow_arg_area;"
1784 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00001785 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00001786 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001787 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001788
Chris Lattnerd545ad12009-09-23 06:06:36 +00001789 int getEHDataRegisterNumber(unsigned RegNo) const {
1790 if (RegNo == 0) return 0;
1791 if (RegNo == 1) return 1;
1792 return -1;
1793 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001794};
1795} // end anonymous namespace
1796
1797namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001798// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001799class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001800public:
1801 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001802 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001803 TLSSupported = false;
1804 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00001805 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001806 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00001807 IntMaxType = SignedLongLong;
1808 UIntMaxType = UnsignedLongLong;
1809 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00001810 SizeType = UnsignedLongLong;
1811 PtrDiffType = SignedLongLong;
1812 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00001813 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001814 }
1815 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001816 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001817 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001818 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001819 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00001820 virtual const char *getVAListDeclaration() const {
1821 return "typedef char* __builtin_va_list;";
1822 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001823};
1824} // end anonymous namespace
1825
1826namespace {
1827// x86-64 Windows Visual Studio target
1828class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1829public:
1830 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1831 : WindowsX86_64TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00001832 LongDoubleWidth = LongDoubleAlign = 64;
1833 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001834 }
1835 virtual void getTargetDefines(const LangOptions &Opts,
1836 MacroBuilder &Builder) const {
1837 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1838 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001839 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001840 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001841 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001842};
1843} // end anonymous namespace
1844
1845namespace {
1846// x86-64 MinGW target
1847class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1848public:
1849 MinGWX86_64TargetInfo(const std::string& triple)
1850 : WindowsX86_64TargetInfo(triple) {
1851 }
1852 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001853 MacroBuilder &Builder) const {
1854 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001855 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001856 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00001857 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001858 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001859
1860 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1861 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1862 if (Opts.Microsoft)
1863 // Provide "as-is" __declspec.
1864 Builder.defineMacro("__declspec", "__declspec");
1865 else
1866 // Provide alias of __attribute__ like mingw32-gcc.
1867 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001868 }
1869};
1870} // end anonymous namespace
1871
1872namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00001873class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1874public:
Mike Stump11289f42009-09-09 15:08:12 +00001875 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00001876 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1877 Int64Type = SignedLongLong;
1878 }
1879};
1880} // end anonymous namespace
1881
1882namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00001883class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1884public:
Mike Stump11289f42009-09-09 15:08:12 +00001885 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00001886 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1887 IntMaxType = SignedLongLong;
1888 UIntMaxType = UnsignedLongLong;
1889 Int64Type = SignedLongLong;
1890 }
1891};
1892} // end anonymous namespace
1893
1894namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001895class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001896 // Possible FPU choices.
1897 enum FPUMode {
1898 NoFPU,
1899 VFP2FPU,
1900 VFP3FPU,
1901 NeonFPU
1902 };
1903
1904 static bool FPUModeIsVFP(FPUMode Mode) {
1905 return Mode >= VFP2FPU && Mode <= NeonFPU;
1906 }
1907
1908 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1909 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001910
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001911 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001912
1913 unsigned FPU : 3;
1914
Daniel Dunbar893d4752009-12-19 04:15:38 +00001915 unsigned IsThumb : 1;
1916
1917 // Initialized via features.
1918 unsigned SoftFloat : 1;
1919 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001920
Chris Lattner5cc15e02010-03-03 19:03:45 +00001921 static const Builtin::Info BuiltinInfo[];
1922
Chris Lattner17df24e2008-04-21 18:56:49 +00001923public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001924 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001925 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001926 {
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001927 SizeType = UnsignedInt;
1928 PtrDiffType = SignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001929
Chris Lattner1a8f3942010-04-23 16:29:58 +00001930 // {} in inline assembly are neon specifiers, not assembly variant
1931 // specifiers.
1932 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001933
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001934 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00001935 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00001936 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00001937 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1938 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00001939 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1940 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001941 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001942 } else {
1943 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1944 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001945 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001946 }
John McCall86353412010-08-21 22:46:04 +00001947
1948 // ARM targets default to using the ARM C++ ABI.
1949 CXXABI = CXXABI_ARM;
Eli Friedmanb5366062008-05-20 14:21:01 +00001950 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001951 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001952 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001953 ABI = Name;
1954
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001955 // The defaults (above) are for AAPCS, check if we need to change them.
1956 //
1957 // FIXME: We need support for -meabi... we could just mangle it into the
1958 // name.
1959 if (Name == "apcs-gnu") {
Daniel Dunbar377dc2f2010-01-27 20:23:08 +00001960 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001961 SizeType = UnsignedLong;
1962
Daniel Dunbarf8125062010-04-22 16:14:54 +00001963 // Do not respect the alignment of bit-field types when laying out
1964 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1965 UseBitFieldTypeAlignment = false;
1966
Chad Rosier18903ee2011-08-04 01:21:14 +00001967 /// Do force alignment of members that follow zero length bitfields. If
1968 /// the alignment of the zero-length bitfield is greater than the member
1969 /// that follows it, `bar', `bar' will be aligned as the type of the
1970 /// zero length bitfield.
1971 UseZeroLengthBitfieldAlignment = true;
1972
1973 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosiera336c6f2011-08-04 17:52:43 +00001974 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
1975 /// gcc.
Chad Rosier18903ee2011-08-04 01:21:14 +00001976 ZeroLengthBitfieldBoundary = 32;
1977
Daniel Dunbar03184792009-09-22 21:44:58 +00001978 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00001979 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1980 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00001981 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
Bob Wilson1957a2f2011-06-29 16:09:20 +00001982 "i64:32:64-f32:32:32-f64:32:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001983 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001984 } else {
1985 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 +00001986 "i64:32:64-f32:32:32-f64:32:64-"
1987 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001988 }
1989
Chad Rosier99ee7822011-07-26 07:03:04 +00001990 // FIXME: Override "preferred align" for double and long long.
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001991 } else if (Name == "aapcs") {
1992 // FIXME: Enumerated types are variable width in straight AAPCS.
1993 } else if (Name == "aapcs-linux") {
Chad Rosier99ee7822011-07-26 07:03:04 +00001994 ;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001995 } else
1996 return false;
1997
1998 return true;
1999 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00002000
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002001 void getDefaultFeatures(const std::string &CPU,
2002 llvm::StringMap<bool> &Features) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002003 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2004 Features["vfp2"] = true;
2005 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2006 Features["neon"] = true;
2007 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002008
Daniel Dunbar893d4752009-12-19 04:15:38 +00002009 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2010 const std::string &Name,
2011 bool Enabled) const {
Evan Cheng491f56d2011-07-08 06:40:11 +00002012 if (Name == "soft-float" || Name == "soft-float-abi" ||
2013 Name == "vfp2" || Name == "vfp3" || Name == "neon") {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002014 Features[Name] = Enabled;
2015 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00002016 return false;
2017
Daniel Dunbar893d4752009-12-19 04:15:38 +00002018 return true;
2019 }
2020
2021 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002022 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00002023 SoftFloat = SoftFloatABI = false;
2024 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2025 if (Features[i] == "+soft-float")
2026 SoftFloat = true;
2027 else if (Features[i] == "+soft-float-abi")
2028 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002029 else if (Features[i] == "+vfp2")
2030 FPU = VFP2FPU;
2031 else if (Features[i] == "+vfp3")
2032 FPU = VFP3FPU;
2033 else if (Features[i] == "+neon")
2034 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00002035 }
2036
2037 // Remove front-end specific options which the backend handles differently.
2038 std::vector<std::string>::iterator it;
2039 it = std::find(Features.begin(), Features.end(), "+soft-float");
2040 if (it != Features.end())
2041 Features.erase(it);
2042 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2043 if (it != Features.end())
2044 Features.erase(it);
2045 }
2046
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002047 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002048 return llvm::StringSwitch<const char*>(Name)
2049 .Cases("arm8", "arm810", "4")
2050 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2051 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2052 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2053 .Case("ep9312", "4T")
2054 .Cases("arm10tdmi", "arm1020t", "5T")
2055 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2056 .Case("arm926ej-s", "5TEJ")
2057 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2058 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002059 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002060 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002061 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002062 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2063 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00002064 .Case("cortex-m3", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00002065 .Case("cortex-m0", "6M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002066 .Default(0);
2067 }
2068 virtual bool setCPU(const std::string &Name) {
2069 if (!getCPUDefineSuffix(Name))
2070 return false;
2071
2072 CPU = Name;
2073 return true;
2074 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002075 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002076 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002077 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002078 Builder.defineMacro("__arm");
2079 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002080
Chris Lattnerecd49032009-03-02 22:27:17 +00002081 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002082 Builder.defineMacro("__ARMEL__");
2083 Builder.defineMacro("__LITTLE_ENDIAN__");
2084 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002085
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002086 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002087 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002088
Mike Stump9d54bd72009-04-08 02:07:04 +00002089 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002090
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002091 // FIXME: It's more complicated than this and we don't really support
2092 // interworking.
2093 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002094 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002095
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002096 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002097 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002098
Daniel Dunbar893d4752009-12-19 04:15:38 +00002099 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002100 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002101
2102 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002103 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002104
Bob Wilson19c1b882011-05-13 18:56:03 +00002105 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002106 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002107 Builder.defineMacro("__THUMBEL__");
2108 Builder.defineMacro("__thumb__");
Bob Wilson19c1b882011-05-13 18:56:03 +00002109 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002110 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002111 }
2112
2113 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002114 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002115
2116 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002117 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002118
2119 // This only gets set when Neon instructions are actually available, unlike
2120 // the VFP define, hence the soft float and arch check. This is subtly
2121 // different from gcc, we follow the intent which was that it should be set
2122 // when Neon instructions are actually available.
Bob Wilson19c1b882011-05-13 18:56:03 +00002123 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002124 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00002125 }
2126 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2127 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00002128 Records = BuiltinInfo;
2129 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00002130 }
2131 virtual const char *getVAListDeclaration() const {
John McCalle155a3d2011-05-09 02:19:37 +00002132 return "typedef void* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00002133 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002134 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002135 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002136 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002137 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002138 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002139 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002140 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00002141 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002142 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00002143 case 'l': // r0-r7
2144 case 'h': // r8-r15
2145 case 'w': // VFP Floating point register single precision
2146 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00002147 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00002148 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00002149 case 'Q': // A memory address that is a single base register.
2150 Info.setAllowsMemory();
2151 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002152 case 'U': // a memory reference...
2153 switch (Name[1]) {
2154 case 'q': // ...ARMV4 ldrsb
2155 case 'v': // ...VFP load/store (reg+constant offset)
2156 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00002157 case 't': // address valid for load/store opaque types wider
2158 // than 128-bits
2159 case 'n': // valid address for Neon doubleword vector load/store
2160 case 'm': // valid address for Neon element and structure load/store
2161 case 's': // valid address for non-offset loads/stores of quad-word
2162 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002163 Info.setAllowsMemory();
2164 Name++;
2165 return true;
2166 }
Nate Begeman2908fa02008-04-22 05:03:19 +00002167 }
Chris Lattner17df24e2008-04-21 18:56:49 +00002168 return false;
2169 }
Evan Chengd863adb2011-06-16 19:13:15 +00002170 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002171 std::string R;
2172 switch (*Constraint) {
2173 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00002174 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002175 Constraint++;
2176 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00002177 case 'p': // 'p' should be translated to 'r' by default.
2178 R = std::string("r");
2179 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002180 default:
2181 return std::string(1, *Constraint);
2182 }
2183 return R;
2184 }
Chris Lattner17df24e2008-04-21 18:56:49 +00002185 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002186 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00002187 return "";
2188 }
2189};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002190
2191const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002192 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002193 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002194 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2195
2196 // Float registers
2197 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2198 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2199 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002200 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002201
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002202 // Double registers
2203 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2204 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002205 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2206 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002207
2208 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002209 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2210 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002211};
2212
2213void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002214 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002215 Names = GCCRegNames;
2216 NumNames = llvm::array_lengthof(GCCRegNames);
2217}
2218
2219const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002220 { { "a1" }, "r0" },
2221 { { "a2" }, "r1" },
2222 { { "a3" }, "r2" },
2223 { { "a4" }, "r3" },
2224 { { "v1" }, "r4" },
2225 { { "v2" }, "r5" },
2226 { { "v3" }, "r6" },
2227 { { "v4" }, "r7" },
2228 { { "v5" }, "r8" },
2229 { { "v6", "rfp" }, "r9" },
2230 { { "sl" }, "r10" },
2231 { { "fp" }, "r11" },
2232 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002233 { { "r13" }, "sp" },
2234 { { "r14" }, "lr" },
2235 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002236 // The S, D and Q registers overlap, but aren't really aliases; we
2237 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002238};
2239
2240void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2241 unsigned &NumAliases) const {
2242 Aliases = GCCRegAliases;
2243 NumAliases = llvm::array_lengthof(GCCRegAliases);
2244}
Chris Lattner5cc15e02010-03-03 19:03:45 +00002245
2246const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00002247#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00002248#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00002249 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00002250#include "clang/Basic/BuiltinsARM.def"
2251};
Chris Lattner17df24e2008-04-21 18:56:49 +00002252} // end anonymous namespace.
2253
Eli Friedmanf05b7722008-08-20 07:44:10 +00002254
2255namespace {
Mike Stump11289f42009-09-09 15:08:12 +00002256class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002257 public DarwinTargetInfo<ARMTargetInfo> {
2258protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00002259 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002260 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00002261 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00002262 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002263
Torok Edwinb2b37c62009-06-30 17:10:35 +00002264public:
Mike Stump11289f42009-09-09 15:08:12 +00002265 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002266 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2267 HasAlignMac68kSupport = true;
2268 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002269};
2270} // end anonymous namespace.
2271
Chris Lattner5ba61f02006-10-14 07:39:34 +00002272namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002273class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00002274 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2275 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002276 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00002277public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002278 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2279 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00002280 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 +00002281 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002282 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002283 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2284 const std::string &Name,
2285 bool Enabled) const {
2286 if (Name == "soft-float")
2287 Features[Name] = Enabled;
2288 else
2289 return false;
2290
2291 return true;
2292 }
2293 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2294 SoftFloat = false;
2295 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2296 if (Features[i] == "+soft-float")
2297 SoftFloat = true;
2298 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002299 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002300 MacroBuilder &Builder) const {
2301 DefineStd(Builder, "sparc", Opts);
2302 Builder.defineMacro("__sparcv8");
2303 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002304
2305 if (SoftFloat)
2306 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00002307 }
2308 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2309 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002310 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00002311 }
2312 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002313 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00002314 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002315 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002316 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002317 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002318 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002319 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00002320 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002321 // FIXME: Implement!
2322 return false;
Gabor Greif49991682008-02-21 16:29:08 +00002323 }
2324 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002325 // FIXME: Implement!
2326 return "";
Gabor Greif49991682008-02-21 16:29:08 +00002327 }
2328};
2329
Chris Lattner9b415d62009-01-27 01:58:38 +00002330const char * const SparcV8TargetInfo::GCCRegNames[] = {
2331 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2332 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2333 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2334 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2335};
2336
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002337void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002338 unsigned &NumNames) const {
2339 Names = GCCRegNames;
2340 NumNames = llvm::array_lengthof(GCCRegNames);
2341}
2342
2343const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002344 { { "g0" }, "r0" },
2345 { { "g1" }, "r1" },
2346 { { "g2" }, "r2" },
2347 { { "g3" }, "r3" },
2348 { { "g4" }, "r4" },
2349 { { "g5" }, "r5" },
2350 { { "g6" }, "r6" },
2351 { { "g7" }, "r7" },
2352 { { "o0" }, "r8" },
2353 { { "o1" }, "r9" },
2354 { { "o2" }, "r10" },
2355 { { "o3" }, "r11" },
2356 { { "o4" }, "r12" },
2357 { { "o5" }, "r13" },
2358 { { "o6", "sp" }, "r14" },
2359 { { "o7" }, "r15" },
2360 { { "l0" }, "r16" },
2361 { { "l1" }, "r17" },
2362 { { "l2" }, "r18" },
2363 { { "l3" }, "r19" },
2364 { { "l4" }, "r20" },
2365 { { "l5" }, "r21" },
2366 { { "l6" }, "r22" },
2367 { { "l7" }, "r23" },
2368 { { "i0" }, "r24" },
2369 { { "i1" }, "r25" },
2370 { { "i2" }, "r26" },
2371 { { "i3" }, "r27" },
2372 { { "i4" }, "r28" },
2373 { { "i5" }, "r29" },
2374 { { "i6", "fp" }, "r30" },
2375 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00002376};
2377
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002378void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002379 unsigned &NumAliases) const {
2380 Aliases = GCCRegAliases;
2381 NumAliases = llvm::array_lengthof(GCCRegAliases);
2382}
Gabor Greif49991682008-02-21 16:29:08 +00002383} // end anonymous namespace.
2384
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002385namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002386class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2387public:
2388 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2389 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2390 SizeType = UnsignedInt;
2391 PtrDiffType = SignedInt;
2392 }
2393};
Torok Edwinb2b37c62009-06-30 17:10:35 +00002394class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002395public:
2396 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002397 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00002398 SizeType = UnsignedInt;
2399 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002400 }
2401};
2402} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00002403
Chris Lattnerb781dc792008-05-08 05:58:21 +00002404namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002405 class MSP430TargetInfo : public TargetInfo {
2406 static const char * const GCCRegNames[];
2407 public:
2408 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2409 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00002410 IntWidth = 16; IntAlign = 16;
2411 LongWidth = 32; LongLongWidth = 64;
2412 LongAlign = LongLongAlign = 16;
2413 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002414 SizeType = UnsignedInt;
2415 IntMaxType = SignedLong;
2416 UIntMaxType = UnsignedLong;
2417 IntPtrType = SignedShort;
2418 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00002419 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00002420 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002421 }
2422 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002423 MacroBuilder &Builder) const {
2424 Builder.defineMacro("MSP430");
2425 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002426 // FIXME: defines for different 'flavours' of MCU
2427 }
2428 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2429 unsigned &NumRecords) const {
2430 // FIXME: Implement.
2431 Records = 0;
2432 NumRecords = 0;
2433 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002434 virtual void getGCCRegNames(const char * const *&Names,
2435 unsigned &NumNames) const;
2436 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2437 unsigned &NumAliases) const {
2438 // No aliases.
2439 Aliases = 0;
2440 NumAliases = 0;
2441 }
2442 virtual bool validateAsmConstraint(const char *&Name,
2443 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00002444 // No target constraints for now.
2445 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002446 }
2447 virtual const char *getClobbers() const {
2448 // FIXME: Is this really right?
2449 return "";
2450 }
2451 virtual const char *getVAListDeclaration() const {
2452 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00002453 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002454 }
2455 };
2456
2457 const char * const MSP430TargetInfo::GCCRegNames[] = {
2458 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2459 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2460 };
2461
2462 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2463 unsigned &NumNames) const {
2464 Names = GCCRegNames;
2465 NumNames = llvm::array_lengthof(GCCRegNames);
2466 }
2467}
2468
2469
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002470namespace {
2471 class SystemZTargetInfo : public TargetInfo {
2472 static const char * const GCCRegNames[];
2473 public:
2474 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2475 TLSSupported = false;
2476 IntWidth = IntAlign = 32;
2477 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2478 PointerWidth = PointerAlign = 64;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002479 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2480 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002481 }
2482 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002483 MacroBuilder &Builder) const {
2484 Builder.defineMacro("__s390__");
2485 Builder.defineMacro("__s390x__");
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002486 }
2487 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2488 unsigned &NumRecords) const {
2489 // FIXME: Implement.
2490 Records = 0;
2491 NumRecords = 0;
2492 }
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002493
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002494 virtual void getGCCRegNames(const char * const *&Names,
2495 unsigned &NumNames) const;
2496 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2497 unsigned &NumAliases) const {
2498 // No aliases.
2499 Aliases = 0;
2500 NumAliases = 0;
2501 }
2502 virtual bool validateAsmConstraint(const char *&Name,
2503 TargetInfo::ConstraintInfo &info) const {
2504 // FIXME: implement
2505 return true;
2506 }
2507 virtual const char *getClobbers() const {
2508 // FIXME: Is this really right?
2509 return "";
2510 }
2511 virtual const char *getVAListDeclaration() const {
2512 // FIXME: implement
2513 return "typedef char* __builtin_va_list;";
2514 }
2515 };
2516
2517 const char * const SystemZTargetInfo::GCCRegNames[] = {
2518 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2519 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2520 };
2521
2522 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2523 unsigned &NumNames) const {
2524 Names = GCCRegNames;
2525 NumNames = llvm::array_lengthof(GCCRegNames);
2526 }
2527}
2528
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002529namespace {
2530 class BlackfinTargetInfo : public TargetInfo {
2531 static const char * const GCCRegNames[];
2532 public:
2533 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2534 TLSSupported = false;
2535 DoubleAlign = 32;
2536 LongLongAlign = 32;
2537 LongDoubleAlign = 32;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002538 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002539 }
2540
2541 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002542 MacroBuilder &Builder) const {
2543 DefineStd(Builder, "bfin", Opts);
2544 DefineStd(Builder, "BFIN", Opts);
2545 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002546 // FIXME: This one is really dependent on -mcpu
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002547 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002548 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2549 }
2550
2551 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2552 unsigned &NumRecords) const {
2553 // FIXME: Implement.
2554 Records = 0;
2555 NumRecords = 0;
2556 }
2557
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002558 virtual void getGCCRegNames(const char * const *&Names,
2559 unsigned &NumNames) const;
2560
2561 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2562 unsigned &NumAliases) const {
2563 // No aliases.
2564 Aliases = 0;
2565 NumAliases = 0;
2566 }
2567
2568 virtual bool validateAsmConstraint(const char *&Name,
2569 TargetInfo::ConstraintInfo &Info) const {
2570 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2571 Info.setAllowsRegister();
2572 return true;
2573 }
2574 return false;
2575 }
2576
2577 virtual const char *getClobbers() const {
2578 return "";
2579 }
2580
2581 virtual const char *getVAListDeclaration() const {
2582 return "typedef char* __builtin_va_list;";
2583 }
2584 };
2585
2586 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2587 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2588 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2589 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2590 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2591 "a0", "a1", "cc",
2592 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2593 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2594 };
2595
2596 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2597 unsigned &NumNames) const {
2598 Names = GCCRegNames;
2599 NumNames = llvm::array_lengthof(GCCRegNames);
2600 }
2601}
2602
Eli Friedmana9c3d712009-08-19 20:47:07 +00002603namespace {
2604
Mike Stump11289f42009-09-09 15:08:12 +00002605 // LLVM and Clang cannot be used directly to output native binaries for
2606 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00002607 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00002608 //
2609 // TCE uses the llvm bitcode as input and uses it for generating customized
2610 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00002611 // publicly available in http://tce.cs.tut.fi
2612
2613 class TCETargetInfo : public TargetInfo{
2614 public:
2615 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2616 TLSSupported = false;
2617 IntWidth = 32;
2618 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00002619 PointerWidth = 32;
2620 IntAlign = 32;
2621 LongAlign = LongLongAlign = 32;
2622 PointerAlign = 32;
2623 SizeType = UnsignedInt;
2624 IntMaxType = SignedLong;
2625 UIntMaxType = UnsignedLong;
2626 IntPtrType = SignedInt;
2627 PtrDiffType = SignedInt;
2628 FloatWidth = 32;
2629 FloatAlign = 32;
2630 DoubleWidth = 32;
2631 DoubleAlign = 32;
2632 LongDoubleWidth = 32;
2633 LongDoubleAlign = 32;
2634 FloatFormat = &llvm::APFloat::IEEEsingle;
2635 DoubleFormat = &llvm::APFloat::IEEEsingle;
2636 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00002637 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2638 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00002639 "f32:32:32-f64:32:32-v64:32:32-"
2640 "v128:32:32-a0:0:32-n32";
Eli Friedmana9c3d712009-08-19 20:47:07 +00002641 }
2642
2643 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002644 MacroBuilder &Builder) const {
2645 DefineStd(Builder, "tce", Opts);
2646 Builder.defineMacro("__TCE__");
2647 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00002648 }
2649 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2650 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00002651 virtual const char *getClobbers() const {
2652 return "";
2653 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002654 virtual const char *getVAListDeclaration() const {
2655 return "typedef void* __builtin_va_list;";
2656 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002657 virtual void getGCCRegNames(const char * const *&Names,
2658 unsigned &NumNames) const {}
2659 virtual bool validateAsmConstraint(const char *&Name,
2660 TargetInfo::ConstraintInfo &info) const {
2661 return true;
2662 }
2663 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2664 unsigned &NumAliases) const {}
2665 };
2666}
2667
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002668namespace {
2669class MipsTargetInfo : public TargetInfo {
Eric Christopher0b26a612010-03-02 02:41:08 +00002670 std::string ABI, CPU;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002671 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2672 static const char * const GCCRegNames[];
2673public:
Eric Christopher0b26a612010-03-02 02:41:08 +00002674 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002675 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakab579fe52011-06-02 00:09:17 +00002676 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2677 SizeType = UnsignedInt;
2678 PtrDiffType = SignedInt;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002679 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002680 virtual const char *getABI() const { return ABI.c_str(); }
2681 virtual bool setABI(const std::string &Name) {
2682
2683 if ((Name == "o32") || (Name == "eabi")) {
2684 ABI = Name;
2685 return true;
2686 } else
2687 return false;
2688 }
2689 virtual bool setCPU(const std::string &Name) {
2690 CPU = Name;
2691 return true;
2692 }
2693 void getDefaultFeatures(const std::string &CPU,
2694 llvm::StringMap<bool> &Features) const {
2695 Features[ABI] = true;
2696 Features[CPU] = true;
2697 }
2698 virtual void getArchDefines(const LangOptions &Opts,
2699 MacroBuilder &Builder) const {
Bruno Cardoso Lopes3aa2f0a2011-07-21 15:10:57 +00002700 if (ABI == "o32") {
Eric Christopher0b26a612010-03-02 02:41:08 +00002701 Builder.defineMacro("__mips_o32");
Bruno Cardoso Lopes3aa2f0a2011-07-21 15:10:57 +00002702 Builder.defineMacro("_ABIO32", "1");
2703 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
2704 }
2705 else if (ABI == "n32") {
2706 Builder.defineMacro("__mips_n32");
2707 Builder.defineMacro("_ABIN32", "2");
2708 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
2709 }
2710 else if (ABI == "n64") {
2711 Builder.defineMacro("__mips_n64");
2712 Builder.defineMacro("_ABI64", "3");
2713 Builder.defineMacro("_MIPS_SIM", "_ABI64");
2714 }
2715 else if (ABI == "o64") {
2716 Builder.defineMacro("__mips_o64");
2717 Builder.defineMacro("_ABIO64", "4");
2718 Builder.defineMacro("_MIPS_SIM", "_ABIO64");
2719 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002720 else if (ABI == "eabi")
2721 Builder.defineMacro("__mips_eabi");
2722 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002723 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002724 MacroBuilder &Builder) const {
2725 DefineStd(Builder, "mips", Opts);
2726 Builder.defineMacro("_mips");
2727 DefineStd(Builder, "MIPSEB", Opts);
2728 Builder.defineMacro("_MIPSEB");
2729 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002730 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002731 }
2732 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2733 unsigned &NumRecords) const {
2734 // FIXME: Implement!
2735 }
2736 virtual const char *getVAListDeclaration() const {
2737 return "typedef void* __builtin_va_list;";
2738 }
2739 virtual void getGCCRegNames(const char * const *&Names,
2740 unsigned &NumNames) const;
2741 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2742 unsigned &NumAliases) const;
2743 virtual bool validateAsmConstraint(const char *&Name,
2744 TargetInfo::ConstraintInfo &Info) const {
2745 switch (*Name) {
2746 default:
2747 case 'r': // CPU registers.
2748 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2749 case 'y': // Equivalent to "r", backwards compatibility only.
2750 case 'f': // floating-point registers.
2751 Info.setAllowsRegister();
2752 return true;
2753 }
2754 return false;
2755 }
2756
2757 virtual const char *getClobbers() const {
2758 // FIXME: Implement!
2759 return "";
2760 }
2761};
2762
2763const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002764 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002765 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2766 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2767 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2768 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2769 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2770 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2771 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2772 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2773 "$fcc5","$fcc6","$fcc7"
2774};
2775
2776void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2777 unsigned &NumNames) const {
2778 Names = GCCRegNames;
2779 NumNames = llvm::array_lengthof(GCCRegNames);
2780}
2781
2782const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2783 { { "at" }, "$1" },
2784 { { "v0" }, "$2" },
2785 { { "v1" }, "$3" },
2786 { { "a0" }, "$4" },
2787 { { "a1" }, "$5" },
2788 { { "a2" }, "$6" },
2789 { { "a3" }, "$7" },
2790 { { "t0" }, "$8" },
2791 { { "t1" }, "$9" },
2792 { { "t2" }, "$10" },
2793 { { "t3" }, "$11" },
2794 { { "t4" }, "$12" },
2795 { { "t5" }, "$13" },
2796 { { "t6" }, "$14" },
2797 { { "t7" }, "$15" },
2798 { { "s0" }, "$16" },
2799 { { "s1" }, "$17" },
2800 { { "s2" }, "$18" },
2801 { { "s3" }, "$19" },
2802 { { "s4" }, "$20" },
2803 { { "s5" }, "$21" },
2804 { { "s6" }, "$22" },
2805 { { "s7" }, "$23" },
2806 { { "t8" }, "$24" },
2807 { { "t9" }, "$25" },
2808 { { "k0" }, "$26" },
2809 { { "k1" }, "$27" },
2810 { { "gp" }, "$28" },
2811 { { "sp" }, "$29" },
2812 { { "fp" }, "$30" },
2813 { { "ra" }, "$31" }
2814};
2815
2816void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2817 unsigned &NumAliases) const {
2818 Aliases = GCCRegAliases;
2819 NumAliases = llvm::array_lengthof(GCCRegAliases);
2820}
2821} // end anonymous namespace.
2822
2823namespace {
2824class MipselTargetInfo : public MipsTargetInfo {
2825public:
2826 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2827 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakab579fe52011-06-02 00:09:17 +00002828 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002829 }
2830
2831 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002832 MacroBuilder &Builder) const;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002833};
2834
2835void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002836 MacroBuilder &Builder) const {
2837 DefineStd(Builder, "mips", Opts);
2838 Builder.defineMacro("_mips");
2839 DefineStd(Builder, "MIPSEL", Opts);
2840 Builder.defineMacro("_MIPSEL");
2841 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002842 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002843}
2844} // end anonymous namespace.
2845
Ivan Krasindd7403e2011-08-24 20:22:22 +00002846namespace {
2847class PNaClTargetInfo : public TargetInfo {
2848public:
2849 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
2850 this->UserLabelPrefix = "";
2851 this->LongAlign = 32;
2852 this->LongWidth = 32;
2853 this->PointerAlign = 32;
2854 this->PointerWidth = 32;
2855 this->IntMaxType = TargetInfo::SignedLongLong;
2856 this->UIntMaxType = TargetInfo::UnsignedLongLong;
2857 this->Int64Type = TargetInfo::SignedLongLong;
2858 this->SizeType = TargetInfo::UnsignedInt;
2859 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
2860 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
2861 }
2862
2863 void getDefaultFeatures(const std::string &CPU,
2864 llvm::StringMap<bool> &Features) const {
2865 }
2866 virtual void getArchDefines(const LangOptions &Opts,
2867 MacroBuilder &Builder) const {
2868 Builder.defineMacro("__le32__");
2869 Builder.defineMacro("__pnacl__");
2870 }
2871 virtual void getTargetDefines(const LangOptions &Opts,
2872 MacroBuilder &Builder) const {
Ivan Krasin9b2cbdf2011-08-25 23:49:20 +00002873 DefineStd(Builder, "unix", Opts);
2874 Builder.defineMacro("__ELF__");
2875 if (Opts.POSIXThreads)
2876 Builder.defineMacro("_REENTRANT");
2877 if (Opts.CPlusPlus)
2878 Builder.defineMacro("_GNU_SOURCE");
2879
Ivan Krasindd7403e2011-08-24 20:22:22 +00002880 Builder.defineMacro("__native_client__");
2881 getArchDefines(Opts, Builder);
2882 }
2883 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2884 unsigned &NumRecords) const {
2885 }
2886 virtual const char *getVAListDeclaration() const {
Ivan Krasin7a09d122011-08-24 21:22:25 +00002887 return "typedef struct __va_list_tag {"
2888 " void* ptr;"
2889 " void* padding1;"
2890 " void* padding2;"
2891 " void* padding3;"
2892 "} __builtin_va_list[1];";
Ivan Krasindd7403e2011-08-24 20:22:22 +00002893 }
2894 virtual void getGCCRegNames(const char * const *&Names,
2895 unsigned &NumNames) const;
2896 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2897 unsigned &NumAliases) const;
2898 virtual bool validateAsmConstraint(const char *&Name,
2899 TargetInfo::ConstraintInfo &Info) const {
2900 return false;
2901 }
2902
2903 virtual const char *getClobbers() const {
2904 return "";
2905 }
2906};
2907
2908void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
2909 unsigned &NumNames) const {
2910 Names = NULL;
2911 NumNames = 0;
2912}
2913
2914void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2915 unsigned &NumAliases) const {
2916 Aliases = NULL;
2917 NumAliases = 0;
2918}
2919} // end anonymous namespace.
2920
2921
Chris Lattner5ba61f02006-10-14 07:39:34 +00002922//===----------------------------------------------------------------------===//
2923// Driver code
2924//===----------------------------------------------------------------------===//
2925
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002926static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00002927 llvm::Triple Triple(T);
2928 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00002929
Daniel Dunbar52322032009-08-18 05:47:58 +00002930 switch (Triple.getArch()) {
2931 default:
2932 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00002933
Daniel Dunbar52322032009-08-18 05:47:58 +00002934 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00002935 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002936 if (Triple.isOSDarwin())
2937 return new DarwinARMTargetInfo(T);
2938
Daniel Dunbar52322032009-08-18 05:47:58 +00002939 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00002940 case llvm::Triple::Linux:
2941 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002942 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002943 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00002944 case llvm::Triple::NetBSD:
2945 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00002946 case llvm::Triple::RTEMS:
2947 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002948 default:
2949 return new ARMTargetInfo(T);
2950 }
Eli Friedmanb5366062008-05-20 14:21:01 +00002951
Daniel Dunbar52322032009-08-18 05:47:58 +00002952 case llvm::Triple::bfin:
Douglas Gregor9fabd852011-07-01 22:41:14 +00002953 if ( os == llvm::Triple::RTEMS )
2954 return new RTEMSTargetInfo<BlackfinTargetInfo>(T);
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002955 return new BlackfinTargetInfo(T);
2956
Daniel Dunbar52322032009-08-18 05:47:58 +00002957 case llvm::Triple::msp430:
2958 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00002959
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002960 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00002961 switch (os) {
2962 case llvm::Triple::Psp:
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002963 return new PSPTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00002964 case llvm::Triple::Linux:
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002965 return new LinuxTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00002966 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00002967 return new RTEMSTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00002968 case llvm::Triple::FreeBSD:
Joerg Sonnenbergerc46e3ce2011-07-07 17:01:45 +00002969 return new FreeBSDTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00002970 case llvm::Triple::NetBSD:
2971 return new NetBSDTargetInfo<MipsTargetInfo>(T);
2972 default:
2973 return new MipsTargetInfo(T);
2974 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002975
2976 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00002977 switch (os) {
2978 case llvm::Triple::Psp:
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002979 return new PSPTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00002980 case llvm::Triple::Linux:
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002981 return new LinuxTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00002982 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00002983 return new RTEMSTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00002984 case llvm::Triple::FreeBSD:
Joerg Sonnenbergerfbc0b3a2011-07-06 11:00:56 +00002985 return new FreeBSDTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00002986 case llvm::Triple::NetBSD:
2987 return new NetBSDTargetInfo<MipselTargetInfo>(T);
2988 default:
2989 return new MipsTargetInfo(T);
2990 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002991
Ivan Krasindd7403e2011-08-24 20:22:22 +00002992 case llvm::Triple::le32:
2993 switch (os) {
2994 case llvm::Triple::NativeClient:
2995 return new PNaClTargetInfo(T);
2996 default:
2997 return NULL;
2998 }
2999
Daniel Dunbar52322032009-08-18 05:47:58 +00003000 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003001 if (Triple.isOSDarwin())
Roman Divacky965b0b72011-01-06 08:27:10 +00003002 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003003 switch (os) {
3004 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00003005 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003006 case llvm::Triple::NetBSD:
3007 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
3008 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00003009 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003010 default:
3011 return new PPC32TargetInfo(T);
3012 }
Daniel Dunbar52322032009-08-18 05:47:58 +00003013
3014 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003015 if (Triple.isOSDarwin())
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00003016 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003017 switch (os) {
3018 case llvm::Triple::Lv2:
John Thompsone467e192009-11-19 17:18:50 +00003019 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003020 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00003021 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003022 case llvm::Triple::NetBSD:
3023 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
3024 default:
3025 return new PPC64TargetInfo(T);
3026 }
Daniel Dunbar52322032009-08-18 05:47:58 +00003027
Justin Holewinski514cce82011-04-20 19:34:15 +00003028 case llvm::Triple::ptx32:
3029 return new PTX32TargetInfo(T);
3030 case llvm::Triple::ptx64:
3031 return new PTX64TargetInfo(T);
3032
Chris Lattner5178f562010-03-06 21:21:27 +00003033 case llvm::Triple::mblaze:
3034 return new MBlazeTargetInfo(T);
3035
Daniel Dunbar52322032009-08-18 05:47:58 +00003036 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003037 switch (os) {
3038 case llvm::Triple::AuroraUX:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003039 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003040 case llvm::Triple::Solaris:
Daniel Dunbar52322032009-08-18 05:47:58 +00003041 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003042 case llvm::Triple::NetBSD:
3043 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
3044 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00003045 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00003046 default:
3047 return new SparcV8TargetInfo(T);
3048 }
Daniel Dunbar52322032009-08-18 05:47:58 +00003049
John Thompsone467e192009-11-19 17:18:50 +00003050 // FIXME: Need a real SPU target.
3051 case llvm::Triple::cellspu:
3052 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
3053
Daniel Dunbar52322032009-08-18 05:47:58 +00003054 case llvm::Triple::systemz:
3055 return new SystemZTargetInfo(T);
3056
Eli Friedmana9c3d712009-08-19 20:47:07 +00003057 case llvm::Triple::tce:
3058 return new TCETargetInfo(T);
3059
Daniel Dunbar52322032009-08-18 05:47:58 +00003060 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003061 if (Triple.isOSDarwin())
3062 return new DarwinI386TargetInfo(T);
3063
Daniel Dunbar52322032009-08-18 05:47:58 +00003064 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003065 case llvm::Triple::AuroraUX:
3066 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003067 case llvm::Triple::Linux:
3068 return new LinuxTargetInfo<X86_32TargetInfo>(T);
3069 case llvm::Triple::DragonFly:
3070 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
3071 case llvm::Triple::NetBSD:
3072 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
3073 case llvm::Triple::OpenBSD:
3074 return new OpenBSDI386TargetInfo(T);
3075 case llvm::Triple::FreeBSD:
3076 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00003077 case llvm::Triple::Minix:
3078 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003079 case llvm::Triple::Solaris:
3080 return new SolarisTargetInfo<X86_32TargetInfo>(T);
3081 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003082 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003083 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003084 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003085 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003086 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00003087 case llvm::Triple::Haiku:
3088 return new HaikuX86_32TargetInfo(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00003089 case llvm::Triple::RTEMS:
3090 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003091 default:
3092 return new X86_32TargetInfo(T);
3093 }
3094
3095 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003096 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
3097 return new DarwinX86_64TargetInfo(T);
3098
Daniel Dunbar52322032009-08-18 05:47:58 +00003099 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00003100 case llvm::Triple::AuroraUX:
3101 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003102 case llvm::Triple::Linux:
3103 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00003104 case llvm::Triple::DragonFly:
3105 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003106 case llvm::Triple::NetBSD:
3107 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
3108 case llvm::Triple::OpenBSD:
3109 return new OpenBSDX86_64TargetInfo(T);
3110 case llvm::Triple::FreeBSD:
3111 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
3112 case llvm::Triple::Solaris:
3113 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00003114 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003115 return new MinGWX86_64TargetInfo(T);
3116 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00003117 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00003118 default:
3119 return new X86_64TargetInfo(T);
3120 }
3121 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003122}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003123
3124/// CreateTargetInfo - Return the target info object for the specified target
3125/// triple.
3126TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00003127 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003128 llvm::Triple Triple(Opts.Triple);
3129
3130 // Construct the target
3131 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3132 if (!Target) {
3133 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3134 return 0;
3135 }
3136
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003137 // Set the target CPU if specified.
3138 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3139 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3140 return 0;
3141 }
3142
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003143 // Set the target ABI if specified.
3144 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3145 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3146 return 0;
3147 }
3148
Charles Davis95a546e2010-06-11 01:06:47 +00003149 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00003150 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00003151 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3152 return 0;
3153 }
3154
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003155 // Compute the default target features, we need the target to handle this
3156 // because features may have dependencies on one another.
3157 llvm::StringMap<bool> Features;
3158 Target->getDefaultFeatures(Opts.CPU, Features);
3159
3160 // Apply the user specified deltas.
3161 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3162 ie = Opts.Features.end(); it != ie; ++it) {
3163 const char *Name = it->c_str();
3164
3165 // Apply the feature via the target.
3166 if ((Name[0] != '-' && Name[0] != '+') ||
3167 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
3168 Diags.Report(diag::err_target_invalid_feature) << Name;
3169 return 0;
3170 }
3171 }
3172
3173 // Add the features to the compile options.
3174 //
3175 // FIXME: If we are completely confident that we have the right set, we only
3176 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00003177 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003178 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
3179 ie = Features.end(); it != ie; ++it)
Chris Lattnerd386df42011-07-14 18:24:21 +00003180 Opts.Features.push_back(std::string(it->second ? "+" : "-") +
Chris Lattner2dc4b552011-07-14 18:45:41 +00003181 it->first().str());
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00003182 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003183
3184 return Target.take();
3185}