blob: 33113d465c5b71c67c42e6de53cb913ccd13446a [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
Dale Johannesen182addf2010-10-29 23:24:33 +000029#include "llvm/Type.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Chris Lattner5ba61f02006-10-14 07:39:34 +000031using namespace clang;
32
Chris Lattner5ba61f02006-10-14 07:39:34 +000033//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000034// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
36
Chris Lattner1e1c0b92009-03-20 16:06:38 +000037/// DefineStd - Define a macro name and standard variants. For example if
38/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
39/// when in GNU mode.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000040static void DefineStd(MacroBuilder &Builder, llvm::StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041 const LangOptions &Opts) {
42 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000043
Chris Lattner1e1c0b92009-03-20 16:06:38 +000044 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
45 // in the user's namespace.
46 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000047 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000048
Chris Lattner1e1c0b92009-03-20 16:06:38 +000049 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000050 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000051
Chris Lattner1e1c0b92009-03-20 16:06:38 +000052 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054}
55
Chris Lattner09d98f52008-10-05 21:50:58 +000056//===----------------------------------------------------------------------===//
57// Defines specific to certain operating systems.
58//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000059
Torok Edwinb2b37c62009-06-30 17:10:35 +000060namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000061template<typename TgtInfo>
62class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000063protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000064 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000065 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000066public:
Douglas Gregorc05d2a12009-07-01 15:12:53 +000067 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwinb2b37c62009-06-30 17:10:35 +000068 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000069 MacroBuilder &Builder) const {
70 TgtInfo::getTargetDefines(Opts, Builder);
71 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000072 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000073
74};
Chris Lattner859c37a2009-08-12 06:24:27 +000075} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000076
Chris Lattner30ba6742009-08-10 19:03:04 +000077
Daniel Dunbard86666f2010-01-26 01:44:04 +000078static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000079 const llvm::Triple &Triple,
80 llvm::StringRef &PlatformName,
81 VersionTuple &PlatformMinVersion) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 Builder.defineMacro("__APPLE_CC__", "5621");
83 Builder.defineMacro("__APPLE__");
84 Builder.defineMacro("__MACH__");
85 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000086
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
149 // Set the appropriate OS version define.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 if (PlatformName == "ios") {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000151 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000152 char Str[6];
153 Str[0] = '0' + Maj;
154 Str[1] = '0' + (Min / 10);
155 Str[2] = '0' + (Min % 10);
156 Str[3] = '0' + (Rev / 10);
157 Str[4] = '0' + (Rev % 10);
158 Str[5] = '\0';
159 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
160 } else {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000161 // Note that the Driver allows versions which aren't representable in the
162 // define (because we only get a single digit for the minor and micro
163 // revision numbers). So, we limit them to the maximum representable
164 // version.
Daniel Dunbard86666f2010-01-26 01:44:04 +0000165 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000166 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000167 char Str[5];
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000170 Str[2] = '0' + std::min(Min, 9U);
171 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbard86666f2010-01-26 01:44:04 +0000172 Str[4] = '\0';
173 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000174 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000175
176 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000177}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000178
Chris Lattner30ba6742009-08-10 19:03:04 +0000179namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000180template<typename Target>
181class DarwinTargetInfo : public OSTargetInfo<Target> {
182protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000183 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000184 MacroBuilder &Builder) const {
Eric Christopher0c912c52011-07-07 22:55:26 +0000185 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000186 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000187 }
Mike Stump11289f42009-09-09 15:08:12 +0000188
Torok Edwinb2b37c62009-06-30 17:10:35 +0000189public:
190 DarwinTargetInfo(const std::string& triple) :
191 OSTargetInfo<Target>(triple) {
Eric Christopherbf15d2b2011-07-02 00:20:22 +0000192 llvm::Triple T = llvm::Triple(triple);
193 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbar13adc7f2011-02-21 23:12:51 +0000194 this->MCountName = "\01mcount";
Torok Edwinb2b37c62009-06-30 17:10:35 +0000195 }
196
Anders Carlsson0b0a1222010-01-30 18:33:31 +0000197 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000198 // Let MCSectionMachO validate this.
199 llvm::StringRef Segment, Section;
200 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000201 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000202 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000203 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000204 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000205
Anders Carlsson851318a2010-06-08 22:47:50 +0000206 virtual const char *getStaticInitSectionSpecifier() const {
207 // FIXME: We should return 0 when building kexts.
208 return "__TEXT,__StaticInit,regular,pure_instructions";
209 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000210
Torok Edwinb2b37c62009-06-30 17:10:35 +0000211};
212
Chris Lattner30ba6742009-08-10 19:03:04 +0000213
Torok Edwinb2b37c62009-06-30 17:10:35 +0000214// DragonFlyBSD Target
215template<typename Target>
216class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
217protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000218 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000219 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000220 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000221 Builder.defineMacro("__DragonFly__");
222 Builder.defineMacro("__DragonFly_cc_version", "100001");
223 Builder.defineMacro("__ELF__");
224 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
225 Builder.defineMacro("__tune_i386__");
226 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000227 }
228public:
Mike Stump11289f42009-09-09 15:08:12 +0000229 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000230 : OSTargetInfo<Target>(triple) {}
231};
232
233// FreeBSD Target
234template<typename Target>
235class FreeBSDTargetInfo : public OSTargetInfo<Target> {
236protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000237 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000238 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000239 // FreeBSD defines; list based off of gcc output
240
Daniel Dunbar40165182009-08-24 09:10:05 +0000241 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000242 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000244 Builder.defineMacro("__FreeBSD__", Release);
245 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000246 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
247 DefineStd(Builder, "unix", Opts);
248 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000249 }
250public:
Mike Stump11289f42009-09-09 15:08:12 +0000251 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000252 : OSTargetInfo<Target>(triple) {
253 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000254
255 llvm::Triple Triple(triple);
256 switch (Triple.getArch()) {
257 default:
258 case llvm::Triple::x86:
259 case llvm::Triple::x86_64:
260 this->MCountName = ".mcount";
261 break;
262 case llvm::Triple::mips:
263 case llvm::Triple::mipsel:
264 case llvm::Triple::ppc:
265 case llvm::Triple::ppc64:
266 this->MCountName = "_mcount";
267 break;
268 case llvm::Triple::arm:
269 this->MCountName = "__mcount";
270 break;
271 }
272
Duncan Sands9cb27e92009-07-08 13:55:08 +0000273 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000274};
275
Chris Lattner3e2ee142010-07-07 16:01:42 +0000276// Minix Target
277template<typename Target>
278class MinixTargetInfo : public OSTargetInfo<Target> {
279protected:
280 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
281 MacroBuilder &Builder) const {
282 // Minix defines
283
284 Builder.defineMacro("__minix", "3");
285 Builder.defineMacro("_EM_WSIZE", "4");
286 Builder.defineMacro("_EM_PSIZE", "4");
287 Builder.defineMacro("_EM_SSIZE", "2");
288 Builder.defineMacro("_EM_LSIZE", "4");
289 Builder.defineMacro("_EM_FSIZE", "4");
290 Builder.defineMacro("_EM_DSIZE", "8");
291 DefineStd(Builder, "unix", Opts);
292 }
293public:
294 MinixTargetInfo(const std::string &triple)
295 : OSTargetInfo<Target>(triple) {
296 this->UserLabelPrefix = "";
297 }
298};
299
Torok Edwinb2b37c62009-06-30 17:10:35 +0000300// Linux target
301template<typename Target>
302class LinuxTargetInfo : public OSTargetInfo<Target> {
303protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000304 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000305 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000306 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000307 DefineStd(Builder, "unix", Opts);
308 DefineStd(Builder, "linux", Opts);
309 Builder.defineMacro("__gnu_linux__");
310 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000311 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000312 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000313 if (Opts.CPlusPlus)
314 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000315 }
316public:
Mike Stump11289f42009-09-09 15:08:12 +0000317 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000318 : OSTargetInfo<Target>(triple) {
319 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000320 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000321 }
322};
323
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000324// NetBSD Target
325template<typename Target>
326class NetBSDTargetInfo : public OSTargetInfo<Target> {
327protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000328 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000329 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000330 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000331 Builder.defineMacro("__NetBSD__");
332 Builder.defineMacro("__unix__");
333 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000334 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000335 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000336 }
337public:
Mike Stump11289f42009-09-09 15:08:12 +0000338 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000339 : OSTargetInfo<Target>(triple) {
340 this->UserLabelPrefix = "";
341 }
342};
343
Torok Edwinb2b37c62009-06-30 17:10:35 +0000344// OpenBSD Target
345template<typename Target>
346class OpenBSDTargetInfo : public OSTargetInfo<Target> {
347protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000348 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000349 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000350 // OpenBSD defines; list based off of gcc output
351
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000352 Builder.defineMacro("__OpenBSD__");
353 DefineStd(Builder, "unix", Opts);
354 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000355 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000356 Builder.defineMacro("_POSIX_THREADS");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000357 }
358public:
Mike Stump11289f42009-09-09 15:08:12 +0000359 OpenBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000360 : OSTargetInfo<Target>(triple) {}
361};
362
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000363// PSP Target
364template<typename Target>
365class PSPTargetInfo : public OSTargetInfo<Target> {
366protected:
367 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000368 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000369 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000370 Builder.defineMacro("PSP");
371 Builder.defineMacro("_PSP");
372 Builder.defineMacro("__psp__");
373 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000374 }
375public:
376 PSPTargetInfo(const std::string& triple)
377 : OSTargetInfo<Target>(triple) {
378 this->UserLabelPrefix = "";
379 }
380};
381
John Thompsone467e192009-11-19 17:18:50 +0000382// PS3 PPU Target
383template<typename Target>
384class PS3PPUTargetInfo : public OSTargetInfo<Target> {
385protected:
386 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000387 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000388 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000389 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000390 Builder.defineMacro("__PPU__");
391 Builder.defineMacro("__CELLOS_LV2__");
392 Builder.defineMacro("__ELF__");
393 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000394 Builder.defineMacro("_ARCH_PPC64");
395 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000396 }
397public:
398 PS3PPUTargetInfo(const std::string& triple)
399 : OSTargetInfo<Target>(triple) {
400 this->UserLabelPrefix = "";
John Thompson6f8dba72009-12-18 14:21:08 +0000401 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000402 this->IntMaxType = TargetInfo::SignedLongLong;
403 this->UIntMaxType = TargetInfo::UnsignedLongLong;
404 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000405 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000406 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
407 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000408 }
409};
410
411// FIXME: Need a real SPU target.
412// PS3 SPU Target
413template<typename Target>
414class PS3SPUTargetInfo : public OSTargetInfo<Target> {
415protected:
416 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000417 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000418 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000419 Builder.defineMacro("__SPU__");
420 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000421 }
422public:
423 PS3SPUTargetInfo(const std::string& triple)
424 : OSTargetInfo<Target>(triple) {
425 this->UserLabelPrefix = "";
426 }
427};
428
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000429// AuroraUX target
430template<typename Target>
431class AuroraUXTargetInfo : public OSTargetInfo<Target> {
432protected:
433 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000434 MacroBuilder &Builder) const {
435 DefineStd(Builder, "sun", Opts);
436 DefineStd(Builder, "unix", Opts);
437 Builder.defineMacro("__ELF__");
438 Builder.defineMacro("__svr4__");
439 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000440 }
441public:
442 AuroraUXTargetInfo(const std::string& triple)
443 : OSTargetInfo<Target>(triple) {
444 this->UserLabelPrefix = "";
445 this->WCharType = this->SignedLong;
446 // FIXME: WIntType should be SignedLong
447 }
448};
449
Torok Edwinb2b37c62009-06-30 17:10:35 +0000450// Solaris target
451template<typename Target>
452class SolarisTargetInfo : public OSTargetInfo<Target> {
453protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000454 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000455 MacroBuilder &Builder) const {
456 DefineStd(Builder, "sun", Opts);
457 DefineStd(Builder, "unix", Opts);
458 Builder.defineMacro("__ELF__");
459 Builder.defineMacro("__svr4__");
460 Builder.defineMacro("__SVR4");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000461 }
462public:
Mike Stump11289f42009-09-09 15:08:12 +0000463 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000464 : OSTargetInfo<Target>(triple) {
465 this->UserLabelPrefix = "";
466 this->WCharType = this->SignedLong;
467 // FIXME: WIntType should be SignedLong
468 }
469};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000470
471// Windows target
472template<typename Target>
473class WindowsTargetInfo : public OSTargetInfo<Target> {
474protected:
475 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
476 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000477 Builder.defineMacro("_WIN32");
478 }
479 void getVisualStudioDefines(const LangOptions &Opts,
480 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000481 if (Opts.CPlusPlus) {
482 if (Opts.RTTI)
483 Builder.defineMacro("_CPPRTTI");
484
485 if (Opts.Exceptions)
486 Builder.defineMacro("_CPPUNWIND");
487 }
488
489 if (!Opts.CharIsSigned)
490 Builder.defineMacro("_CHAR_UNSIGNED");
491
492 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
493 // but it works for now.
494 if (Opts.POSIXThreads)
495 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000496
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000497 if (Opts.MSCVersion != 0)
498 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
499
500 if (Opts.Microsoft) {
501 Builder.defineMacro("_MSC_EXTENSIONS");
502
503 if (Opts.CPlusPlus0x) {
504 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
505 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
506 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
507 }
508 }
509
510 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000511 }
512
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000513public:
514 WindowsTargetInfo(const std::string &triple)
515 : OSTargetInfo<Target>(triple) {}
516};
517
Mike Stump11289f42009-09-09 15:08:12 +0000518} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000519
Chris Lattner09d98f52008-10-05 21:50:58 +0000520//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000521// Specific target implementations.
522//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000523
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000524namespace {
525// PPC abstract base class
526class PPCTargetInfo : public TargetInfo {
527 static const Builtin::Info BuiltinInfo[];
528 static const char * const GCCRegNames[];
529 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000530public:
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000531 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
532
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000533 virtual void getTargetBuiltins(const Builtin::Info *&Records,
534 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000535 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000536 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000537 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000538
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000539 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000540 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000541
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000542 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000543 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000544 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000545 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000546 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000547 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000548 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000549 default: return false;
550 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000551 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000552 case 'b': // Base register
553 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000554 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000555 break;
556 // FIXME: The following are added to allow parsing.
557 // I just took a guess at what the actions should be.
558 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000559 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000560 case 'v': // Altivec vector register
561 Info.setAllowsRegister();
562 break;
563 case 'w':
564 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000565 case 'd':// VSX vector register to hold vector double data
566 case 'f':// VSX vector register to hold vector float data
567 case 's':// VSX vector register to hold scalar float data
568 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000569 break;
570 default:
571 return false;
572 }
573 Info.setAllowsRegister();
574 Name++; // Skip over 'w'.
575 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000576 case 'h': // `MQ', `CTR', or `LINK' register
577 case 'q': // `MQ' register
578 case 'c': // `CTR' register
579 case 'l': // `LINK' register
580 case 'x': // `CR' register (condition register) number 0
581 case 'y': // `CR' register (condition register)
582 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000583 Info.setAllowsRegister();
584 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000585 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000586 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000587 // (use `L' instead for SImode constants)
588 case 'K': // Unsigned 16-bit constant
589 case 'L': // Signed 16-bit constant shifted left 16 bits
590 case 'M': // Constant larger than 31
591 case 'N': // Exact power of 2
592 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000593 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000594 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000595 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000596 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000597 break;
598 case 'm': // Memory operand. Note that on PowerPC targets, m can
599 // include addresses that update the base register. It
600 // is therefore only safe to use `m' in an asm statement
601 // if that asm statement accesses the operand exactly once.
602 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000603 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000604 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000605 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000606 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000607 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
608 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000609 // register to be updated.
610 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000611 if (Name[1] != 's')
612 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000613 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000614 // include any automodification of the base register. Unlike
615 // `m', this constraint can be used in asm statements that
616 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000617 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000618 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000619 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000620 break;
621 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000622 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000623 case 'Z': // Memory operand that is an indexed or indirect from a
624 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000625 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000626 Info.setAllowsMemory();
627 Info.setAllowsRegister();
628 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000629 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000630 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000631 // register (`p' is preferable for asm statements)
632 case 'S': // Constant suitable as a 64-bit mask operand
633 case 'T': // Constant suitable as a 32-bit mask operand
634 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000635 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000636 // instructions
637 case 'W': // Vector constant that does not require memory
638 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000639 break;
640 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000641 }
John Thompson07a61a42010-06-24 22:44:13 +0000642 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000643 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000644 virtual const char *getClobbers() const {
645 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000646 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000647};
Anders Carlssonf511f642007-11-27 04:11:28 +0000648
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000649const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000650#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000651#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000652 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000653#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000654};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000655
656
Chris Lattnerecd49032009-03-02 22:27:17 +0000657/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
658/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000659void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000660 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000661 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000662 Builder.defineMacro("__ppc__");
663 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000664 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000665 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000666 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000667 Builder.defineMacro("_ARCH_PPC64");
668 Builder.defineMacro("_LP64");
669 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000670 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000671 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000672 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000673 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000674 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000675
Chris Lattnerecd49032009-03-02 22:27:17 +0000676 // Target properties.
Joerg Sonnenberger870b3c52011-07-05 14:56:12 +0000677 if (getTriple().getOS() != llvm::Triple::NetBSD)
678 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000679 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000680
Chris Lattnerecd49032009-03-02 22:27:17 +0000681 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000682 Builder.defineMacro("__NATURAL_ALIGNMENT__");
683 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000684
Chris Lattnerecd49032009-03-02 22:27:17 +0000685 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000686 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000687
John Thompsone467e192009-11-19 17:18:50 +0000688 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000689 Builder.defineMacro("__VEC__", "10206");
690 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000691 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000692}
693
Chris Lattner17df24e2008-04-21 18:56:49 +0000694
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000695const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000696 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
697 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
698 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
699 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
700 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
701 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
702 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
703 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000704 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000705 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000706 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000707 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
708 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
709 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
710 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000711 "vrsave", "vscr",
712 "spe_acc", "spefscr",
713 "sfp"
714};
Chris Lattner10a5b382007-01-29 05:24:35 +0000715
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000716void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000717 unsigned &NumNames) const {
718 Names = GCCRegNames;
719 NumNames = llvm::array_lengthof(GCCRegNames);
720}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000721
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000722const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
723 // While some of these aliases do map to different registers
724 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000725 { { "0" }, "r0" },
726 { { "1"}, "r1" },
727 { { "2" }, "r2" },
728 { { "3" }, "r3" },
729 { { "4" }, "r4" },
730 { { "5" }, "r5" },
731 { { "6" }, "r6" },
732 { { "7" }, "r7" },
733 { { "8" }, "r8" },
734 { { "9" }, "r9" },
735 { { "10" }, "r10" },
736 { { "11" }, "r11" },
737 { { "12" }, "r12" },
738 { { "13" }, "r13" },
739 { { "14" }, "r14" },
740 { { "15" }, "r15" },
741 { { "16" }, "r16" },
742 { { "17" }, "r17" },
743 { { "18" }, "r18" },
744 { { "19" }, "r19" },
745 { { "20" }, "r20" },
746 { { "21" }, "r21" },
747 { { "22" }, "r22" },
748 { { "23" }, "r23" },
749 { { "24" }, "r24" },
750 { { "25" }, "r25" },
751 { { "26" }, "r26" },
752 { { "27" }, "r27" },
753 { { "28" }, "r28" },
754 { { "29" }, "r29" },
755 { { "30" }, "r30" },
756 { { "31" }, "r31" },
757 { { "fr0" }, "f0" },
758 { { "fr1" }, "f1" },
759 { { "fr2" }, "f2" },
760 { { "fr3" }, "f3" },
761 { { "fr4" }, "f4" },
762 { { "fr5" }, "f5" },
763 { { "fr6" }, "f6" },
764 { { "fr7" }, "f7" },
765 { { "fr8" }, "f8" },
766 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000767 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000768 { { "fr11" }, "f11" },
769 { { "fr12" }, "f12" },
770 { { "fr13" }, "f13" },
771 { { "fr14" }, "f14" },
772 { { "fr15" }, "f15" },
773 { { "fr16" }, "f16" },
774 { { "fr17" }, "f17" },
775 { { "fr18" }, "f18" },
776 { { "fr19" }, "f19" },
777 { { "fr20" }, "f20" },
778 { { "fr21" }, "f21" },
779 { { "fr22" }, "f22" },
780 { { "fr23" }, "f23" },
781 { { "fr24" }, "f24" },
782 { { "fr25" }, "f25" },
783 { { "fr26" }, "f26" },
784 { { "fr27" }, "f27" },
785 { { "fr28" }, "f28" },
786 { { "fr29" }, "f29" },
787 { { "fr30" }, "f30" },
788 { { "fr31" }, "f31" },
789 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000790};
791
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000792void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000793 unsigned &NumAliases) const {
794 Aliases = GCCRegAliases;
795 NumAliases = llvm::array_lengthof(GCCRegAliases);
796}
797} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000798
Chris Lattner5ba61f02006-10-14 07:39:34 +0000799namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000800class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000801public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000802 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000803 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 +0000804 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000805
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +0000806 switch (getTriple().getOS()) {
807 case llvm::Triple::FreeBSD:
808 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +0000809 SizeType = UnsignedInt;
810 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +0000811 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +0000812 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +0000813 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000814 }
815
816 virtual const char *getVAListDeclaration() const {
817 // This is the ELF definition, and is overridden by the Darwin sub-target
818 return "typedef struct __va_list_tag {"
819 " unsigned char gpr;"
820 " unsigned char fpr;"
821 " unsigned short reserved;"
822 " void* overflow_arg_area;"
823 " void* reg_save_area;"
824 "} __builtin_va_list[1];";
Eli Friedman873f65a2008-08-21 00:13:15 +0000825 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000826};
827} // end anonymous namespace.
828
829namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000830class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000831public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000832 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000833 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000834 IntMaxType = SignedLong;
835 UIntMaxType = UnsignedLong;
836 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000837 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 +0000838 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000839 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000840 virtual const char *getVAListDeclaration() const {
841 return "typedef char* __builtin_va_list;";
842 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000843};
844} // end anonymous namespace.
845
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000846
847namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +0000848class DarwinPPC32TargetInfo :
849 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000850public:
Roman Divacky965b0b72011-01-06 08:27:10 +0000851 DarwinPPC32TargetInfo(const std::string& triple)
852 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000853 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +0000854 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
855 }
856 virtual const char *getVAListDeclaration() const {
857 return "typedef char* __builtin_va_list;";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000858 }
859};
860
861class DarwinPPC64TargetInfo :
862 public DarwinTargetInfo<PPC64TargetInfo> {
863public:
864 DarwinPPC64TargetInfo(const std::string& triple)
865 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
866 HasAlignMac68kSupport = true;
867 }
868};
869} // end anonymous namespace.
870
Chris Lattner5ba61f02006-10-14 07:39:34 +0000871namespace {
Justin Holewinski514cce82011-04-20 19:34:15 +0000872 class PTXTargetInfo : public TargetInfo {
873 static const char * const GCCRegNames[];
874 static const Builtin::Info BuiltinInfo[];
875 public:
876 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
877 TLSSupported = false;
878 LongWidth = LongAlign = 64;
879 }
880 virtual void getTargetDefines(const LangOptions &Opts,
881 MacroBuilder &Builder) const {
882 Builder.defineMacro("__PTX__");
883 }
884 virtual void getTargetBuiltins(const Builtin::Info *&Records,
885 unsigned &NumRecords) const {
886 Records = BuiltinInfo;
887 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
888 }
889
890 virtual void getGCCRegNames(const char * const *&Names,
891 unsigned &NumNames) const;
892 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
893 unsigned &NumAliases) const {
894 // No aliases.
895 Aliases = 0;
896 NumAliases = 0;
897 }
898 virtual bool validateAsmConstraint(const char *&Name,
899 TargetInfo::ConstraintInfo &info) const {
900 // FIXME: implement
901 return true;
902 }
903 virtual const char *getClobbers() const {
904 // FIXME: Is this really right?
905 return "";
906 }
907 virtual const char *getVAListDeclaration() const {
908 // FIXME: implement
909 return "typedef char* __builtin_va_list;";
910 }
911 };
912
913 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000914#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski514cce82011-04-20 19:34:15 +0000915#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000916 ALL_LANGUAGES },
Justin Holewinski514cce82011-04-20 19:34:15 +0000917#include "clang/Basic/BuiltinsPTX.def"
918 };
919
920 const char * const PTXTargetInfo::GCCRegNames[] = {
921 "r0"
922 };
923
924 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
925 unsigned &NumNames) const {
926 Names = GCCRegNames;
927 NumNames = llvm::array_lengthof(GCCRegNames);
928 }
929
930
931 class PTX32TargetInfo : public PTXTargetInfo {
932 public:
933 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
934 PointerWidth = PointerAlign = 32;
935 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
936 DescriptionString
937 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
938 }
939 };
940
941 class PTX64TargetInfo : public PTXTargetInfo {
942 public:
943 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
944 PointerWidth = PointerAlign = 64;
945 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
946 DescriptionString
947 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
948 }
949 };
950}
951
952namespace {
Chris Lattner5178f562010-03-06 21:21:27 +0000953// MBlaze abstract base class
954class MBlazeTargetInfo : public TargetInfo {
955 static const char * const GCCRegNames[];
956 static const TargetInfo::GCCRegAlias GCCRegAliases[];
957
958public:
959 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +0000960 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +0000961 }
962
963 virtual void getTargetBuiltins(const Builtin::Info *&Records,
964 unsigned &NumRecords) const {
965 // FIXME: Implement.
966 Records = 0;
967 NumRecords = 0;
968 }
969
970 virtual void getTargetDefines(const LangOptions &Opts,
971 MacroBuilder &Builder) const;
972
973 virtual const char *getVAListDeclaration() const {
974 return "typedef char* __builtin_va_list;";
975 }
976 virtual const char *getTargetPrefix() const {
977 return "mblaze";
978 }
979 virtual void getGCCRegNames(const char * const *&Names,
980 unsigned &NumNames) const;
981 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
982 unsigned &NumAliases) const;
983 virtual bool validateAsmConstraint(const char *&Name,
984 TargetInfo::ConstraintInfo &Info) const {
985 switch (*Name) {
986 default: return false;
987 case 'O': // Zero
988 return true;
989 case 'b': // Base register
990 case 'f': // Floating point register
991 Info.setAllowsRegister();
992 return true;
993 }
994 }
995 virtual const char *getClobbers() const {
996 return "";
997 }
998};
999
1000/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1001/// #defines that are not tied to a specific subtarget.
1002void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1003 MacroBuilder &Builder) const {
1004 // Target identification.
1005 Builder.defineMacro("__microblaze__");
1006 Builder.defineMacro("_ARCH_MICROBLAZE");
1007 Builder.defineMacro("__MICROBLAZE__");
1008
1009 // Target properties.
1010 Builder.defineMacro("_BIG_ENDIAN");
1011 Builder.defineMacro("__BIG_ENDIAN__");
1012
1013 // Subtarget options.
1014 Builder.defineMacro("__REGISTER_PREFIX__", "");
1015}
1016
1017
1018const char * const MBlazeTargetInfo::GCCRegNames[] = {
1019 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1020 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1021 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1022 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1023 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1024 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1025 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1026 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1027 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1028 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1029};
1030
1031void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1032 unsigned &NumNames) const {
1033 Names = GCCRegNames;
1034 NumNames = llvm::array_lengthof(GCCRegNames);
1035}
1036
1037const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1038 { {"f0"}, "r0" },
1039 { {"f1"}, "r1" },
1040 { {"f2"}, "r2" },
1041 { {"f3"}, "r3" },
1042 { {"f4"}, "r4" },
1043 { {"f5"}, "r5" },
1044 { {"f6"}, "r6" },
1045 { {"f7"}, "r7" },
1046 { {"f8"}, "r8" },
1047 { {"f9"}, "r9" },
1048 { {"f10"}, "r10" },
1049 { {"f11"}, "r11" },
1050 { {"f12"}, "r12" },
1051 { {"f13"}, "r13" },
1052 { {"f14"}, "r14" },
1053 { {"f15"}, "r15" },
1054 { {"f16"}, "r16" },
1055 { {"f17"}, "r17" },
1056 { {"f18"}, "r18" },
1057 { {"f19"}, "r19" },
1058 { {"f20"}, "r20" },
1059 { {"f21"}, "r21" },
1060 { {"f22"}, "r22" },
1061 { {"f23"}, "r23" },
1062 { {"f24"}, "r24" },
1063 { {"f25"}, "r25" },
1064 { {"f26"}, "r26" },
1065 { {"f27"}, "r27" },
1066 { {"f28"}, "r28" },
1067 { {"f29"}, "r29" },
1068 { {"f30"}, "r30" },
1069 { {"f31"}, "r31" },
1070};
1071
1072void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1073 unsigned &NumAliases) const {
1074 Aliases = GCCRegAliases;
1075 NumAliases = llvm::array_lengthof(GCCRegAliases);
1076}
1077} // end anonymous namespace.
1078
1079namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001080// Namespace for x86 abstract base class
1081const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001082#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001083#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001084 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001085#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001086};
Eli Friedmanb5366062008-05-20 14:21:01 +00001087
Nuno Lopescfca1f02009-12-23 17:49:57 +00001088static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001089 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1090 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001091 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001092 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1093 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1094 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001095 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001096};
1097
Eric Christophercdd36352011-06-21 00:05:20 +00001098const TargetInfo::AddlRegName AddlRegNames[] = {
1099 { { "al", "ah", "eax", "rax" }, 0 },
1100 { { "bl", "bh", "ebx", "rbx" }, 3 },
1101 { { "cl", "ch", "ecx", "rcx" }, 2 },
1102 { { "dl", "dh", "edx", "rdx" }, 1 },
1103 { { "esi", "rsi" }, 4 },
1104 { { "edi", "rdi" }, 5 },
1105 { { "esp", "rsp" }, 7 },
1106 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001107};
1108
1109// X86 target abstract base class; x86-32 and x86-64 are very close, so
1110// most of the implementation can be shared.
1111class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001112 enum X86SSEEnum {
Eli Friedman33465822011-07-08 23:31:17 +00001113 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
Chris Lattner96e43572009-03-02 22:40:39 +00001114 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001115 enum MMX3DNowEnum {
1116 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1117 } MMX3DNowLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001118
Eric Christophere1ddaf92010-04-02 23:50:19 +00001119 bool HasAES;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001120 bool HasAVX;
1121
Eli Friedman3fd920a2008-08-20 02:34:37 +00001122public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001123 X86TargetInfo(const std::string& triple)
Eli Friedman33465822011-07-08 23:31:17 +00001124 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001125 HasAES(false), HasAVX(false) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001126 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001127 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001128 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1129 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001130 Records = BuiltinInfo;
1131 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001132 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001133 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001134 unsigned &NumNames) const {
1135 Names = GCCRegNames;
1136 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001137 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001138 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001139 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001140 Aliases = 0;
1141 NumAliases = 0;
1142 }
1143 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1144 unsigned &NumNames) const {
1145 Names = AddlRegNames;
1146 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001147 }
Anders Carlsson58436352009-02-28 17:11:49 +00001148 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001149 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001150 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001151 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001152 return "~{dirflag},~{fpsr},~{flags}";
1153 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001154 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001155 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001156 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1157 const std::string &Name,
1158 bool Enabled) const;
Mike Stump11289f42009-09-09 15:08:12 +00001159 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001160 llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001161 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedman33465822011-07-08 23:31:17 +00001162 virtual const char* getABI() const {
1163 return MMX3DNowLevel == NoMMX3DNow ? "no-mmx" : "";
1164 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001165};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001166
Mike Stump11289f42009-09-09 15:08:12 +00001167void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001168 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001169 // FIXME: This should not be here.
1170 Features["3dnow"] = false;
1171 Features["3dnowa"] = false;
1172 Features["mmx"] = false;
1173 Features["sse"] = false;
1174 Features["sse2"] = false;
1175 Features["sse3"] = false;
1176 Features["ssse3"] = false;
1177 Features["sse41"] = false;
1178 Features["sse42"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001179 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001180 Features["avx"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001181
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001182 // LLVM does not currently recognize this.
1183 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001184
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001185 // FIXME: This *really* should not be here.
1186
1187 // X86_64 always has SSE2.
1188 if (PointerWidth == 64)
1189 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1190
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001191 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1192 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1193 ;
1194 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1195 setFeatureEnabled(Features, "mmx", true);
Eli Friedman33465822011-07-08 23:31:17 +00001196 else if (CPU == "pentium3") {
1197 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001198 setFeatureEnabled(Features, "sse", true);
Eli Friedman33465822011-07-08 23:31:17 +00001199 } else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64") {
1200 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001201 setFeatureEnabled(Features, "sse2", true);
Eli Friedman33465822011-07-08 23:31:17 +00001202 } else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona") {
1203 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001204 setFeatureEnabled(Features, "sse3", true);
Eli Friedman33465822011-07-08 23:31:17 +00001205 } else if (CPU == "core2") {
1206 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001207 setFeatureEnabled(Features, "ssse3", true);
Eli Friedman33465822011-07-08 23:31:17 +00001208 } else if (CPU == "penryn") {
1209 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001210 setFeatureEnabled(Features, "sse4", true);
1211 Features["sse42"] = false;
Eli Friedman33465822011-07-08 23:31:17 +00001212 } else if (CPU == "atom") {
1213 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001214 setFeatureEnabled(Features, "sse3", true);
Eli Friedman33465822011-07-08 23:31:17 +00001215 } else if (CPU == "corei7") {
1216 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001217 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001218 setFeatureEnabled(Features, "aes", true);
Benjamin Kramer85e16642011-05-20 15:11:23 +00001219 } else if (CPU == "corei7-avx") {
Eli Friedman33465822011-07-08 23:31:17 +00001220 setFeatureEnabled(Features, "mmx", true);
Roman Divacky27ec14f2011-04-05 20:32:44 +00001221 setFeatureEnabled(Features, "sse4", true);
1222 setFeatureEnabled(Features, "aes", true);
1223// setFeatureEnabled(Features, "avx", true);
1224 } else if (CPU == "k6" || CPU == "winchip-c6")
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001225 setFeatureEnabled(Features, "mmx", true);
Mike Stump11289f42009-09-09 15:08:12 +00001226 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001227 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001228 setFeatureEnabled(Features, "3dnow", true);
1229 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1230 setFeatureEnabled(Features, "sse", true);
1231 setFeatureEnabled(Features, "3dnowa", true);
1232 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1233 CPU == "athlon-fx") {
Mike Stump11289f42009-09-09 15:08:12 +00001234 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001235 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001236 } else if (CPU == "k8-sse3") {
1237 setFeatureEnabled(Features, "sse3", true);
1238 setFeatureEnabled(Features, "3dnowa", true);
Eli Friedman33465822011-07-08 23:31:17 +00001239 } else if (CPU == "c3-2") {
1240 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001241 setFeatureEnabled(Features, "sse", true);
Eli Friedman33465822011-07-08 23:31:17 +00001242 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001243}
1244
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001245bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001246 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001247 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001248 // FIXME: This *really* should not be here. We need some way of translating
1249 // options into llvm subtarget features.
1250 if (!Features.count(Name) &&
1251 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001252 return false;
1253
1254 if (Enabled) {
1255 if (Name == "mmx")
1256 Features["mmx"] = true;
1257 else if (Name == "sse")
Eli Friedman33465822011-07-08 23:31:17 +00001258 Features["sse"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001259 else if (Name == "sse2")
Eli Friedman33465822011-07-08 23:31:17 +00001260 Features["sse"] = Features["sse2"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001261 else if (Name == "sse3")
Eli Friedman33465822011-07-08 23:31:17 +00001262 Features["sse"] = Features["sse2"] = Features["sse3"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001263 else if (Name == "ssse3")
Eli Friedman33465822011-07-08 23:31:17 +00001264 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001265 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001266 else if (Name == "sse4" || Name == "sse4.2")
Eli Friedman33465822011-07-08 23:31:17 +00001267 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001268 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001269 else if (Name == "sse4.1")
Eli Friedman33465822011-07-08 23:31:17 +00001270 Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopher399ffa52010-03-04 02:26:37 +00001271 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001272 else if (Name == "3dnow")
Eli Friedman33465822011-07-08 23:31:17 +00001273 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001274 else if (Name == "3dnowa")
Eli Friedman33465822011-07-08 23:31:17 +00001275 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001276 else if (Name == "aes")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001277 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001278 else if (Name == "avx")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001279 Features["avx"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001280 } else {
1281 if (Name == "mmx")
Eli Friedman33465822011-07-08 23:31:17 +00001282 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001283 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001284 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001285 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001286 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001287 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001288 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001289 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001290 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001291 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001292 else if (Name == "ssse3")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001293 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencera9e41172011-04-17 19:22:03 +00001294 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001295 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001296 else if (Name == "sse4.2")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001297 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001298 else if (Name == "3dnow")
1299 Features["3dnow"] = Features["3dnowa"] = false;
1300 else if (Name == "3dnowa")
1301 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001302 else if (Name == "aes")
1303 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001304 else if (Name == "avx")
1305 Features["avx"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001306 }
1307
1308 return true;
1309}
1310
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001311/// HandleTargetOptions - Perform initialization based on the user
1312/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001313void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001314 // Remember the maximum enabled sselevel.
1315 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1316 // Ignore disabled features.
1317 if (Features[i][0] == '-')
1318 continue;
1319
Eric Christophere1ddaf92010-04-02 23:50:19 +00001320 if (Features[i].substr(1) == "aes") {
1321 HasAES = true;
1322 continue;
1323 }
1324
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001325 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1326 // For now let it be enabled together with other SSE levels.
1327 if (Features[i].substr(1) == "avx") {
1328 HasAVX = true;
1329 continue;
1330 }
1331
Daniel Dunbar979586e2009-11-11 09:38:56 +00001332 assert(Features[i][0] == '+' && "Invalid target feature!");
1333 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1334 .Case("sse42", SSE42)
1335 .Case("sse41", SSE41)
1336 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001337 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001338 .Case("sse2", SSE2)
1339 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00001340 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001341 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001342
Eli Friedman33465822011-07-08 23:31:17 +00001343 MMX3DNowEnum ThreeDNowLevel =
1344 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
Anders Carlssone437c682010-01-27 03:47:49 +00001345 .Case("3dnowa", AMD3DNowAthlon)
1346 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00001347 .Case("mmx", MMX)
1348 .Default(NoMMX3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001349
Eli Friedman33465822011-07-08 23:31:17 +00001350 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001351 }
Eli Friedman33465822011-07-08 23:31:17 +00001352
1353 // Don't tell the backend if we're turning off mmx; it will end up disabling
1354 // SSE, which we don't want.
1355 std::vector<std::string>::iterator it;
1356 it = std::find(Features.begin(), Features.end(), "-mmx");
1357 if (it != Features.end())
1358 Features.erase(it);
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001359}
Chris Lattnerecd49032009-03-02 22:27:17 +00001360
1361/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1362/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001363void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001364 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001365 // Target identification.
1366 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001367 Builder.defineMacro("_LP64");
1368 Builder.defineMacro("__LP64__");
1369 Builder.defineMacro("__amd64__");
1370 Builder.defineMacro("__amd64");
1371 Builder.defineMacro("__x86_64");
1372 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001373 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001374 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001375 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001376
Eric Christophere1ddaf92010-04-02 23:50:19 +00001377 if (HasAES)
1378 Builder.defineMacro("__AES__");
1379
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001380 if (HasAVX)
1381 Builder.defineMacro("__AVX__");
1382
Chris Lattnerecd49032009-03-02 22:27:17 +00001383 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001384 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001385
Chris Lattnerecd49032009-03-02 22:27:17 +00001386 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001387 Builder.defineMacro("__nocona");
1388 Builder.defineMacro("__nocona__");
1389 Builder.defineMacro("__tune_nocona__");
1390 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +00001391
Chris Lattner6df41af2009-04-19 17:32:33 +00001392 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1393 // functions in glibc header files that use FP Stack inline asm which the
1394 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001395 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001396
Chris Lattner96e43572009-03-02 22:40:39 +00001397 // Each case falls through to the previous one here.
1398 switch (SSELevel) {
1399 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001400 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00001401 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001402 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00001403 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001404 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001405 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001406 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001407 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001408 Builder.defineMacro("__SSE2__");
1409 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001410 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001411 Builder.defineMacro("__SSE__");
1412 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00001413 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00001414 break;
1415 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001416
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001417 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001418 switch (SSELevel) {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001419 case SSE42:
1420 case SSE41:
1421 case SSSE3:
1422 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001423 case SSE2:
1424 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1425 break;
1426 case SSE1:
1427 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1428 break;
1429 default:
1430 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1431 }
1432 }
1433
Anders Carlssone437c682010-01-27 03:47:49 +00001434 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00001435 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00001436 case AMD3DNowAthlon:
1437 Builder.defineMacro("__3dNOW_A__");
1438 case AMD3DNow:
1439 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00001440 case MMX:
1441 Builder.defineMacro("__MMX__");
1442 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00001443 break;
1444 }
Chris Lattnerecd49032009-03-02 22:27:17 +00001445}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001446
1447
Eli Friedman3fd920a2008-08-20 02:34:37 +00001448bool
Anders Carlsson58436352009-02-28 17:11:49 +00001449X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001450 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00001451 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001452 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00001453 case 'Y': // first letter of a pair:
1454 switch (*(Name+1)) {
1455 default: return false;
1456 case '0': // First SSE register.
1457 case 't': // Any SSE register, when SSE2 is enabled.
1458 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1459 case 'm': // any MMX register, when inter-unit moves enabled.
1460 break; // falls through to setAllowsRegister.
1461 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001462 case 'a': // eax.
1463 case 'b': // ebx.
1464 case 'c': // ecx.
1465 case 'd': // edx.
1466 case 'S': // esi.
1467 case 'D': // edi.
1468 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00001469 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001470 case 't': // top of floating point stack.
1471 case 'u': // second from top of floating point stack.
1472 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00001473 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00001474 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001475 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00001476 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1477 case 'l': // "Index" registers: any general register that can be used as an
1478 // index in a base+index memory access.
1479 Info.setAllowsRegister();
1480 return true;
1481 case 'C': // SSE floating point constant.
1482 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001483 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001484 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001485 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001486 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001487 return true;
1488 }
Dale Johannesen46742a42010-08-24 22:33:12 +00001489 return false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001490}
1491
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00001492
Eli Friedman3fd920a2008-08-20 02:34:37 +00001493std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001494X86TargetInfo::convertConstraint(const char *&Constraint) const {
1495 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001496 case 'a': return std::string("{ax}");
1497 case 'b': return std::string("{bx}");
1498 case 'c': return std::string("{cx}");
1499 case 'd': return std::string("{dx}");
1500 case 'S': return std::string("{si}");
1501 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00001502 case 'p': // address
1503 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00001504 case 't': // top of floating point stack.
1505 return std::string("{st}");
1506 case 'u': // second from top of floating point stack.
1507 return std::string("{st(1)}"); // second from top of floating point stack.
1508 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001509 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00001510 }
1511}
Eli Friedman3fd920a2008-08-20 02:34:37 +00001512} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00001513
1514namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001515// X86-32 generic target
1516class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001517public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00001518 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1519 DoubleAlign = LongLongAlign = 32;
1520 LongDoubleWidth = 96;
1521 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +00001522 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1523 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001524 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +00001525 SizeType = UnsignedInt;
1526 PtrDiffType = SignedInt;
1527 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001528 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001529
1530 // Use fpret for all types.
1531 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1532 (1 << TargetInfo::Double) |
1533 (1 << TargetInfo::LongDouble));
Eli Friedman3fd920a2008-08-20 02:34:37 +00001534 }
1535 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001536 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00001537 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001538
Chris Lattnerd545ad12009-09-23 06:06:36 +00001539 int getEHDataRegisterNumber(unsigned RegNo) const {
1540 if (RegNo == 0) return 0;
1541 if (RegNo == 1) return 2;
1542 return -1;
1543 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001544};
1545} // end anonymous namespace
1546
1547namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00001548class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1549public:
1550 OpenBSDI386TargetInfo(const std::string& triple) :
1551 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1552 SizeType = UnsignedLong;
1553 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00001554 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00001555 }
1556};
1557} // end anonymous namespace
1558
1559namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00001560class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001561public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00001562 DarwinI386TargetInfo(const std::string& triple) :
1563 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001564 LongDoubleWidth = 128;
1565 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00001566 SizeType = UnsignedLong;
1567 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00001568 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1569 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001570 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbarbd606522010-05-27 00:35:16 +00001571 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00001572 }
1573
Eli Friedman3fd920a2008-08-20 02:34:37 +00001574};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00001575} // end anonymous namespace
1576
1577namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001578// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001579class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001580public:
1581 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001582 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001583 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00001584 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00001585 DoubleAlign = LongLongAlign = 64;
1586 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 +00001587 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1588 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001589 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001590 virtual void getTargetDefines(const LangOptions &Opts,
1591 MacroBuilder &Builder) const {
1592 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1593 }
1594};
1595} // end anonymous namespace
1596
1597namespace {
1598
1599// x86-32 Windows Visual Studio target
1600class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1601public:
1602 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1603 : WindowsX86_32TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00001604 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001605 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1606 }
1607 virtual void getTargetDefines(const LangOptions &Opts,
1608 MacroBuilder &Builder) const {
1609 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1610 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1611 // The value of the following reflects processor type.
1612 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1613 // We lost the original triple, so we use the default.
1614 Builder.defineMacro("_M_IX86", "600");
1615 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001616};
1617} // end anonymous namespace
1618
1619namespace {
1620// x86-32 MinGW target
1621class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1622public:
1623 MinGWX86_32TargetInfo(const std::string& triple)
1624 : WindowsX86_32TargetInfo(triple) {
1625 }
1626 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001627 MacroBuilder &Builder) const {
1628 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001629 DefineStd(Builder, "WIN32", Opts);
1630 DefineStd(Builder, "WINNT", Opts);
1631 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001632 Builder.defineMacro("__MSVCRT__");
1633 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001634
1635 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1636 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1637 if (Opts.Microsoft)
1638 // Provide "as-is" __declspec.
1639 Builder.defineMacro("__declspec", "__declspec");
1640 else
1641 // Provide alias of __attribute__ like mingw32-gcc.
1642 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001643 }
1644};
1645} // end anonymous namespace
1646
1647namespace {
1648// x86-32 Cygwin target
1649class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1650public:
1651 CygwinX86_32TargetInfo(const std::string& triple)
1652 : X86_32TargetInfo(triple) {
1653 TLSSupported = false;
1654 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001655 DoubleAlign = LongLongAlign = 64;
1656 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1657 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001658 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001659 }
1660 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001661 MacroBuilder &Builder) const {
1662 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1663 Builder.defineMacro("__CYGWIN__");
1664 Builder.defineMacro("__CYGWIN32__");
1665 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00001666 if (Opts.CPlusPlus)
1667 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00001668 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001669};
1670} // end anonymous namespace
1671
1672namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00001673// x86-32 Haiku target
1674class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1675public:
1676 HaikuX86_32TargetInfo(const std::string& triple)
1677 : X86_32TargetInfo(triple) {
1678 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00001679 IntPtrType = SignedLong;
1680 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00001681 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00001682 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00001683 virtual void getTargetDefines(const LangOptions &Opts,
1684 MacroBuilder &Builder) const {
1685 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1686 Builder.defineMacro("__INTEL__");
1687 Builder.defineMacro("__HAIKU__");
1688 }
1689};
1690} // end anonymous namespace
1691
Douglas Gregor9fabd852011-07-01 22:41:14 +00001692// RTEMS Target
1693template<typename Target>
1694class RTEMSTargetInfo : public OSTargetInfo<Target> {
1695protected:
1696 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1697 MacroBuilder &Builder) const {
1698 // RTEMS defines; list based off of gcc output
1699
1700 // FIXME: Move version number handling to llvm::Triple.
1701 llvm::StringRef Release = Triple.getOSName().substr(strlen("rtems"), 1);
1702
1703 Builder.defineMacro("__rtems__");
1704 Builder.defineMacro("__ELF__");
1705 }
1706public:
1707 RTEMSTargetInfo(const std::string &triple)
1708 : OSTargetInfo<Target>(triple) {
1709 this->UserLabelPrefix = "";
1710
1711 llvm::Triple Triple(triple);
1712 switch (Triple.getArch()) {
1713 default:
1714 case llvm::Triple::x86:
1715 // this->MCountName = ".mcount";
1716 break;
1717 case llvm::Triple::mips:
1718 case llvm::Triple::mipsel:
1719 case llvm::Triple::ppc:
1720 case llvm::Triple::ppc64:
1721 // this->MCountName = "_mcount";
1722 break;
1723 case llvm::Triple::arm:
1724 // this->MCountName = "__mcount";
1725 break;
1726 }
1727
1728 }
1729};
1730
1731namespace {
1732// x86-32 RTEMS target
1733class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
1734public:
1735 RTEMSX86_32TargetInfo(const std::string& triple)
1736 : X86_32TargetInfo(triple) {
1737 SizeType = UnsignedLong;
1738 IntPtrType = SignedLong;
1739 PtrDiffType = SignedLong;
1740 this->UserLabelPrefix = "";
1741 }
1742 virtual void getTargetDefines(const LangOptions &Opts,
1743 MacroBuilder &Builder) const {
1744 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1745 Builder.defineMacro("__INTEL__");
1746 Builder.defineMacro("__rtems__");
1747 }
1748};
1749} // end anonymous namespace
1750
Chris Lattnerb986aba2010-04-11 19:29:39 +00001751namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001752// x86-64 generic target
1753class X86_64TargetInfo : public X86TargetInfo {
1754public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001755 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001756 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00001757 LongDoubleWidth = 128;
1758 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00001759 LargeArrayMinWidth = 128;
1760 LargeArrayAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001761 IntMaxType = SignedLong;
1762 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001763 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001764 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001765
Eli Friedman873f65a2008-08-21 00:13:15 +00001766 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1767 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001768 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001769
1770 // Use fpret only for long double.
1771 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Chris Lattner10a5b382007-01-29 05:24:35 +00001772 }
Anders Carlssona7408e72007-10-13 00:45:48 +00001773 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001774 return "typedef struct __va_list_tag {"
1775 " unsigned gp_offset;"
1776 " unsigned fp_offset;"
1777 " void* overflow_arg_area;"
1778 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00001779 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00001780 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001781 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001782
Chris Lattnerd545ad12009-09-23 06:06:36 +00001783 int getEHDataRegisterNumber(unsigned RegNo) const {
1784 if (RegNo == 0) return 0;
1785 if (RegNo == 1) return 1;
1786 return -1;
1787 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001788};
1789} // end anonymous namespace
1790
1791namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001792// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001793class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001794public:
1795 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001796 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001797 TLSSupported = false;
1798 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00001799 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001800 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00001801 IntMaxType = SignedLongLong;
1802 UIntMaxType = UnsignedLongLong;
1803 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00001804 SizeType = UnsignedLongLong;
1805 PtrDiffType = SignedLongLong;
1806 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00001807 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001808 }
1809 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001810 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001811 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001812 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001813 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00001814 virtual const char *getVAListDeclaration() const {
1815 return "typedef char* __builtin_va_list;";
1816 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001817};
1818} // end anonymous namespace
1819
1820namespace {
1821// x86-64 Windows Visual Studio target
1822class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1823public:
1824 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1825 : WindowsX86_64TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00001826 LongDoubleWidth = LongDoubleAlign = 64;
1827 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001828 }
1829 virtual void getTargetDefines(const LangOptions &Opts,
1830 MacroBuilder &Builder) const {
1831 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1832 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001833 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001834 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001835 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001836};
1837} // end anonymous namespace
1838
1839namespace {
1840// x86-64 MinGW target
1841class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1842public:
1843 MinGWX86_64TargetInfo(const std::string& triple)
1844 : WindowsX86_64TargetInfo(triple) {
1845 }
1846 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001847 MacroBuilder &Builder) const {
1848 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001849 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001850 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00001851 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001852 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001853
1854 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1855 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1856 if (Opts.Microsoft)
1857 // Provide "as-is" __declspec.
1858 Builder.defineMacro("__declspec", "__declspec");
1859 else
1860 // Provide alias of __attribute__ like mingw32-gcc.
1861 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001862 }
1863};
1864} // end anonymous namespace
1865
1866namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00001867class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1868public:
Mike Stump11289f42009-09-09 15:08:12 +00001869 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00001870 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1871 Int64Type = SignedLongLong;
1872 }
1873};
1874} // end anonymous namespace
1875
1876namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00001877class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1878public:
Mike Stump11289f42009-09-09 15:08:12 +00001879 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00001880 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1881 IntMaxType = SignedLongLong;
1882 UIntMaxType = UnsignedLongLong;
1883 Int64Type = SignedLongLong;
1884 }
1885};
1886} // end anonymous namespace
1887
1888namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001889class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001890 // Possible FPU choices.
1891 enum FPUMode {
1892 NoFPU,
1893 VFP2FPU,
1894 VFP3FPU,
1895 NeonFPU
1896 };
1897
1898 static bool FPUModeIsVFP(FPUMode Mode) {
1899 return Mode >= VFP2FPU && Mode <= NeonFPU;
1900 }
1901
1902 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1903 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001904
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001905 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001906
1907 unsigned FPU : 3;
1908
Daniel Dunbar893d4752009-12-19 04:15:38 +00001909 unsigned IsThumb : 1;
1910
1911 // Initialized via features.
1912 unsigned SoftFloat : 1;
1913 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001914
Chris Lattner5cc15e02010-03-03 19:03:45 +00001915 static const Builtin::Info BuiltinInfo[];
1916
Chris Lattner17df24e2008-04-21 18:56:49 +00001917public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001918 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001919 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001920 {
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001921 SizeType = UnsignedInt;
1922 PtrDiffType = SignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001923
Chris Lattner1a8f3942010-04-23 16:29:58 +00001924 // {} in inline assembly are neon specifiers, not assembly variant
1925 // specifiers.
1926 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001927
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001928 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00001929 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00001930 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00001931 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1932 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00001933 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1934 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001935 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001936 } else {
1937 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1938 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001939 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001940 }
John McCall86353412010-08-21 22:46:04 +00001941
1942 // ARM targets default to using the ARM C++ ABI.
1943 CXXABI = CXXABI_ARM;
Eli Friedmanb5366062008-05-20 14:21:01 +00001944 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001945 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001946 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001947 ABI = Name;
1948
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001949 // The defaults (above) are for AAPCS, check if we need to change them.
1950 //
1951 // FIXME: We need support for -meabi... we could just mangle it into the
1952 // name.
1953 if (Name == "apcs-gnu") {
Daniel Dunbar377dc2f2010-01-27 20:23:08 +00001954 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001955 SizeType = UnsignedLong;
1956
Daniel Dunbarf8125062010-04-22 16:14:54 +00001957 // Do not respect the alignment of bit-field types when laying out
1958 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1959 UseBitFieldTypeAlignment = false;
1960
Daniel Dunbar03184792009-09-22 21:44:58 +00001961 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00001962 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1963 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00001964 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 +00001965 "i64:32:64-f32:32:32-f64:32:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001966 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001967 } else {
1968 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 +00001969 "i64:32:64-f32:32:32-f64:32:64-"
1970 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001971 }
1972
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001973 // FIXME: Override "preferred align" for double and long long.
1974 } else if (Name == "aapcs") {
1975 // FIXME: Enumerated types are variable width in straight AAPCS.
1976 } else if (Name == "aapcs-linux") {
1977 ;
1978 } else
1979 return false;
1980
1981 return true;
1982 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001983
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001984 void getDefaultFeatures(const std::string &CPU,
1985 llvm::StringMap<bool> &Features) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001986 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1987 Features["vfp2"] = true;
1988 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1989 Features["neon"] = true;
1990 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001991
Daniel Dunbar893d4752009-12-19 04:15:38 +00001992 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1993 const std::string &Name,
1994 bool Enabled) const {
Evan Cheng491f56d2011-07-08 06:40:11 +00001995 if (Name == "soft-float" || Name == "soft-float-abi" ||
1996 Name == "vfp2" || Name == "vfp3" || Name == "neon") {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001997 Features[Name] = Enabled;
1998 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00001999 return false;
2000
Daniel Dunbar893d4752009-12-19 04:15:38 +00002001 return true;
2002 }
2003
2004 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002005 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00002006 SoftFloat = SoftFloatABI = false;
2007 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2008 if (Features[i] == "+soft-float")
2009 SoftFloat = true;
2010 else if (Features[i] == "+soft-float-abi")
2011 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002012 else if (Features[i] == "+vfp2")
2013 FPU = VFP2FPU;
2014 else if (Features[i] == "+vfp3")
2015 FPU = VFP3FPU;
2016 else if (Features[i] == "+neon")
2017 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00002018 }
2019
2020 // Remove front-end specific options which the backend handles differently.
2021 std::vector<std::string>::iterator it;
2022 it = std::find(Features.begin(), Features.end(), "+soft-float");
2023 if (it != Features.end())
2024 Features.erase(it);
2025 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2026 if (it != Features.end())
2027 Features.erase(it);
2028 }
2029
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002030 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
2031 return llvm::StringSwitch<const char*>(Name)
2032 .Cases("arm8", "arm810", "4")
2033 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2034 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2035 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2036 .Case("ep9312", "4T")
2037 .Cases("arm10tdmi", "arm1020t", "5T")
2038 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2039 .Case("arm926ej-s", "5TEJ")
2040 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2041 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002042 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002043 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002044 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002045 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2046 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00002047 .Case("cortex-m3", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00002048 .Case("cortex-m0", "6M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002049 .Default(0);
2050 }
2051 virtual bool setCPU(const std::string &Name) {
2052 if (!getCPUDefineSuffix(Name))
2053 return false;
2054
2055 CPU = Name;
2056 return true;
2057 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002058 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002059 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002060 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002061 Builder.defineMacro("__arm");
2062 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002063
Chris Lattnerecd49032009-03-02 22:27:17 +00002064 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002065 Builder.defineMacro("__ARMEL__");
2066 Builder.defineMacro("__LITTLE_ENDIAN__");
2067 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002068
2069 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002070 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002071
Mike Stump9d54bd72009-04-08 02:07:04 +00002072 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002073
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002074 // FIXME: It's more complicated than this and we don't really support
2075 // interworking.
2076 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002077 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002078
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002079 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002080 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002081
Daniel Dunbar893d4752009-12-19 04:15:38 +00002082 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002083 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002084
2085 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002086 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002087
Bob Wilson19c1b882011-05-13 18:56:03 +00002088 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002089 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002090 Builder.defineMacro("__THUMBEL__");
2091 Builder.defineMacro("__thumb__");
Bob Wilson19c1b882011-05-13 18:56:03 +00002092 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002093 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002094 }
2095
2096 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002097 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002098
2099 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002100 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002101
2102 // This only gets set when Neon instructions are actually available, unlike
2103 // the VFP define, hence the soft float and arch check. This is subtly
2104 // different from gcc, we follow the intent which was that it should be set
2105 // when Neon instructions are actually available.
Bob Wilson19c1b882011-05-13 18:56:03 +00002106 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002107 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00002108 }
2109 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2110 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00002111 Records = BuiltinInfo;
2112 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00002113 }
2114 virtual const char *getVAListDeclaration() const {
John McCalle155a3d2011-05-09 02:19:37 +00002115 return "typedef void* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00002116 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002117 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002118 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002119 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002120 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002121 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002122 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002123 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00002124 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002125 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00002126 case 'l': // r0-r7
2127 case 'h': // r8-r15
2128 case 'w': // VFP Floating point register single precision
2129 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00002130 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00002131 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002132 case 'U': // a memory reference...
2133 switch (Name[1]) {
2134 case 'q': // ...ARMV4 ldrsb
2135 case 'v': // ...VFP load/store (reg+constant offset)
2136 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00002137 case 't': // address valid for load/store opaque types wider
2138 // than 128-bits
2139 case 'n': // valid address for Neon doubleword vector load/store
2140 case 'm': // valid address for Neon element and structure load/store
2141 case 's': // valid address for non-offset loads/stores of quad-word
2142 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002143 Info.setAllowsMemory();
2144 Name++;
2145 return true;
2146 }
Nate Begeman2908fa02008-04-22 05:03:19 +00002147 }
Chris Lattner17df24e2008-04-21 18:56:49 +00002148 return false;
2149 }
Evan Chengd863adb2011-06-16 19:13:15 +00002150 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002151 std::string R;
2152 switch (*Constraint) {
2153 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00002154 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002155 Constraint++;
2156 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00002157 case 'p': // 'p' should be translated to 'r' by default.
2158 R = std::string("r");
2159 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002160 default:
2161 return std::string(1, *Constraint);
2162 }
2163 return R;
2164 }
Chris Lattner17df24e2008-04-21 18:56:49 +00002165 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002166 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00002167 return "";
2168 }
2169};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002170
2171const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002172 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002173 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002174 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2175
2176 // Float registers
2177 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2178 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2179 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002180 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002181
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002182 // Double registers
2183 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2184 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002185 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2186 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002187
2188 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002189 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2190 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002191};
2192
2193void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002194 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002195 Names = GCCRegNames;
2196 NumNames = llvm::array_lengthof(GCCRegNames);
2197}
2198
2199const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002200 { { "a1" }, "r0" },
2201 { { "a2" }, "r1" },
2202 { { "a3" }, "r2" },
2203 { { "a4" }, "r3" },
2204 { { "v1" }, "r4" },
2205 { { "v2" }, "r5" },
2206 { { "v3" }, "r6" },
2207 { { "v4" }, "r7" },
2208 { { "v5" }, "r8" },
2209 { { "v6", "rfp" }, "r9" },
2210 { { "sl" }, "r10" },
2211 { { "fp" }, "r11" },
2212 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002213 { { "r13" }, "sp" },
2214 { { "r14" }, "lr" },
2215 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002216 // The S, D and Q registers overlap, but aren't really aliases; we
2217 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002218};
2219
2220void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2221 unsigned &NumAliases) const {
2222 Aliases = GCCRegAliases;
2223 NumAliases = llvm::array_lengthof(GCCRegAliases);
2224}
Chris Lattner5cc15e02010-03-03 19:03:45 +00002225
2226const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00002227#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00002228#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00002229 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00002230#include "clang/Basic/BuiltinsARM.def"
2231};
Chris Lattner17df24e2008-04-21 18:56:49 +00002232} // end anonymous namespace.
2233
Eli Friedmanf05b7722008-08-20 07:44:10 +00002234
2235namespace {
Mike Stump11289f42009-09-09 15:08:12 +00002236class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002237 public DarwinTargetInfo<ARMTargetInfo> {
2238protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00002239 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002240 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00002241 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00002242 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002243
Torok Edwinb2b37c62009-06-30 17:10:35 +00002244public:
Mike Stump11289f42009-09-09 15:08:12 +00002245 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002246 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2247 HasAlignMac68kSupport = true;
2248 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002249};
2250} // end anonymous namespace.
2251
Chris Lattner5ba61f02006-10-14 07:39:34 +00002252namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002253class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00002254 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2255 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002256 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00002257public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002258 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2259 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00002260 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 +00002261 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002262 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002263 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2264 const std::string &Name,
2265 bool Enabled) const {
2266 if (Name == "soft-float")
2267 Features[Name] = Enabled;
2268 else
2269 return false;
2270
2271 return true;
2272 }
2273 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2274 SoftFloat = false;
2275 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2276 if (Features[i] == "+soft-float")
2277 SoftFloat = true;
2278 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002279 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002280 MacroBuilder &Builder) const {
2281 DefineStd(Builder, "sparc", Opts);
2282 Builder.defineMacro("__sparcv8");
2283 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002284
2285 if (SoftFloat)
2286 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00002287 }
2288 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2289 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002290 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00002291 }
2292 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002293 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00002294 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002295 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002296 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002297 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002298 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002299 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00002300 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002301 // FIXME: Implement!
2302 return false;
Gabor Greif49991682008-02-21 16:29:08 +00002303 }
2304 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002305 // FIXME: Implement!
2306 return "";
Gabor Greif49991682008-02-21 16:29:08 +00002307 }
2308};
2309
Chris Lattner9b415d62009-01-27 01:58:38 +00002310const char * const SparcV8TargetInfo::GCCRegNames[] = {
2311 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2312 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2313 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2314 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2315};
2316
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002317void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002318 unsigned &NumNames) const {
2319 Names = GCCRegNames;
2320 NumNames = llvm::array_lengthof(GCCRegNames);
2321}
2322
2323const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002324 { { "g0" }, "r0" },
2325 { { "g1" }, "r1" },
2326 { { "g2" }, "r2" },
2327 { { "g3" }, "r3" },
2328 { { "g4" }, "r4" },
2329 { { "g5" }, "r5" },
2330 { { "g6" }, "r6" },
2331 { { "g7" }, "r7" },
2332 { { "o0" }, "r8" },
2333 { { "o1" }, "r9" },
2334 { { "o2" }, "r10" },
2335 { { "o3" }, "r11" },
2336 { { "o4" }, "r12" },
2337 { { "o5" }, "r13" },
2338 { { "o6", "sp" }, "r14" },
2339 { { "o7" }, "r15" },
2340 { { "l0" }, "r16" },
2341 { { "l1" }, "r17" },
2342 { { "l2" }, "r18" },
2343 { { "l3" }, "r19" },
2344 { { "l4" }, "r20" },
2345 { { "l5" }, "r21" },
2346 { { "l6" }, "r22" },
2347 { { "l7" }, "r23" },
2348 { { "i0" }, "r24" },
2349 { { "i1" }, "r25" },
2350 { { "i2" }, "r26" },
2351 { { "i3" }, "r27" },
2352 { { "i4" }, "r28" },
2353 { { "i5" }, "r29" },
2354 { { "i6", "fp" }, "r30" },
2355 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00002356};
2357
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002358void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002359 unsigned &NumAliases) const {
2360 Aliases = GCCRegAliases;
2361 NumAliases = llvm::array_lengthof(GCCRegAliases);
2362}
Gabor Greif49991682008-02-21 16:29:08 +00002363} // end anonymous namespace.
2364
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002365namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002366class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2367public:
2368 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2369 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2370 SizeType = UnsignedInt;
2371 PtrDiffType = SignedInt;
2372 }
2373};
Torok Edwinb2b37c62009-06-30 17:10:35 +00002374class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002375public:
2376 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002377 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00002378 SizeType = UnsignedInt;
2379 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002380 }
2381};
2382} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00002383
Chris Lattnerb781dc792008-05-08 05:58:21 +00002384namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002385 class MSP430TargetInfo : public TargetInfo {
2386 static const char * const GCCRegNames[];
2387 public:
2388 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2389 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00002390 IntWidth = 16; IntAlign = 16;
2391 LongWidth = 32; LongLongWidth = 64;
2392 LongAlign = LongLongAlign = 16;
2393 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002394 SizeType = UnsignedInt;
2395 IntMaxType = SignedLong;
2396 UIntMaxType = UnsignedLong;
2397 IntPtrType = SignedShort;
2398 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00002399 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00002400 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002401 }
2402 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002403 MacroBuilder &Builder) const {
2404 Builder.defineMacro("MSP430");
2405 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002406 // FIXME: defines for different 'flavours' of MCU
2407 }
2408 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2409 unsigned &NumRecords) const {
2410 // FIXME: Implement.
2411 Records = 0;
2412 NumRecords = 0;
2413 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002414 virtual void getGCCRegNames(const char * const *&Names,
2415 unsigned &NumNames) const;
2416 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2417 unsigned &NumAliases) const {
2418 // No aliases.
2419 Aliases = 0;
2420 NumAliases = 0;
2421 }
2422 virtual bool validateAsmConstraint(const char *&Name,
2423 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00002424 // No target constraints for now.
2425 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002426 }
2427 virtual const char *getClobbers() const {
2428 // FIXME: Is this really right?
2429 return "";
2430 }
2431 virtual const char *getVAListDeclaration() const {
2432 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00002433 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002434 }
2435 };
2436
2437 const char * const MSP430TargetInfo::GCCRegNames[] = {
2438 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2439 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2440 };
2441
2442 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2443 unsigned &NumNames) const {
2444 Names = GCCRegNames;
2445 NumNames = llvm::array_lengthof(GCCRegNames);
2446 }
2447}
2448
2449
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002450namespace {
2451 class SystemZTargetInfo : public TargetInfo {
2452 static const char * const GCCRegNames[];
2453 public:
2454 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2455 TLSSupported = false;
2456 IntWidth = IntAlign = 32;
2457 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2458 PointerWidth = PointerAlign = 64;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002459 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2460 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002461 }
2462 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002463 MacroBuilder &Builder) const {
2464 Builder.defineMacro("__s390__");
2465 Builder.defineMacro("__s390x__");
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002466 }
2467 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2468 unsigned &NumRecords) const {
2469 // FIXME: Implement.
2470 Records = 0;
2471 NumRecords = 0;
2472 }
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002473
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002474 virtual void getGCCRegNames(const char * const *&Names,
2475 unsigned &NumNames) const;
2476 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2477 unsigned &NumAliases) const {
2478 // No aliases.
2479 Aliases = 0;
2480 NumAliases = 0;
2481 }
2482 virtual bool validateAsmConstraint(const char *&Name,
2483 TargetInfo::ConstraintInfo &info) const {
2484 // FIXME: implement
2485 return true;
2486 }
2487 virtual const char *getClobbers() const {
2488 // FIXME: Is this really right?
2489 return "";
2490 }
2491 virtual const char *getVAListDeclaration() const {
2492 // FIXME: implement
2493 return "typedef char* __builtin_va_list;";
2494 }
2495 };
2496
2497 const char * const SystemZTargetInfo::GCCRegNames[] = {
2498 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2499 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2500 };
2501
2502 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2503 unsigned &NumNames) const {
2504 Names = GCCRegNames;
2505 NumNames = llvm::array_lengthof(GCCRegNames);
2506 }
2507}
2508
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002509namespace {
2510 class BlackfinTargetInfo : public TargetInfo {
2511 static const char * const GCCRegNames[];
2512 public:
2513 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2514 TLSSupported = false;
2515 DoubleAlign = 32;
2516 LongLongAlign = 32;
2517 LongDoubleAlign = 32;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002518 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002519 }
2520
2521 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002522 MacroBuilder &Builder) const {
2523 DefineStd(Builder, "bfin", Opts);
2524 DefineStd(Builder, "BFIN", Opts);
2525 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002526 // FIXME: This one is really dependent on -mcpu
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002527 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002528 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2529 }
2530
2531 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2532 unsigned &NumRecords) const {
2533 // FIXME: Implement.
2534 Records = 0;
2535 NumRecords = 0;
2536 }
2537
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002538 virtual void getGCCRegNames(const char * const *&Names,
2539 unsigned &NumNames) const;
2540
2541 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2542 unsigned &NumAliases) const {
2543 // No aliases.
2544 Aliases = 0;
2545 NumAliases = 0;
2546 }
2547
2548 virtual bool validateAsmConstraint(const char *&Name,
2549 TargetInfo::ConstraintInfo &Info) const {
2550 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2551 Info.setAllowsRegister();
2552 return true;
2553 }
2554 return false;
2555 }
2556
2557 virtual const char *getClobbers() const {
2558 return "";
2559 }
2560
2561 virtual const char *getVAListDeclaration() const {
2562 return "typedef char* __builtin_va_list;";
2563 }
2564 };
2565
2566 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2567 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2568 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2569 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2570 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2571 "a0", "a1", "cc",
2572 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2573 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2574 };
2575
2576 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2577 unsigned &NumNames) const {
2578 Names = GCCRegNames;
2579 NumNames = llvm::array_lengthof(GCCRegNames);
2580 }
2581}
2582
Eli Friedmana9c3d712009-08-19 20:47:07 +00002583namespace {
2584
Mike Stump11289f42009-09-09 15:08:12 +00002585 // LLVM and Clang cannot be used directly to output native binaries for
2586 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00002587 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00002588 //
2589 // TCE uses the llvm bitcode as input and uses it for generating customized
2590 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00002591 // publicly available in http://tce.cs.tut.fi
2592
2593 class TCETargetInfo : public TargetInfo{
2594 public:
2595 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2596 TLSSupported = false;
2597 IntWidth = 32;
2598 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00002599 PointerWidth = 32;
2600 IntAlign = 32;
2601 LongAlign = LongLongAlign = 32;
2602 PointerAlign = 32;
2603 SizeType = UnsignedInt;
2604 IntMaxType = SignedLong;
2605 UIntMaxType = UnsignedLong;
2606 IntPtrType = SignedInt;
2607 PtrDiffType = SignedInt;
2608 FloatWidth = 32;
2609 FloatAlign = 32;
2610 DoubleWidth = 32;
2611 DoubleAlign = 32;
2612 LongDoubleWidth = 32;
2613 LongDoubleAlign = 32;
2614 FloatFormat = &llvm::APFloat::IEEEsingle;
2615 DoubleFormat = &llvm::APFloat::IEEEsingle;
2616 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00002617 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2618 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00002619 "f32:32:32-f64:32:32-v64:32:32-"
2620 "v128:32:32-a0:0:32-n32";
Eli Friedmana9c3d712009-08-19 20:47:07 +00002621 }
2622
2623 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002624 MacroBuilder &Builder) const {
2625 DefineStd(Builder, "tce", Opts);
2626 Builder.defineMacro("__TCE__");
2627 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00002628 }
2629 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2630 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00002631 virtual const char *getClobbers() const {
2632 return "";
2633 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002634 virtual const char *getVAListDeclaration() const {
2635 return "typedef void* __builtin_va_list;";
2636 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002637 virtual void getGCCRegNames(const char * const *&Names,
2638 unsigned &NumNames) const {}
2639 virtual bool validateAsmConstraint(const char *&Name,
2640 TargetInfo::ConstraintInfo &info) const {
2641 return true;
2642 }
2643 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2644 unsigned &NumAliases) const {}
2645 };
2646}
2647
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002648namespace {
2649class MipsTargetInfo : public TargetInfo {
Eric Christopher0b26a612010-03-02 02:41:08 +00002650 std::string ABI, CPU;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002651 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2652 static const char * const GCCRegNames[];
2653public:
Eric Christopher0b26a612010-03-02 02:41:08 +00002654 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002655 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 +00002656 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2657 SizeType = UnsignedInt;
2658 PtrDiffType = SignedInt;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002659 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002660 virtual const char *getABI() const { return ABI.c_str(); }
2661 virtual bool setABI(const std::string &Name) {
2662
2663 if ((Name == "o32") || (Name == "eabi")) {
2664 ABI = Name;
2665 return true;
2666 } else
2667 return false;
2668 }
2669 virtual bool setCPU(const std::string &Name) {
2670 CPU = Name;
2671 return true;
2672 }
2673 void getDefaultFeatures(const std::string &CPU,
2674 llvm::StringMap<bool> &Features) const {
2675 Features[ABI] = true;
2676 Features[CPU] = true;
2677 }
2678 virtual void getArchDefines(const LangOptions &Opts,
2679 MacroBuilder &Builder) const {
2680 if (ABI == "o32")
2681 Builder.defineMacro("__mips_o32");
2682 else if (ABI == "eabi")
2683 Builder.defineMacro("__mips_eabi");
2684 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002685 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002686 MacroBuilder &Builder) const {
2687 DefineStd(Builder, "mips", Opts);
2688 Builder.defineMacro("_mips");
2689 DefineStd(Builder, "MIPSEB", Opts);
2690 Builder.defineMacro("_MIPSEB");
2691 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002692 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002693 }
2694 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2695 unsigned &NumRecords) const {
2696 // FIXME: Implement!
2697 }
2698 virtual const char *getVAListDeclaration() const {
2699 return "typedef void* __builtin_va_list;";
2700 }
2701 virtual void getGCCRegNames(const char * const *&Names,
2702 unsigned &NumNames) const;
2703 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2704 unsigned &NumAliases) const;
2705 virtual bool validateAsmConstraint(const char *&Name,
2706 TargetInfo::ConstraintInfo &Info) const {
2707 switch (*Name) {
2708 default:
2709 case 'r': // CPU registers.
2710 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2711 case 'y': // Equivalent to "r", backwards compatibility only.
2712 case 'f': // floating-point registers.
2713 Info.setAllowsRegister();
2714 return true;
2715 }
2716 return false;
2717 }
2718
2719 virtual const char *getClobbers() const {
2720 // FIXME: Implement!
2721 return "";
2722 }
2723};
2724
2725const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002726 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002727 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2728 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2729 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2730 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2731 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2732 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2733 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2734 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2735 "$fcc5","$fcc6","$fcc7"
2736};
2737
2738void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2739 unsigned &NumNames) const {
2740 Names = GCCRegNames;
2741 NumNames = llvm::array_lengthof(GCCRegNames);
2742}
2743
2744const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2745 { { "at" }, "$1" },
2746 { { "v0" }, "$2" },
2747 { { "v1" }, "$3" },
2748 { { "a0" }, "$4" },
2749 { { "a1" }, "$5" },
2750 { { "a2" }, "$6" },
2751 { { "a3" }, "$7" },
2752 { { "t0" }, "$8" },
2753 { { "t1" }, "$9" },
2754 { { "t2" }, "$10" },
2755 { { "t3" }, "$11" },
2756 { { "t4" }, "$12" },
2757 { { "t5" }, "$13" },
2758 { { "t6" }, "$14" },
2759 { { "t7" }, "$15" },
2760 { { "s0" }, "$16" },
2761 { { "s1" }, "$17" },
2762 { { "s2" }, "$18" },
2763 { { "s3" }, "$19" },
2764 { { "s4" }, "$20" },
2765 { { "s5" }, "$21" },
2766 { { "s6" }, "$22" },
2767 { { "s7" }, "$23" },
2768 { { "t8" }, "$24" },
2769 { { "t9" }, "$25" },
2770 { { "k0" }, "$26" },
2771 { { "k1" }, "$27" },
2772 { { "gp" }, "$28" },
2773 { { "sp" }, "$29" },
2774 { { "fp" }, "$30" },
2775 { { "ra" }, "$31" }
2776};
2777
2778void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2779 unsigned &NumAliases) const {
2780 Aliases = GCCRegAliases;
2781 NumAliases = llvm::array_lengthof(GCCRegAliases);
2782}
2783} // end anonymous namespace.
2784
2785namespace {
2786class MipselTargetInfo : public MipsTargetInfo {
2787public:
2788 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2789 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 +00002790 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002791 }
2792
2793 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002794 MacroBuilder &Builder) const;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002795};
2796
2797void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002798 MacroBuilder &Builder) const {
2799 DefineStd(Builder, "mips", Opts);
2800 Builder.defineMacro("_mips");
2801 DefineStd(Builder, "MIPSEL", Opts);
2802 Builder.defineMacro("_MIPSEL");
2803 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002804 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002805}
2806} // end anonymous namespace.
2807
Chris Lattner5ba61f02006-10-14 07:39:34 +00002808//===----------------------------------------------------------------------===//
2809// Driver code
2810//===----------------------------------------------------------------------===//
2811
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002812static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00002813 llvm::Triple Triple(T);
2814 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00002815
Daniel Dunbar52322032009-08-18 05:47:58 +00002816 switch (Triple.getArch()) {
2817 default:
2818 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00002819
Daniel Dunbar52322032009-08-18 05:47:58 +00002820 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00002821 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002822 if (Triple.isOSDarwin())
2823 return new DarwinARMTargetInfo(T);
2824
Daniel Dunbar52322032009-08-18 05:47:58 +00002825 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00002826 case llvm::Triple::Linux:
2827 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002828 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002829 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00002830 case llvm::Triple::NetBSD:
2831 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00002832 case llvm::Triple::RTEMS:
2833 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002834 default:
2835 return new ARMTargetInfo(T);
2836 }
Eli Friedmanb5366062008-05-20 14:21:01 +00002837
Daniel Dunbar52322032009-08-18 05:47:58 +00002838 case llvm::Triple::bfin:
Douglas Gregor9fabd852011-07-01 22:41:14 +00002839 if ( os == llvm::Triple::RTEMS )
2840 return new RTEMSTargetInfo<BlackfinTargetInfo>(T);
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002841 return new BlackfinTargetInfo(T);
2842
Daniel Dunbar52322032009-08-18 05:47:58 +00002843 case llvm::Triple::msp430:
2844 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00002845
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002846 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00002847 switch (os) {
2848 case llvm::Triple::Psp:
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002849 return new PSPTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00002850 case llvm::Triple::Linux:
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002851 return new LinuxTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00002852 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00002853 return new RTEMSTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00002854 case llvm::Triple::FreeBSD:
Joerg Sonnenbergerc46e3ce2011-07-07 17:01:45 +00002855 return new FreeBSDTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00002856 case llvm::Triple::NetBSD:
2857 return new NetBSDTargetInfo<MipsTargetInfo>(T);
2858 default:
2859 return new MipsTargetInfo(T);
2860 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002861
2862 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00002863 switch (os) {
2864 case llvm::Triple::Psp:
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002865 return new PSPTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00002866 case llvm::Triple::Linux:
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002867 return new LinuxTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00002868 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00002869 return new RTEMSTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00002870 case llvm::Triple::FreeBSD:
Joerg Sonnenbergerfbc0b3a2011-07-06 11:00:56 +00002871 return new FreeBSDTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00002872 case llvm::Triple::NetBSD:
2873 return new NetBSDTargetInfo<MipselTargetInfo>(T);
2874 default:
2875 return new MipsTargetInfo(T);
2876 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002877
Daniel Dunbar52322032009-08-18 05:47:58 +00002878 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002879 if (Triple.isOSDarwin())
Roman Divacky965b0b72011-01-06 08:27:10 +00002880 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00002881 switch (os) {
2882 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002883 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00002884 case llvm::Triple::NetBSD:
2885 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
2886 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00002887 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00002888 default:
2889 return new PPC32TargetInfo(T);
2890 }
Daniel Dunbar52322032009-08-18 05:47:58 +00002891
2892 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002893 if (Triple.isOSDarwin())
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00002894 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00002895 switch (os) {
2896 case llvm::Triple::Lv2:
John Thompsone467e192009-11-19 17:18:50 +00002897 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00002898 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002899 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00002900 case llvm::Triple::NetBSD:
2901 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
2902 default:
2903 return new PPC64TargetInfo(T);
2904 }
Daniel Dunbar52322032009-08-18 05:47:58 +00002905
Justin Holewinski514cce82011-04-20 19:34:15 +00002906 case llvm::Triple::ptx32:
2907 return new PTX32TargetInfo(T);
2908 case llvm::Triple::ptx64:
2909 return new PTX64TargetInfo(T);
2910
Chris Lattner5178f562010-03-06 21:21:27 +00002911 case llvm::Triple::mblaze:
2912 return new MBlazeTargetInfo(T);
2913
Daniel Dunbar52322032009-08-18 05:47:58 +00002914 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00002915 switch (os) {
2916 case llvm::Triple::AuroraUX:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002917 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00002918 case llvm::Triple::Solaris:
Daniel Dunbar52322032009-08-18 05:47:58 +00002919 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00002920 case llvm::Triple::NetBSD:
2921 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
2922 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00002923 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00002924 default:
2925 return new SparcV8TargetInfo(T);
2926 }
Daniel Dunbar52322032009-08-18 05:47:58 +00002927
John Thompsone467e192009-11-19 17:18:50 +00002928 // FIXME: Need a real SPU target.
2929 case llvm::Triple::cellspu:
2930 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2931
Daniel Dunbar52322032009-08-18 05:47:58 +00002932 case llvm::Triple::systemz:
2933 return new SystemZTargetInfo(T);
2934
Eli Friedmana9c3d712009-08-19 20:47:07 +00002935 case llvm::Triple::tce:
2936 return new TCETargetInfo(T);
2937
Daniel Dunbar52322032009-08-18 05:47:58 +00002938 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002939 if (Triple.isOSDarwin())
2940 return new DarwinI386TargetInfo(T);
2941
Daniel Dunbar52322032009-08-18 05:47:58 +00002942 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002943 case llvm::Triple::AuroraUX:
2944 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002945 case llvm::Triple::Linux:
2946 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2947 case llvm::Triple::DragonFly:
2948 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2949 case llvm::Triple::NetBSD:
2950 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2951 case llvm::Triple::OpenBSD:
2952 return new OpenBSDI386TargetInfo(T);
2953 case llvm::Triple::FreeBSD:
2954 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00002955 case llvm::Triple::Minix:
2956 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002957 case llvm::Triple::Solaris:
2958 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2959 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002960 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002961 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002962 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002963 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002964 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00002965 case llvm::Triple::Haiku:
2966 return new HaikuX86_32TargetInfo(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00002967 case llvm::Triple::RTEMS:
2968 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002969 default:
2970 return new X86_32TargetInfo(T);
2971 }
2972
2973 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002974 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
2975 return new DarwinX86_64TargetInfo(T);
2976
Daniel Dunbar52322032009-08-18 05:47:58 +00002977 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002978 case llvm::Triple::AuroraUX:
2979 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002980 case llvm::Triple::Linux:
2981 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00002982 case llvm::Triple::DragonFly:
2983 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002984 case llvm::Triple::NetBSD:
2985 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2986 case llvm::Triple::OpenBSD:
2987 return new OpenBSDX86_64TargetInfo(T);
2988 case llvm::Triple::FreeBSD:
2989 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2990 case llvm::Triple::Solaris:
2991 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00002992 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002993 return new MinGWX86_64TargetInfo(T);
2994 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002995 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002996 default:
2997 return new X86_64TargetInfo(T);
2998 }
2999 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003000}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003001
3002/// CreateTargetInfo - Return the target info object for the specified target
3003/// triple.
3004TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00003005 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003006 llvm::Triple Triple(Opts.Triple);
3007
3008 // Construct the target
3009 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3010 if (!Target) {
3011 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3012 return 0;
3013 }
3014
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003015 // Set the target CPU if specified.
3016 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3017 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3018 return 0;
3019 }
3020
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003021 // Set the target ABI if specified.
3022 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3023 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3024 return 0;
3025 }
3026
Charles Davis95a546e2010-06-11 01:06:47 +00003027 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00003028 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00003029 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3030 return 0;
3031 }
3032
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003033 // Compute the default target features, we need the target to handle this
3034 // because features may have dependencies on one another.
3035 llvm::StringMap<bool> Features;
3036 Target->getDefaultFeatures(Opts.CPU, Features);
3037
3038 // Apply the user specified deltas.
3039 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3040 ie = Opts.Features.end(); it != ie; ++it) {
3041 const char *Name = it->c_str();
3042
3043 // Apply the feature via the target.
3044 if ((Name[0] != '-' && Name[0] != '+') ||
3045 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
3046 Diags.Report(diag::err_target_invalid_feature) << Name;
3047 return 0;
3048 }
3049 }
3050
3051 // Add the features to the compile options.
3052 //
3053 // FIXME: If we are completely confident that we have the right set, we only
3054 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00003055 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003056 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
3057 ie = Features.end(); it != ie; ++it)
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00003058 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
3059 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00003060
3061 return Target.take();
3062}