blob: 236668f32bba8e0ecb3ce8d2cbf5e4e39ff125b2 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
Dale Johannesen182addf2010-10-29 23:24:33 +000029#include "llvm/Type.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Chris Lattner5ba61f02006-10-14 07:39:34 +000031using namespace clang;
32
Chris Lattner5ba61f02006-10-14 07:39:34 +000033//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000034// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
36
Chris Lattner1e1c0b92009-03-20 16:06:38 +000037/// DefineStd - Define a macro name and standard variants. For example if
38/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
39/// when in GNU mode.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000040static void DefineStd(MacroBuilder &Builder, llvm::StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041 const LangOptions &Opts) {
42 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000043
Chris Lattner1e1c0b92009-03-20 16:06:38 +000044 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
45 // in the user's namespace.
46 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000047 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000048
Chris Lattner1e1c0b92009-03-20 16:06:38 +000049 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000050 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000051
Chris Lattner1e1c0b92009-03-20 16:06:38 +000052 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054}
55
Chris Lattner09d98f52008-10-05 21:50:58 +000056//===----------------------------------------------------------------------===//
57// Defines specific to certain operating systems.
58//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000059
Torok Edwinb2b37c62009-06-30 17:10:35 +000060namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000061template<typename TgtInfo>
62class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000063protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000064 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000065 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000066public:
Douglas Gregorc05d2a12009-07-01 15:12:53 +000067 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwinb2b37c62009-06-30 17:10:35 +000068 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000069 MacroBuilder &Builder) const {
70 TgtInfo::getTargetDefines(Opts, Builder);
71 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000072 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000073
74};
Chris Lattner859c37a2009-08-12 06:24:27 +000075} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000076
Chris Lattner30ba6742009-08-10 19:03:04 +000077
Daniel Dunbard86666f2010-01-26 01:44:04 +000078static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000079 const llvm::Triple &Triple,
80 llvm::StringRef &PlatformName,
81 VersionTuple &PlatformMinVersion) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 Builder.defineMacro("__APPLE_CC__", "5621");
83 Builder.defineMacro("__APPLE__");
84 Builder.defineMacro("__MACH__");
85 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000086
Chris Lattner2a5c0a32009-04-07 16:50:40 +000087 // __weak is always defined, for use in blocks and with objc pointers.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000089
Chris Lattner2a5c0a32009-04-07 16:50:40 +000090 // Darwin defines __strong even in C mode (just to nothing).
91 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__strong", "");
Chris Lattner2a5c0a32009-04-07 16:50:40 +000093 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
Eli Friedmanfd4b1552009-06-04 23:00:29 +000095
96 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000097 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +000098 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000099 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000100
101 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000102 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000103
Daniel Dunbarecf13562011-04-19 21:40:34 +0000104 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000105 unsigned Maj, Min, Rev;
Mike Stump11289f42009-09-09 15:08:12 +0000106
Daniel Dunbard86666f2010-01-26 01:44:04 +0000107 // If no version was given, default to to 10.4.0, for simplifying tests.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000108 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
109 PlatformName = "macosx";
Daniel Dunbard86666f2010-01-26 01:44:04 +0000110 Min = Rev = 0;
111 Maj = 8;
Daniel Dunbarecf13562011-04-19 21:40:34 +0000112 } else {
113 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
114 // "-osxNNN", and "-iosNNN").
115
116 if (Triple.getOS() == llvm::Triple::Darwin) {
117 // For historical reasons that make little sense, the version passed here
118 // is the "darwin" version, which drops the 10 and offsets by 4.
119 Triple.getOSVersion(Maj, Min, Rev);
120
121 if (Triple.getEnvironmentName() == "iphoneos") {
122 PlatformName = "ios";
123 } else {
124 assert(Rev == 0 && "invalid triple, unexpected micro version!");
125 PlatformName = "macosx";
126 Rev = Min;
127 Min = Maj - 4;
128 Maj = 10;
129 }
130 } else if (Triple.getOS() == llvm::Triple::OSX) {
131 Triple.getOSVersion(Maj, Min, Rev);
132 PlatformName = "macosx";
133 } else {
134 assert(Triple.getOS() == llvm::Triple::IOS && "unexpected triple!");
135 Triple.getOSVersion(Maj, Min, Rev);
136 PlatformName = "ios";
137 }
138 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000139
140 // Set the appropriate OS version define.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000141 if (PlatformName == "ios") {
Daniel Dunbard86666f2010-01-26 01:44:04 +0000142 assert(Maj < 10 && Min < 99 && Rev < 99 && "Invalid version!");
143 char Str[6];
144 Str[0] = '0' + Maj;
145 Str[1] = '0' + (Min / 10);
146 Str[2] = '0' + (Min % 10);
147 Str[3] = '0' + (Rev / 10);
148 Str[4] = '0' + (Rev % 10);
149 Str[5] = '\0';
150 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
151 } else {
Daniel Dunbard86666f2010-01-26 01:44:04 +0000152 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
153 assert(Maj < 99 && Min < 10 && Rev < 10 && "Invalid version!");
154 char Str[5];
155 Str[0] = '0' + (Maj / 10);
156 Str[1] = '0' + (Maj % 10);
157 Str[2] = '0' + Min;
158 Str[3] = '0' + Rev;
159 Str[4] = '\0';
160 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000161 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000162
163 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000164}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000165
Chris Lattner30ba6742009-08-10 19:03:04 +0000166namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000167template<typename Target>
168class DarwinTargetInfo : public OSTargetInfo<Target> {
169protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000170 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000171 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000172 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
173 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000174 }
Mike Stump11289f42009-09-09 15:08:12 +0000175
Torok Edwinb2b37c62009-06-30 17:10:35 +0000176public:
177 DarwinTargetInfo(const std::string& triple) :
178 OSTargetInfo<Target>(triple) {
Eric Christopher17c7b892010-06-25 19:04:52 +0000179 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
Daniel Dunbar13adc7f2011-02-21 23:12:51 +0000180 this->MCountName = "\01mcount";
Torok Edwinb2b37c62009-06-30 17:10:35 +0000181 }
182
Anders Carlsson0b0a1222010-01-30 18:33:31 +0000183 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000184 // Let MCSectionMachO validate this.
185 llvm::StringRef Segment, Section;
186 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000187 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000188 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000189 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000190 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000191
Anders Carlsson851318a2010-06-08 22:47:50 +0000192 virtual const char *getStaticInitSectionSpecifier() const {
193 // FIXME: We should return 0 when building kexts.
194 return "__TEXT,__StaticInit,regular,pure_instructions";
195 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000196
Torok Edwinb2b37c62009-06-30 17:10:35 +0000197};
198
Chris Lattner30ba6742009-08-10 19:03:04 +0000199
Torok Edwinb2b37c62009-06-30 17:10:35 +0000200// DragonFlyBSD Target
201template<typename Target>
202class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
203protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000204 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000205 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000206 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000207 Builder.defineMacro("__DragonFly__");
208 Builder.defineMacro("__DragonFly_cc_version", "100001");
209 Builder.defineMacro("__ELF__");
210 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
211 Builder.defineMacro("__tune_i386__");
212 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213 }
214public:
Mike Stump11289f42009-09-09 15:08:12 +0000215 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216 : OSTargetInfo<Target>(triple) {}
217};
218
219// FreeBSD Target
220template<typename Target>
221class FreeBSDTargetInfo : public OSTargetInfo<Target> {
222protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000223 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000224 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000225 // FreeBSD defines; list based off of gcc output
226
Daniel Dunbar40165182009-08-24 09:10:05 +0000227 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000228 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000229
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000230 Builder.defineMacro("__FreeBSD__", Release);
231 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000232 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
233 DefineStd(Builder, "unix", Opts);
234 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000235 }
236public:
Mike Stump11289f42009-09-09 15:08:12 +0000237 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000238 : OSTargetInfo<Target>(triple) {
239 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000240
241 llvm::Triple Triple(triple);
242 switch (Triple.getArch()) {
243 default:
244 case llvm::Triple::x86:
245 case llvm::Triple::x86_64:
246 this->MCountName = ".mcount";
247 break;
248 case llvm::Triple::mips:
249 case llvm::Triple::mipsel:
250 case llvm::Triple::ppc:
251 case llvm::Triple::ppc64:
252 this->MCountName = "_mcount";
253 break;
254 case llvm::Triple::arm:
255 this->MCountName = "__mcount";
256 break;
257 }
258
Duncan Sands9cb27e92009-07-08 13:55:08 +0000259 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000260};
261
Chris Lattner3e2ee142010-07-07 16:01:42 +0000262// Minix Target
263template<typename Target>
264class MinixTargetInfo : public OSTargetInfo<Target> {
265protected:
266 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
267 MacroBuilder &Builder) const {
268 // Minix defines
269
270 Builder.defineMacro("__minix", "3");
271 Builder.defineMacro("_EM_WSIZE", "4");
272 Builder.defineMacro("_EM_PSIZE", "4");
273 Builder.defineMacro("_EM_SSIZE", "2");
274 Builder.defineMacro("_EM_LSIZE", "4");
275 Builder.defineMacro("_EM_FSIZE", "4");
276 Builder.defineMacro("_EM_DSIZE", "8");
277 DefineStd(Builder, "unix", Opts);
278 }
279public:
280 MinixTargetInfo(const std::string &triple)
281 : OSTargetInfo<Target>(triple) {
282 this->UserLabelPrefix = "";
283 }
284};
285
Torok Edwinb2b37c62009-06-30 17:10:35 +0000286// Linux target
287template<typename Target>
288class LinuxTargetInfo : public OSTargetInfo<Target> {
289protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000290 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000292 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000293 DefineStd(Builder, "unix", Opts);
294 DefineStd(Builder, "linux", Opts);
295 Builder.defineMacro("__gnu_linux__");
296 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000297 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000298 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000299 if (Opts.CPlusPlus)
300 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000301 }
302public:
Mike Stump11289f42009-09-09 15:08:12 +0000303 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000304 : OSTargetInfo<Target>(triple) {
305 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000306 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000307 }
308};
309
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000310// NetBSD Target
311template<typename Target>
312class NetBSDTargetInfo : public OSTargetInfo<Target> {
313protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000314 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000315 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000316 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000317 Builder.defineMacro("__NetBSD__");
318 Builder.defineMacro("__unix__");
319 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000320 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000321 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000322 }
323public:
Mike Stump11289f42009-09-09 15:08:12 +0000324 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000325 : OSTargetInfo<Target>(triple) {
326 this->UserLabelPrefix = "";
327 }
328};
329
Torok Edwinb2b37c62009-06-30 17:10:35 +0000330// OpenBSD Target
331template<typename Target>
332class OpenBSDTargetInfo : public OSTargetInfo<Target> {
333protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000334 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000335 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000336 // OpenBSD defines; list based off of gcc output
337
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000338 Builder.defineMacro("__OpenBSD__");
339 DefineStd(Builder, "unix", Opts);
340 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000341 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000342 Builder.defineMacro("_POSIX_THREADS");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000343 }
344public:
Mike Stump11289f42009-09-09 15:08:12 +0000345 OpenBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000346 : OSTargetInfo<Target>(triple) {}
347};
348
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000349// PSP Target
350template<typename Target>
351class PSPTargetInfo : public OSTargetInfo<Target> {
352protected:
353 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000354 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000355 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000356 Builder.defineMacro("PSP");
357 Builder.defineMacro("_PSP");
358 Builder.defineMacro("__psp__");
359 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000360 }
361public:
362 PSPTargetInfo(const std::string& triple)
363 : OSTargetInfo<Target>(triple) {
364 this->UserLabelPrefix = "";
365 }
366};
367
John Thompsone467e192009-11-19 17:18:50 +0000368// PS3 PPU Target
369template<typename Target>
370class PS3PPUTargetInfo : public OSTargetInfo<Target> {
371protected:
372 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000373 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000374 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000375 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000376 Builder.defineMacro("__PPU__");
377 Builder.defineMacro("__CELLOS_LV2__");
378 Builder.defineMacro("__ELF__");
379 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000380 Builder.defineMacro("_ARCH_PPC64");
381 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000382 }
383public:
384 PS3PPUTargetInfo(const std::string& triple)
385 : OSTargetInfo<Target>(triple) {
386 this->UserLabelPrefix = "";
John Thompson6f8dba72009-12-18 14:21:08 +0000387 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000388 this->IntMaxType = TargetInfo::SignedLongLong;
389 this->UIntMaxType = TargetInfo::UnsignedLongLong;
390 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000391 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000392 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
393 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000394 }
395};
396
397// FIXME: Need a real SPU target.
398// PS3 SPU Target
399template<typename Target>
400class PS3SPUTargetInfo : public OSTargetInfo<Target> {
401protected:
402 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000403 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000404 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000405 Builder.defineMacro("__SPU__");
406 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000407 }
408public:
409 PS3SPUTargetInfo(const std::string& triple)
410 : OSTargetInfo<Target>(triple) {
411 this->UserLabelPrefix = "";
412 }
413};
414
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000415// AuroraUX target
416template<typename Target>
417class AuroraUXTargetInfo : public OSTargetInfo<Target> {
418protected:
419 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000420 MacroBuilder &Builder) const {
421 DefineStd(Builder, "sun", Opts);
422 DefineStd(Builder, "unix", Opts);
423 Builder.defineMacro("__ELF__");
424 Builder.defineMacro("__svr4__");
425 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000426 }
427public:
428 AuroraUXTargetInfo(const std::string& triple)
429 : OSTargetInfo<Target>(triple) {
430 this->UserLabelPrefix = "";
431 this->WCharType = this->SignedLong;
432 // FIXME: WIntType should be SignedLong
433 }
434};
435
Torok Edwinb2b37c62009-06-30 17:10:35 +0000436// Solaris target
437template<typename Target>
438class SolarisTargetInfo : public OSTargetInfo<Target> {
439protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000440 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000441 MacroBuilder &Builder) const {
442 DefineStd(Builder, "sun", Opts);
443 DefineStd(Builder, "unix", Opts);
444 Builder.defineMacro("__ELF__");
445 Builder.defineMacro("__svr4__");
446 Builder.defineMacro("__SVR4");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000447 }
448public:
Mike Stump11289f42009-09-09 15:08:12 +0000449 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000450 : OSTargetInfo<Target>(triple) {
451 this->UserLabelPrefix = "";
452 this->WCharType = this->SignedLong;
453 // FIXME: WIntType should be SignedLong
454 }
455};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000456
457// Windows target
458template<typename Target>
459class WindowsTargetInfo : public OSTargetInfo<Target> {
460protected:
461 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
462 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000463 Builder.defineMacro("_WIN32");
464 }
465 void getVisualStudioDefines(const LangOptions &Opts,
466 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000467 if (Opts.CPlusPlus) {
468 if (Opts.RTTI)
469 Builder.defineMacro("_CPPRTTI");
470
471 if (Opts.Exceptions)
472 Builder.defineMacro("_CPPUNWIND");
473 }
474
475 if (!Opts.CharIsSigned)
476 Builder.defineMacro("_CHAR_UNSIGNED");
477
478 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
479 // but it works for now.
480 if (Opts.POSIXThreads)
481 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000482
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000483 if (Opts.MSCVersion != 0)
484 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
485
486 if (Opts.Microsoft) {
487 Builder.defineMacro("_MSC_EXTENSIONS");
488
489 if (Opts.CPlusPlus0x) {
490 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
491 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
492 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
493 }
494 }
495
496 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000497 }
498
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000499public:
500 WindowsTargetInfo(const std::string &triple)
501 : OSTargetInfo<Target>(triple) {}
502};
503
Mike Stump11289f42009-09-09 15:08:12 +0000504} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000505
Chris Lattner09d98f52008-10-05 21:50:58 +0000506//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000507// Specific target implementations.
508//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000509
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000510namespace {
511// PPC abstract base class
512class PPCTargetInfo : public TargetInfo {
513 static const Builtin::Info BuiltinInfo[];
514 static const char * const GCCRegNames[];
515 static const TargetInfo::GCCRegAlias GCCRegAliases[];
516
517public:
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000518 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
519
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000520 virtual void getTargetBuiltins(const Builtin::Info *&Records,
521 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000522 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000523 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000524 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000525
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000526 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000527 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000528
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000529 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000530 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000531 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000532 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000533 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000534 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000535 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000536 default: return false;
537 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000538 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000539 case 'b': // Base register
540 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000541 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000542 break;
543 // FIXME: The following are added to allow parsing.
544 // I just took a guess at what the actions should be.
545 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000546 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000547 case 'v': // Altivec vector register
548 Info.setAllowsRegister();
549 break;
550 case 'w':
551 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000552 case 'd':// VSX vector register to hold vector double data
553 case 'f':// VSX vector register to hold vector float data
554 case 's':// VSX vector register to hold scalar float data
555 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000556 break;
557 default:
558 return false;
559 }
560 Info.setAllowsRegister();
561 Name++; // Skip over 'w'.
562 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000563 case 'h': // `MQ', `CTR', or `LINK' register
564 case 'q': // `MQ' register
565 case 'c': // `CTR' register
566 case 'l': // `LINK' register
567 case 'x': // `CR' register (condition register) number 0
568 case 'y': // `CR' register (condition register)
569 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000570 Info.setAllowsRegister();
571 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000572 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000573 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000574 // (use `L' instead for SImode constants)
575 case 'K': // Unsigned 16-bit constant
576 case 'L': // Signed 16-bit constant shifted left 16 bits
577 case 'M': // Constant larger than 31
578 case 'N': // Exact power of 2
579 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000580 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000581 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000582 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000583 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000584 break;
585 case 'm': // Memory operand. Note that on PowerPC targets, m can
586 // include addresses that update the base register. It
587 // is therefore only safe to use `m' in an asm statement
588 // if that asm statement accesses the operand exactly once.
589 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000590 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000591 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000592 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000593 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000594 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
595 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000596 // register to be updated.
597 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000598 if (Name[1] != 's')
599 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000600 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000601 // include any automodification of the base register. Unlike
602 // `m', this constraint can be used in asm statements that
603 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000604 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000605 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000606 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000607 break;
608 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000609 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000610 case 'Z': // Memory operand that is an indexed or indirect from a
611 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000612 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000613 Info.setAllowsMemory();
614 Info.setAllowsRegister();
615 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000616 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000617 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000618 // register (`p' is preferable for asm statements)
619 case 'S': // Constant suitable as a 64-bit mask operand
620 case 'T': // Constant suitable as a 32-bit mask operand
621 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000622 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000623 // instructions
624 case 'W': // Vector constant that does not require memory
625 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000626 break;
627 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000628 }
John Thompson07a61a42010-06-24 22:44:13 +0000629 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000630 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000631 virtual const char *getClobbers() const {
632 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000633 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000634};
Anders Carlssonf511f642007-11-27 04:11:28 +0000635
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000636const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000637#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
638#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
639 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000640#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000641};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000642
643
Chris Lattnerecd49032009-03-02 22:27:17 +0000644/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
645/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000646void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000647 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000648 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000649 Builder.defineMacro("__ppc__");
650 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000651 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000652 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000653 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000654 Builder.defineMacro("_ARCH_PPC64");
655 Builder.defineMacro("_LP64");
656 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000657 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000658 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000659 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000660 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000661 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000662
Chris Lattnerecd49032009-03-02 22:27:17 +0000663 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000664 Builder.defineMacro("_BIG_ENDIAN");
665 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000666
Chris Lattnerecd49032009-03-02 22:27:17 +0000667 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000668 Builder.defineMacro("__NATURAL_ALIGNMENT__");
669 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000670
Chris Lattnerecd49032009-03-02 22:27:17 +0000671 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000672 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000673
John Thompsone467e192009-11-19 17:18:50 +0000674 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000675 Builder.defineMacro("__VEC__", "10206");
676 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000677 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000678}
679
Chris Lattner17df24e2008-04-21 18:56:49 +0000680
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000681const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000682 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
683 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
684 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
685 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
686 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
687 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
688 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
689 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000690 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000691 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000692 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000693 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
694 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
695 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
696 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000697 "vrsave", "vscr",
698 "spe_acc", "spefscr",
699 "sfp"
700};
Chris Lattner10a5b382007-01-29 05:24:35 +0000701
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000702void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000703 unsigned &NumNames) const {
704 Names = GCCRegNames;
705 NumNames = llvm::array_lengthof(GCCRegNames);
706}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000707
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000708const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
709 // While some of these aliases do map to different registers
710 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000711 { { "0" }, "r0" },
712 { { "1"}, "r1" },
713 { { "2" }, "r2" },
714 { { "3" }, "r3" },
715 { { "4" }, "r4" },
716 { { "5" }, "r5" },
717 { { "6" }, "r6" },
718 { { "7" }, "r7" },
719 { { "8" }, "r8" },
720 { { "9" }, "r9" },
721 { { "10" }, "r10" },
722 { { "11" }, "r11" },
723 { { "12" }, "r12" },
724 { { "13" }, "r13" },
725 { { "14" }, "r14" },
726 { { "15" }, "r15" },
727 { { "16" }, "r16" },
728 { { "17" }, "r17" },
729 { { "18" }, "r18" },
730 { { "19" }, "r19" },
731 { { "20" }, "r20" },
732 { { "21" }, "r21" },
733 { { "22" }, "r22" },
734 { { "23" }, "r23" },
735 { { "24" }, "r24" },
736 { { "25" }, "r25" },
737 { { "26" }, "r26" },
738 { { "27" }, "r27" },
739 { { "28" }, "r28" },
740 { { "29" }, "r29" },
741 { { "30" }, "r30" },
742 { { "31" }, "r31" },
743 { { "fr0" }, "f0" },
744 { { "fr1" }, "f1" },
745 { { "fr2" }, "f2" },
746 { { "fr3" }, "f3" },
747 { { "fr4" }, "f4" },
748 { { "fr5" }, "f5" },
749 { { "fr6" }, "f6" },
750 { { "fr7" }, "f7" },
751 { { "fr8" }, "f8" },
752 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000753 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000754 { { "fr11" }, "f11" },
755 { { "fr12" }, "f12" },
756 { { "fr13" }, "f13" },
757 { { "fr14" }, "f14" },
758 { { "fr15" }, "f15" },
759 { { "fr16" }, "f16" },
760 { { "fr17" }, "f17" },
761 { { "fr18" }, "f18" },
762 { { "fr19" }, "f19" },
763 { { "fr20" }, "f20" },
764 { { "fr21" }, "f21" },
765 { { "fr22" }, "f22" },
766 { { "fr23" }, "f23" },
767 { { "fr24" }, "f24" },
768 { { "fr25" }, "f25" },
769 { { "fr26" }, "f26" },
770 { { "fr27" }, "f27" },
771 { { "fr28" }, "f28" },
772 { { "fr29" }, "f29" },
773 { { "fr30" }, "f30" },
774 { { "fr31" }, "f31" },
775 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000776};
777
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000778void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000779 unsigned &NumAliases) const {
780 Aliases = GCCRegAliases;
781 NumAliases = llvm::array_lengthof(GCCRegAliases);
782}
783} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000784
Chris Lattner5ba61f02006-10-14 07:39:34 +0000785namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000786class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000787public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000788 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000789 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 +0000790 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000791
792 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divacky965b0b72011-01-06 08:27:10 +0000793 SizeType = UnsignedInt;
794 }
795
796 virtual const char *getVAListDeclaration() const {
797 // This is the ELF definition, and is overridden by the Darwin sub-target
798 return "typedef struct __va_list_tag {"
799 " unsigned char gpr;"
800 " unsigned char fpr;"
801 " unsigned short reserved;"
802 " void* overflow_arg_area;"
803 " void* reg_save_area;"
804 "} __builtin_va_list[1];";
Eli Friedman873f65a2008-08-21 00:13:15 +0000805 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000806};
807} // end anonymous namespace.
808
809namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000810class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000811public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000812 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000813 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000814 IntMaxType = SignedLong;
815 UIntMaxType = UnsignedLong;
816 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000817 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 +0000818 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000819 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000820 virtual const char *getVAListDeclaration() const {
821 return "typedef char* __builtin_va_list;";
822 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000823};
824} // end anonymous namespace.
825
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000826
827namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +0000828class DarwinPPC32TargetInfo :
829 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000830public:
Roman Divacky965b0b72011-01-06 08:27:10 +0000831 DarwinPPC32TargetInfo(const std::string& triple)
832 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000833 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +0000834 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
835 }
836 virtual const char *getVAListDeclaration() const {
837 return "typedef char* __builtin_va_list;";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000838 }
839};
840
841class DarwinPPC64TargetInfo :
842 public DarwinTargetInfo<PPC64TargetInfo> {
843public:
844 DarwinPPC64TargetInfo(const std::string& triple)
845 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
846 HasAlignMac68kSupport = true;
847 }
848};
849} // end anonymous namespace.
850
Chris Lattner5ba61f02006-10-14 07:39:34 +0000851namespace {
Chris Lattner5178f562010-03-06 21:21:27 +0000852// MBlaze abstract base class
853class MBlazeTargetInfo : public TargetInfo {
854 static const char * const GCCRegNames[];
855 static const TargetInfo::GCCRegAlias GCCRegAliases[];
856
857public:
858 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +0000859 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +0000860 }
861
862 virtual void getTargetBuiltins(const Builtin::Info *&Records,
863 unsigned &NumRecords) const {
864 // FIXME: Implement.
865 Records = 0;
866 NumRecords = 0;
867 }
868
869 virtual void getTargetDefines(const LangOptions &Opts,
870 MacroBuilder &Builder) const;
871
872 virtual const char *getVAListDeclaration() const {
873 return "typedef char* __builtin_va_list;";
874 }
875 virtual const char *getTargetPrefix() const {
876 return "mblaze";
877 }
878 virtual void getGCCRegNames(const char * const *&Names,
879 unsigned &NumNames) const;
880 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
881 unsigned &NumAliases) const;
882 virtual bool validateAsmConstraint(const char *&Name,
883 TargetInfo::ConstraintInfo &Info) const {
884 switch (*Name) {
885 default: return false;
886 case 'O': // Zero
887 return true;
888 case 'b': // Base register
889 case 'f': // Floating point register
890 Info.setAllowsRegister();
891 return true;
892 }
893 }
894 virtual const char *getClobbers() const {
895 return "";
896 }
897};
898
899/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
900/// #defines that are not tied to a specific subtarget.
901void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
902 MacroBuilder &Builder) const {
903 // Target identification.
904 Builder.defineMacro("__microblaze__");
905 Builder.defineMacro("_ARCH_MICROBLAZE");
906 Builder.defineMacro("__MICROBLAZE__");
907
908 // Target properties.
909 Builder.defineMacro("_BIG_ENDIAN");
910 Builder.defineMacro("__BIG_ENDIAN__");
911
912 // Subtarget options.
913 Builder.defineMacro("__REGISTER_PREFIX__", "");
914}
915
916
917const char * const MBlazeTargetInfo::GCCRegNames[] = {
918 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
919 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
920 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
921 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
922 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
923 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
924 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
925 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
926 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
927 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
928};
929
930void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
931 unsigned &NumNames) const {
932 Names = GCCRegNames;
933 NumNames = llvm::array_lengthof(GCCRegNames);
934}
935
936const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
937 { {"f0"}, "r0" },
938 { {"f1"}, "r1" },
939 { {"f2"}, "r2" },
940 { {"f3"}, "r3" },
941 { {"f4"}, "r4" },
942 { {"f5"}, "r5" },
943 { {"f6"}, "r6" },
944 { {"f7"}, "r7" },
945 { {"f8"}, "r8" },
946 { {"f9"}, "r9" },
947 { {"f10"}, "r10" },
948 { {"f11"}, "r11" },
949 { {"f12"}, "r12" },
950 { {"f13"}, "r13" },
951 { {"f14"}, "r14" },
952 { {"f15"}, "r15" },
953 { {"f16"}, "r16" },
954 { {"f17"}, "r17" },
955 { {"f18"}, "r18" },
956 { {"f19"}, "r19" },
957 { {"f20"}, "r20" },
958 { {"f21"}, "r21" },
959 { {"f22"}, "r22" },
960 { {"f23"}, "r23" },
961 { {"f24"}, "r24" },
962 { {"f25"}, "r25" },
963 { {"f26"}, "r26" },
964 { {"f27"}, "r27" },
965 { {"f28"}, "r28" },
966 { {"f29"}, "r29" },
967 { {"f30"}, "r30" },
968 { {"f31"}, "r31" },
969};
970
971void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
972 unsigned &NumAliases) const {
973 Aliases = GCCRegAliases;
974 NumAliases = llvm::array_lengthof(GCCRegAliases);
975}
976} // end anonymous namespace.
977
978namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000979// Namespace for x86 abstract base class
980const Builtin::Info BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000981#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
982#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
983 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000984#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +0000985};
Eli Friedmanb5366062008-05-20 14:21:01 +0000986
Nuno Lopescfca1f02009-12-23 17:49:57 +0000987static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000988 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
989 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
990 "argp", "flags", "fspr", "dirflag", "frame",
991 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
992 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
993 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
994 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
995};
996
997const TargetInfo::GCCRegAlias GCCRegAliases[] = {
998 { { "al", "ah", "eax", "rax" }, "ax" },
999 { { "bl", "bh", "ebx", "rbx" }, "bx" },
1000 { { "cl", "ch", "ecx", "rcx" }, "cx" },
1001 { { "dl", "dh", "edx", "rdx" }, "dx" },
1002 { { "esi", "rsi" }, "si" },
1003 { { "edi", "rdi" }, "di" },
1004 { { "esp", "rsp" }, "sp" },
1005 { { "ebp", "rbp" }, "bp" },
1006};
1007
1008// X86 target abstract base class; x86-32 and x86-64 are very close, so
1009// most of the implementation can be shared.
1010class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001011 enum X86SSEEnum {
1012 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
1013 } SSELevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001014 enum AMD3DNowEnum {
1015 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
1016 } AMD3DNowLevel;
1017
Eric Christophere1ddaf92010-04-02 23:50:19 +00001018 bool HasAES;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001019 bool HasAVX;
1020
Eli Friedman3fd920a2008-08-20 02:34:37 +00001021public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001022 X86TargetInfo(const std::string& triple)
Eric Christophere1ddaf92010-04-02 23:50:19 +00001023 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001024 HasAES(false), HasAVX(false) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001025 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001026 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001027 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1028 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001029 Records = BuiltinInfo;
1030 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001031 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001032 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001033 unsigned &NumNames) const {
1034 Names = GCCRegNames;
1035 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001036 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001037 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001038 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001039 Aliases = GCCRegAliases;
1040 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +00001041 }
Anders Carlsson58436352009-02-28 17:11:49 +00001042 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001043 TargetInfo::ConstraintInfo &info) const;
1044 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001045 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001046 return "~{dirflag},~{fpsr},~{flags}";
1047 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001048 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001049 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001050 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1051 const std::string &Name,
1052 bool Enabled) const;
Mike Stump11289f42009-09-09 15:08:12 +00001053 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001054 llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001055 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Chris Lattner5ba61f02006-10-14 07:39:34 +00001056};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001057
Mike Stump11289f42009-09-09 15:08:12 +00001058void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001059 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001060 // FIXME: This should not be here.
1061 Features["3dnow"] = false;
1062 Features["3dnowa"] = false;
1063 Features["mmx"] = false;
1064 Features["sse"] = false;
1065 Features["sse2"] = false;
1066 Features["sse3"] = false;
1067 Features["ssse3"] = false;
1068 Features["sse41"] = false;
1069 Features["sse42"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001070 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001071 Features["avx"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001072
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001073 // LLVM does not currently recognize this.
1074 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001075
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001076 // FIXME: This *really* should not be here.
1077
1078 // X86_64 always has SSE2.
1079 if (PointerWidth == 64)
1080 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1081
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001082 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1083 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1084 ;
1085 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1086 setFeatureEnabled(Features, "mmx", true);
1087 else if (CPU == "pentium3")
1088 setFeatureEnabled(Features, "sse", true);
1089 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1090 setFeatureEnabled(Features, "sse2", true);
1091 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1092 setFeatureEnabled(Features, "sse3", true);
1093 else if (CPU == "core2")
1094 setFeatureEnabled(Features, "ssse3", true);
1095 else if (CPU == "penryn") {
1096 setFeatureEnabled(Features, "sse4", true);
1097 Features["sse42"] = false;
1098 } else if (CPU == "atom")
1099 setFeatureEnabled(Features, "sse3", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001100 else if (CPU == "corei7") {
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001101 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001102 setFeatureEnabled(Features, "aes", true);
Roman Divacky27ec14f2011-04-05 20:32:44 +00001103 } else if (CPU == "sandybridge") {
1104 setFeatureEnabled(Features, "sse4", true);
1105 setFeatureEnabled(Features, "aes", true);
1106// setFeatureEnabled(Features, "avx", true);
1107 } else if (CPU == "k6" || CPU == "winchip-c6")
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001108 setFeatureEnabled(Features, "mmx", true);
Mike Stump11289f42009-09-09 15:08:12 +00001109 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001110 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1111 setFeatureEnabled(Features, "mmx", true);
1112 setFeatureEnabled(Features, "3dnow", true);
1113 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1114 setFeatureEnabled(Features, "sse", true);
1115 setFeatureEnabled(Features, "3dnowa", true);
1116 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1117 CPU == "athlon-fx") {
Mike Stump11289f42009-09-09 15:08:12 +00001118 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001119 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001120 } else if (CPU == "k8-sse3") {
1121 setFeatureEnabled(Features, "sse3", true);
1122 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001123 } else if (CPU == "c3-2")
1124 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001125}
1126
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001127bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001128 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001129 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001130 // FIXME: This *really* should not be here. We need some way of translating
1131 // options into llvm subtarget features.
1132 if (!Features.count(Name) &&
1133 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001134 return false;
1135
1136 if (Enabled) {
1137 if (Name == "mmx")
1138 Features["mmx"] = true;
1139 else if (Name == "sse")
1140 Features["mmx"] = Features["sse"] = true;
1141 else if (Name == "sse2")
1142 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1143 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001144 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001145 Features["sse3"] = true;
1146 else if (Name == "ssse3")
Mike Stump11289f42009-09-09 15:08:12 +00001147 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001148 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001149 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump11289f42009-09-09 15:08:12 +00001150 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001151 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001152 else if (Name == "sse4.1")
1153 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1154 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001155 else if (Name == "3dnow")
1156 Features["3dnowa"] = true;
1157 else if (Name == "3dnowa")
1158 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001159 else if (Name == "aes")
1160 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001161 else if (Name == "avx")
1162 Features["avx"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001163 } else {
1164 if (Name == "mmx")
Michael J. Spencera9e41172011-04-17 19:22:03 +00001165 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] =
1166 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001167 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1168 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001169 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001170 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1171 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001172 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001173 Features["sse41"] = Features["sse42"] = false;
1174 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001175 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001176 Features["sse42"] = false;
1177 else if (Name == "ssse3")
1178 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencera9e41172011-04-17 19:22:03 +00001179 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001180 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001181 else if (Name == "sse4.2")
1182 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001183 else if (Name == "3dnow")
1184 Features["3dnow"] = Features["3dnowa"] = false;
1185 else if (Name == "3dnowa")
1186 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001187 else if (Name == "aes")
1188 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001189 else if (Name == "avx")
1190 Features["avx"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001191 }
1192
1193 return true;
1194}
1195
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001196/// HandleTargetOptions - Perform initialization based on the user
1197/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001198void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001199 // Remember the maximum enabled sselevel.
1200 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1201 // Ignore disabled features.
1202 if (Features[i][0] == '-')
1203 continue;
1204
Eric Christophere1ddaf92010-04-02 23:50:19 +00001205 if (Features[i].substr(1) == "aes") {
1206 HasAES = true;
1207 continue;
1208 }
1209
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001210 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1211 // For now let it be enabled together with other SSE levels.
1212 if (Features[i].substr(1) == "avx") {
1213 HasAVX = true;
1214 continue;
1215 }
1216
Daniel Dunbar979586e2009-11-11 09:38:56 +00001217 assert(Features[i][0] == '+' && "Invalid target feature!");
1218 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1219 .Case("sse42", SSE42)
1220 .Case("sse41", SSE41)
1221 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001222 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001223 .Case("sse2", SSE2)
1224 .Case("sse", SSE1)
1225 .Case("mmx", MMX)
1226 .Default(NoMMXSSE);
1227 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001228
1229 AMD3DNowEnum ThreeDNowLevel =
Anders Carlssone437c682010-01-27 03:47:49 +00001230 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1231 .Case("3dnowa", AMD3DNowAthlon)
1232 .Case("3dnow", AMD3DNow)
1233 .Default(NoAMD3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001234
Anders Carlssone437c682010-01-27 03:47:49 +00001235 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001236 }
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001237}
Chris Lattnerecd49032009-03-02 22:27:17 +00001238
1239/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1240/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001241void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001242 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001243 // Target identification.
1244 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001245 Builder.defineMacro("_LP64");
1246 Builder.defineMacro("__LP64__");
1247 Builder.defineMacro("__amd64__");
1248 Builder.defineMacro("__amd64");
1249 Builder.defineMacro("__x86_64");
1250 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001251 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001252 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001253 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001254
Eric Christophere1ddaf92010-04-02 23:50:19 +00001255 if (HasAES)
1256 Builder.defineMacro("__AES__");
1257
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001258 if (HasAVX)
1259 Builder.defineMacro("__AVX__");
1260
Chris Lattnerecd49032009-03-02 22:27:17 +00001261 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001262 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001263
Chris Lattnerecd49032009-03-02 22:27:17 +00001264 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001265 Builder.defineMacro("__nocona");
1266 Builder.defineMacro("__nocona__");
1267 Builder.defineMacro("__tune_nocona__");
1268 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +00001269
Chris Lattner6df41af2009-04-19 17:32:33 +00001270 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1271 // functions in glibc header files that use FP Stack inline asm which the
1272 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001273 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001274
Chris Lattner96e43572009-03-02 22:40:39 +00001275 // Each case falls through to the previous one here.
1276 switch (SSELevel) {
1277 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001278 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00001279 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001280 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00001281 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001282 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001283 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001284 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001285 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001286 Builder.defineMacro("__SSE2__");
1287 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001288 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001289 Builder.defineMacro("__SSE__");
1290 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001291 case MMX:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001292 Builder.defineMacro("__MMX__");
Chris Lattner96e43572009-03-02 22:40:39 +00001293 case NoMMXSSE:
1294 break;
1295 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001296
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001297 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001298 switch (SSELevel) {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001299 case SSE42:
1300 case SSE41:
1301 case SSSE3:
1302 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001303 case SSE2:
1304 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1305 break;
1306 case SSE1:
1307 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1308 break;
1309 default:
1310 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1311 }
1312 }
1313
Anders Carlssone437c682010-01-27 03:47:49 +00001314 // Each case falls through to the previous one here.
1315 switch (AMD3DNowLevel) {
1316 case AMD3DNowAthlon:
1317 Builder.defineMacro("__3dNOW_A__");
1318 case AMD3DNow:
1319 Builder.defineMacro("__3dNOW__");
1320 case NoAMD3DNow:
1321 break;
1322 }
Chris Lattnerecd49032009-03-02 22:27:17 +00001323}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001324
1325
Eli Friedman3fd920a2008-08-20 02:34:37 +00001326bool
Anders Carlsson58436352009-02-28 17:11:49 +00001327X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001328 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00001329 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001330 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00001331 case 'Y': // first letter of a pair:
1332 switch (*(Name+1)) {
1333 default: return false;
1334 case '0': // First SSE register.
1335 case 't': // Any SSE register, when SSE2 is enabled.
1336 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1337 case 'm': // any MMX register, when inter-unit moves enabled.
1338 break; // falls through to setAllowsRegister.
1339 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001340 case 'a': // eax.
1341 case 'b': // ebx.
1342 case 'c': // ecx.
1343 case 'd': // edx.
1344 case 'S': // esi.
1345 case 'D': // edi.
1346 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00001347 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001348 case 't': // top of floating point stack.
1349 case 'u': // second from top of floating point stack.
1350 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00001351 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00001352 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001353 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00001354 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1355 case 'l': // "Index" registers: any general register that can be used as an
1356 // index in a base+index memory access.
1357 Info.setAllowsRegister();
1358 return true;
1359 case 'C': // SSE floating point constant.
1360 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001361 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001362 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001363 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001364 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001365 return true;
1366 }
Dale Johannesen46742a42010-08-24 22:33:12 +00001367 return false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001368}
1369
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00001370
Eli Friedman3fd920a2008-08-20 02:34:37 +00001371std::string
1372X86TargetInfo::convertConstraint(const char Constraint) const {
1373 switch (Constraint) {
1374 case 'a': return std::string("{ax}");
1375 case 'b': return std::string("{bx}");
1376 case 'c': return std::string("{cx}");
1377 case 'd': return std::string("{dx}");
1378 case 'S': return std::string("{si}");
1379 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00001380 case 'p': // address
1381 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00001382 case 't': // top of floating point stack.
1383 return std::string("{st}");
1384 case 'u': // second from top of floating point stack.
1385 return std::string("{st(1)}"); // second from top of floating point stack.
1386 default:
1387 return std::string(1, Constraint);
1388 }
1389}
Eli Friedman3fd920a2008-08-20 02:34:37 +00001390} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00001391
1392namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001393// X86-32 generic target
1394class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001395public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00001396 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1397 DoubleAlign = LongLongAlign = 32;
1398 LongDoubleWidth = 96;
1399 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +00001400 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1401 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001402 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +00001403 SizeType = UnsignedInt;
1404 PtrDiffType = SignedInt;
1405 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001406 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001407
1408 // Use fpret for all types.
1409 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1410 (1 << TargetInfo::Double) |
1411 (1 << TargetInfo::LongDouble));
Eli Friedman3fd920a2008-08-20 02:34:37 +00001412 }
1413 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001414 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00001415 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001416
Chris Lattnerd545ad12009-09-23 06:06:36 +00001417 int getEHDataRegisterNumber(unsigned RegNo) const {
1418 if (RegNo == 0) return 0;
1419 if (RegNo == 1) return 2;
1420 return -1;
1421 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001422};
1423} // end anonymous namespace
1424
1425namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00001426class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1427public:
1428 OpenBSDI386TargetInfo(const std::string& triple) :
1429 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1430 SizeType = UnsignedLong;
1431 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00001432 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00001433 }
1434};
1435} // end anonymous namespace
1436
1437namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00001438class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001439public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00001440 DarwinI386TargetInfo(const std::string& triple) :
1441 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001442 LongDoubleWidth = 128;
1443 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00001444 SizeType = UnsignedLong;
1445 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00001446 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1447 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001448 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbarbd606522010-05-27 00:35:16 +00001449 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00001450 }
1451
Eli Friedman3fd920a2008-08-20 02:34:37 +00001452};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00001453} // end anonymous namespace
1454
1455namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001456// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001457class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001458public:
1459 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001460 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001461 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00001462 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00001463 DoubleAlign = LongLongAlign = 64;
1464 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 +00001465 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1466 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001467 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001468 virtual void getTargetDefines(const LangOptions &Opts,
1469 MacroBuilder &Builder) const {
1470 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1471 }
1472};
1473} // end anonymous namespace
1474
1475namespace {
1476
1477// x86-32 Windows Visual Studio target
1478class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1479public:
1480 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1481 : WindowsX86_32TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00001482 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001483 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1484 }
1485 virtual void getTargetDefines(const LangOptions &Opts,
1486 MacroBuilder &Builder) const {
1487 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1488 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1489 // The value of the following reflects processor type.
1490 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1491 // We lost the original triple, so we use the default.
1492 Builder.defineMacro("_M_IX86", "600");
1493 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001494};
1495} // end anonymous namespace
1496
1497namespace {
1498// x86-32 MinGW target
1499class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1500public:
1501 MinGWX86_32TargetInfo(const std::string& triple)
1502 : WindowsX86_32TargetInfo(triple) {
1503 }
1504 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001505 MacroBuilder &Builder) const {
1506 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001507 DefineStd(Builder, "WIN32", Opts);
1508 DefineStd(Builder, "WINNT", Opts);
1509 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001510 Builder.defineMacro("__MSVCRT__");
1511 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001512
1513 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1514 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1515 if (Opts.Microsoft)
1516 // Provide "as-is" __declspec.
1517 Builder.defineMacro("__declspec", "__declspec");
1518 else
1519 // Provide alias of __attribute__ like mingw32-gcc.
1520 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001521 }
1522};
1523} // end anonymous namespace
1524
1525namespace {
1526// x86-32 Cygwin target
1527class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1528public:
1529 CygwinX86_32TargetInfo(const std::string& triple)
1530 : X86_32TargetInfo(triple) {
1531 TLSSupported = false;
1532 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001533 DoubleAlign = LongLongAlign = 64;
1534 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1535 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001536 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001537 }
1538 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001539 MacroBuilder &Builder) const {
1540 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1541 Builder.defineMacro("__CYGWIN__");
1542 Builder.defineMacro("__CYGWIN32__");
1543 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00001544 if (Opts.CPlusPlus)
1545 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00001546 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001547};
1548} // end anonymous namespace
1549
1550namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00001551// x86-32 Haiku target
1552class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1553public:
1554 HaikuX86_32TargetInfo(const std::string& triple)
1555 : X86_32TargetInfo(triple) {
1556 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00001557 IntPtrType = SignedLong;
1558 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00001559 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00001560 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00001561 virtual void getTargetDefines(const LangOptions &Opts,
1562 MacroBuilder &Builder) const {
1563 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1564 Builder.defineMacro("__INTEL__");
1565 Builder.defineMacro("__HAIKU__");
1566 }
1567};
1568} // end anonymous namespace
1569
1570namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001571// x86-64 generic target
1572class X86_64TargetInfo : public X86TargetInfo {
1573public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001574 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001575 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00001576 LongDoubleWidth = 128;
1577 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00001578 LargeArrayMinWidth = 128;
1579 LargeArrayAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001580 IntMaxType = SignedLong;
1581 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001582 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001583 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001584
Eli Friedman873f65a2008-08-21 00:13:15 +00001585 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1586 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001587 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001588
1589 // Use fpret only for long double.
1590 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Chris Lattner10a5b382007-01-29 05:24:35 +00001591 }
Anders Carlssona7408e72007-10-13 00:45:48 +00001592 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001593 return "typedef struct __va_list_tag {"
1594 " unsigned gp_offset;"
1595 " unsigned fp_offset;"
1596 " void* overflow_arg_area;"
1597 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00001598 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00001599 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001600 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001601
Chris Lattnerd545ad12009-09-23 06:06:36 +00001602 int getEHDataRegisterNumber(unsigned RegNo) const {
1603 if (RegNo == 0) return 0;
1604 if (RegNo == 1) return 1;
1605 return -1;
1606 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001607};
1608} // end anonymous namespace
1609
1610namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001611// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001612class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001613public:
1614 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001615 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001616 TLSSupported = false;
1617 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00001618 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001619 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00001620 IntMaxType = SignedLongLong;
1621 UIntMaxType = UnsignedLongLong;
1622 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00001623 SizeType = UnsignedLongLong;
1624 PtrDiffType = SignedLongLong;
1625 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00001626 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001627 }
1628 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001629 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001630 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001631 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001632 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00001633 virtual const char *getVAListDeclaration() const {
1634 return "typedef char* __builtin_va_list;";
1635 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001636};
1637} // end anonymous namespace
1638
1639namespace {
1640// x86-64 Windows Visual Studio target
1641class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1642public:
1643 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1644 : WindowsX86_64TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00001645 LongDoubleWidth = LongDoubleAlign = 64;
1646 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001647 }
1648 virtual void getTargetDefines(const LangOptions &Opts,
1649 MacroBuilder &Builder) const {
1650 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1651 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001652 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001653 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001654 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001655};
1656} // end anonymous namespace
1657
1658namespace {
1659// x86-64 MinGW target
1660class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1661public:
1662 MinGWX86_64TargetInfo(const std::string& triple)
1663 : WindowsX86_64TargetInfo(triple) {
1664 }
1665 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001666 MacroBuilder &Builder) const {
1667 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001668 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001669 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00001670 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001671 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001672
1673 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1674 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1675 if (Opts.Microsoft)
1676 // Provide "as-is" __declspec.
1677 Builder.defineMacro("__declspec", "__declspec");
1678 else
1679 // Provide alias of __attribute__ like mingw32-gcc.
1680 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001681 }
1682};
1683} // end anonymous namespace
1684
1685namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00001686class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1687public:
Mike Stump11289f42009-09-09 15:08:12 +00001688 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00001689 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1690 Int64Type = SignedLongLong;
1691 }
1692};
1693} // end anonymous namespace
1694
1695namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00001696class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1697public:
Mike Stump11289f42009-09-09 15:08:12 +00001698 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00001699 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1700 IntMaxType = SignedLongLong;
1701 UIntMaxType = UnsignedLongLong;
1702 Int64Type = SignedLongLong;
1703 }
1704};
1705} // end anonymous namespace
1706
1707namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001708class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001709 // Possible FPU choices.
1710 enum FPUMode {
1711 NoFPU,
1712 VFP2FPU,
1713 VFP3FPU,
1714 NeonFPU
1715 };
1716
1717 static bool FPUModeIsVFP(FPUMode Mode) {
1718 return Mode >= VFP2FPU && Mode <= NeonFPU;
1719 }
1720
1721 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1722 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001723
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001724 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001725
1726 unsigned FPU : 3;
1727
Daniel Dunbar893d4752009-12-19 04:15:38 +00001728 unsigned IsThumb : 1;
1729
1730 // Initialized via features.
1731 unsigned SoftFloat : 1;
1732 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001733
Chris Lattner5cc15e02010-03-03 19:03:45 +00001734 static const Builtin::Info BuiltinInfo[];
1735
Chris Lattner17df24e2008-04-21 18:56:49 +00001736public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001737 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001738 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001739 {
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001740 SizeType = UnsignedInt;
1741 PtrDiffType = SignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001742
Chris Lattner1a8f3942010-04-23 16:29:58 +00001743 // {} in inline assembly are neon specifiers, not assembly variant
1744 // specifiers.
1745 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001746
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001747 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00001748 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00001749 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00001750 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1751 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00001752 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1753 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001754 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001755 } else {
1756 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1757 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001758 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001759 }
John McCall86353412010-08-21 22:46:04 +00001760
1761 // ARM targets default to using the ARM C++ ABI.
1762 CXXABI = CXXABI_ARM;
Eli Friedmanb5366062008-05-20 14:21:01 +00001763 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001764 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001765 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001766 ABI = Name;
1767
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001768 // The defaults (above) are for AAPCS, check if we need to change them.
1769 //
1770 // FIXME: We need support for -meabi... we could just mangle it into the
1771 // name.
1772 if (Name == "apcs-gnu") {
Daniel Dunbar377dc2f2010-01-27 20:23:08 +00001773 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001774 SizeType = UnsignedLong;
1775
Daniel Dunbarf8125062010-04-22 16:14:54 +00001776 // Do not respect the alignment of bit-field types when laying out
1777 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1778 UseBitFieldTypeAlignment = false;
1779
Daniel Dunbar03184792009-09-22 21:44:58 +00001780 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00001781 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1782 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00001783 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1784 "i64:32:32-f32:32:32-f64:32:32-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001785 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001786 } else {
1787 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 +00001788 "i64:32:64-f32:32:32-f64:32:64-"
1789 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001790 }
1791
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001792 // FIXME: Override "preferred align" for double and long long.
1793 } else if (Name == "aapcs") {
1794 // FIXME: Enumerated types are variable width in straight AAPCS.
1795 } else if (Name == "aapcs-linux") {
1796 ;
1797 } else
1798 return false;
1799
1800 return true;
1801 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001802
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001803 void getDefaultFeatures(const std::string &CPU,
1804 llvm::StringMap<bool> &Features) const {
1805 // FIXME: This should not be here.
1806 Features["vfp2"] = false;
1807 Features["vfp3"] = false;
1808 Features["neon"] = false;
1809
1810 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1811 Features["vfp2"] = true;
1812 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1813 Features["neon"] = true;
1814 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001815
Daniel Dunbar893d4752009-12-19 04:15:38 +00001816 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1817 const std::string &Name,
1818 bool Enabled) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001819 if (Name == "soft-float" || Name == "soft-float-abi") {
1820 Features[Name] = Enabled;
1821 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1822 // These effectively are a single option, reset them when any is enabled.
1823 if (Enabled)
1824 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1825 Features[Name] = Enabled;
1826 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00001827 return false;
1828
Daniel Dunbar893d4752009-12-19 04:15:38 +00001829 return true;
1830 }
1831
1832 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001833 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001834 SoftFloat = SoftFloatABI = false;
1835 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1836 if (Features[i] == "+soft-float")
1837 SoftFloat = true;
1838 else if (Features[i] == "+soft-float-abi")
1839 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001840 else if (Features[i] == "+vfp2")
1841 FPU = VFP2FPU;
1842 else if (Features[i] == "+vfp3")
1843 FPU = VFP3FPU;
1844 else if (Features[i] == "+neon")
1845 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001846 }
1847
1848 // Remove front-end specific options which the backend handles differently.
1849 std::vector<std::string>::iterator it;
1850 it = std::find(Features.begin(), Features.end(), "+soft-float");
1851 if (it != Features.end())
1852 Features.erase(it);
1853 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1854 if (it != Features.end())
1855 Features.erase(it);
1856 }
1857
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001858 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1859 return llvm::StringSwitch<const char*>(Name)
1860 .Cases("arm8", "arm810", "4")
1861 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1862 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1863 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1864 .Case("ep9312", "4T")
1865 .Cases("arm10tdmi", "arm1020t", "5T")
1866 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1867 .Case("arm926ej-s", "5TEJ")
1868 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1869 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001870 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001871 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001872 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001873 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1874 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00001875 .Case("cortex-m3", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00001876 .Case("cortex-m0", "6M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001877 .Default(0);
1878 }
1879 virtual bool setCPU(const std::string &Name) {
1880 if (!getCPUDefineSuffix(Name))
1881 return false;
1882
1883 CPU = Name;
1884 return true;
1885 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001886 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001887 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001888 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001889 Builder.defineMacro("__arm");
1890 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001891
Chris Lattnerecd49032009-03-02 22:27:17 +00001892 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001893 Builder.defineMacro("__ARMEL__");
1894 Builder.defineMacro("__LITTLE_ENDIAN__");
1895 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001896
1897 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001898 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001899
Mike Stump9d54bd72009-04-08 02:07:04 +00001900 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001901
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001902 // FIXME: It's more complicated than this and we don't really support
1903 // interworking.
1904 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001905 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001906
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001907 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001908 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001909
Daniel Dunbar893d4752009-12-19 04:15:38 +00001910 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001911 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001912
1913 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001914 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001915
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001916 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001917 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001918 Builder.defineMacro("__THUMBEL__");
1919 Builder.defineMacro("__thumb__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001920 if (IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001921 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001922 }
1923
1924 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001925 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001926
1927 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001928 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001929
1930 // This only gets set when Neon instructions are actually available, unlike
1931 // the VFP define, hence the soft float and arch check. This is subtly
1932 // different from gcc, we follow the intent which was that it should be set
1933 // when Neon instructions are actually available.
1934 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001935 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00001936 }
1937 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1938 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00001939 Records = BuiltinInfo;
1940 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00001941 }
1942 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001943 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00001944 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001945 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001946 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001947 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001948 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00001949 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001950 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001951 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00001952 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001953 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00001954 case 'l': // r0-r7
1955 case 'h': // r8-r15
1956 case 'w': // VFP Floating point register single precision
1957 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00001958 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00001959 return true;
1960 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001961 return false;
1962 }
1963 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001964 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00001965 return "";
1966 }
1967};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001968
1969const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001970 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001971 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001972 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
1973
1974 // Float registers
1975 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1976 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1977 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001978 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001979
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001980 // Double registers
1981 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
1982 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00001983 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
1984 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001985
1986 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00001987 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1988 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001989};
1990
1991void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00001992 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001993 Names = GCCRegNames;
1994 NumNames = llvm::array_lengthof(GCCRegNames);
1995}
1996
1997const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001998 { { "a1" }, "r0" },
1999 { { "a2" }, "r1" },
2000 { { "a3" }, "r2" },
2001 { { "a4" }, "r3" },
2002 { { "v1" }, "r4" },
2003 { { "v2" }, "r5" },
2004 { { "v3" }, "r6" },
2005 { { "v4" }, "r7" },
2006 { { "v5" }, "r8" },
2007 { { "v6", "rfp" }, "r9" },
2008 { { "sl" }, "r10" },
2009 { { "fp" }, "r11" },
2010 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002011 { { "r13" }, "sp" },
2012 { { "r14" }, "lr" },
2013 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002014 // The S, D and Q registers overlap, but aren't really aliases; we
2015 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002016};
2017
2018void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2019 unsigned &NumAliases) const {
2020 Aliases = GCCRegAliases;
2021 NumAliases = llvm::array_lengthof(GCCRegAliases);
2022}
Chris Lattner5cc15e02010-03-03 19:03:45 +00002023
2024const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00002025#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
2026#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2027 ALL_LANGUAGES, false },
Chris Lattner5cc15e02010-03-03 19:03:45 +00002028#include "clang/Basic/BuiltinsARM.def"
2029};
Chris Lattner17df24e2008-04-21 18:56:49 +00002030} // end anonymous namespace.
2031
Eli Friedmanf05b7722008-08-20 07:44:10 +00002032
2033namespace {
Mike Stump11289f42009-09-09 15:08:12 +00002034class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002035 public DarwinTargetInfo<ARMTargetInfo> {
2036protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00002037 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002038 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00002039 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00002040 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002041
Torok Edwinb2b37c62009-06-30 17:10:35 +00002042public:
Mike Stump11289f42009-09-09 15:08:12 +00002043 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002044 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2045 HasAlignMac68kSupport = true;
2046 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002047};
2048} // end anonymous namespace.
2049
Chris Lattner5ba61f02006-10-14 07:39:34 +00002050namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002051class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00002052 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2053 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002054 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00002055public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002056 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2057 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00002058 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 +00002059 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002060 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002061 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2062 const std::string &Name,
2063 bool Enabled) const {
2064 if (Name == "soft-float")
2065 Features[Name] = Enabled;
2066 else
2067 return false;
2068
2069 return true;
2070 }
2071 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2072 SoftFloat = false;
2073 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2074 if (Features[i] == "+soft-float")
2075 SoftFloat = true;
2076 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002077 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002078 MacroBuilder &Builder) const {
2079 DefineStd(Builder, "sparc", Opts);
2080 Builder.defineMacro("__sparcv8");
2081 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002082
2083 if (SoftFloat)
2084 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00002085 }
2086 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2087 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002088 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00002089 }
2090 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002091 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00002092 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002093 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002094 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002095 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002096 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002097 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00002098 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002099 // FIXME: Implement!
2100 return false;
Gabor Greif49991682008-02-21 16:29:08 +00002101 }
2102 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002103 // FIXME: Implement!
2104 return "";
Gabor Greif49991682008-02-21 16:29:08 +00002105 }
2106};
2107
Chris Lattner9b415d62009-01-27 01:58:38 +00002108const char * const SparcV8TargetInfo::GCCRegNames[] = {
2109 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2110 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2111 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2112 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2113};
2114
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002115void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002116 unsigned &NumNames) const {
2117 Names = GCCRegNames;
2118 NumNames = llvm::array_lengthof(GCCRegNames);
2119}
2120
2121const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002122 { { "g0" }, "r0" },
2123 { { "g1" }, "r1" },
2124 { { "g2" }, "r2" },
2125 { { "g3" }, "r3" },
2126 { { "g4" }, "r4" },
2127 { { "g5" }, "r5" },
2128 { { "g6" }, "r6" },
2129 { { "g7" }, "r7" },
2130 { { "o0" }, "r8" },
2131 { { "o1" }, "r9" },
2132 { { "o2" }, "r10" },
2133 { { "o3" }, "r11" },
2134 { { "o4" }, "r12" },
2135 { { "o5" }, "r13" },
2136 { { "o6", "sp" }, "r14" },
2137 { { "o7" }, "r15" },
2138 { { "l0" }, "r16" },
2139 { { "l1" }, "r17" },
2140 { { "l2" }, "r18" },
2141 { { "l3" }, "r19" },
2142 { { "l4" }, "r20" },
2143 { { "l5" }, "r21" },
2144 { { "l6" }, "r22" },
2145 { { "l7" }, "r23" },
2146 { { "i0" }, "r24" },
2147 { { "i1" }, "r25" },
2148 { { "i2" }, "r26" },
2149 { { "i3" }, "r27" },
2150 { { "i4" }, "r28" },
2151 { { "i5" }, "r29" },
2152 { { "i6", "fp" }, "r30" },
2153 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00002154};
2155
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002156void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002157 unsigned &NumAliases) const {
2158 Aliases = GCCRegAliases;
2159 NumAliases = llvm::array_lengthof(GCCRegAliases);
2160}
Gabor Greif49991682008-02-21 16:29:08 +00002161} // end anonymous namespace.
2162
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002163namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002164class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2165public:
2166 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2167 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2168 SizeType = UnsignedInt;
2169 PtrDiffType = SignedInt;
2170 }
2171};
Torok Edwinb2b37c62009-06-30 17:10:35 +00002172class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002173public:
2174 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002175 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00002176 SizeType = UnsignedInt;
2177 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002178 }
2179};
2180} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00002181
Chris Lattnerb781dc792008-05-08 05:58:21 +00002182namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002183 class MSP430TargetInfo : public TargetInfo {
2184 static const char * const GCCRegNames[];
2185 public:
2186 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2187 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00002188 IntWidth = 16; IntAlign = 16;
2189 LongWidth = 32; LongLongWidth = 64;
2190 LongAlign = LongLongAlign = 16;
2191 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002192 SizeType = UnsignedInt;
2193 IntMaxType = SignedLong;
2194 UIntMaxType = UnsignedLong;
2195 IntPtrType = SignedShort;
2196 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00002197 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00002198 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002199 }
2200 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002201 MacroBuilder &Builder) const {
2202 Builder.defineMacro("MSP430");
2203 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002204 // FIXME: defines for different 'flavours' of MCU
2205 }
2206 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2207 unsigned &NumRecords) const {
2208 // FIXME: Implement.
2209 Records = 0;
2210 NumRecords = 0;
2211 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002212 virtual void getGCCRegNames(const char * const *&Names,
2213 unsigned &NumNames) const;
2214 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2215 unsigned &NumAliases) const {
2216 // No aliases.
2217 Aliases = 0;
2218 NumAliases = 0;
2219 }
2220 virtual bool validateAsmConstraint(const char *&Name,
2221 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00002222 // No target constraints for now.
2223 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002224 }
2225 virtual const char *getClobbers() const {
2226 // FIXME: Is this really right?
2227 return "";
2228 }
2229 virtual const char *getVAListDeclaration() const {
2230 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00002231 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002232 }
2233 };
2234
2235 const char * const MSP430TargetInfo::GCCRegNames[] = {
2236 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2237 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2238 };
2239
2240 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2241 unsigned &NumNames) const {
2242 Names = GCCRegNames;
2243 NumNames = llvm::array_lengthof(GCCRegNames);
2244 }
2245}
2246
2247
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002248namespace {
2249 class SystemZTargetInfo : public TargetInfo {
2250 static const char * const GCCRegNames[];
2251 public:
2252 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2253 TLSSupported = false;
2254 IntWidth = IntAlign = 32;
2255 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2256 PointerWidth = PointerAlign = 64;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002257 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2258 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002259 }
2260 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002261 MacroBuilder &Builder) const {
2262 Builder.defineMacro("__s390__");
2263 Builder.defineMacro("__s390x__");
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002264 }
2265 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2266 unsigned &NumRecords) const {
2267 // FIXME: Implement.
2268 Records = 0;
2269 NumRecords = 0;
2270 }
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002271
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002272 virtual void getGCCRegNames(const char * const *&Names,
2273 unsigned &NumNames) const;
2274 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2275 unsigned &NumAliases) const {
2276 // No aliases.
2277 Aliases = 0;
2278 NumAliases = 0;
2279 }
2280 virtual bool validateAsmConstraint(const char *&Name,
2281 TargetInfo::ConstraintInfo &info) const {
2282 // FIXME: implement
2283 return true;
2284 }
2285 virtual const char *getClobbers() const {
2286 // FIXME: Is this really right?
2287 return "";
2288 }
2289 virtual const char *getVAListDeclaration() const {
2290 // FIXME: implement
2291 return "typedef char* __builtin_va_list;";
2292 }
2293 };
2294
2295 const char * const SystemZTargetInfo::GCCRegNames[] = {
2296 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2297 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2298 };
2299
2300 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2301 unsigned &NumNames) const {
2302 Names = GCCRegNames;
2303 NumNames = llvm::array_lengthof(GCCRegNames);
2304 }
2305}
2306
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002307namespace {
2308 class BlackfinTargetInfo : public TargetInfo {
2309 static const char * const GCCRegNames[];
2310 public:
2311 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2312 TLSSupported = false;
2313 DoubleAlign = 32;
2314 LongLongAlign = 32;
2315 LongDoubleAlign = 32;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002316 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002317 }
2318
2319 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002320 MacroBuilder &Builder) const {
2321 DefineStd(Builder, "bfin", Opts);
2322 DefineStd(Builder, "BFIN", Opts);
2323 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002324 // FIXME: This one is really dependent on -mcpu
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002325 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002326 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2327 }
2328
2329 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2330 unsigned &NumRecords) const {
2331 // FIXME: Implement.
2332 Records = 0;
2333 NumRecords = 0;
2334 }
2335
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002336 virtual void getGCCRegNames(const char * const *&Names,
2337 unsigned &NumNames) const;
2338
2339 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2340 unsigned &NumAliases) const {
2341 // No aliases.
2342 Aliases = 0;
2343 NumAliases = 0;
2344 }
2345
2346 virtual bool validateAsmConstraint(const char *&Name,
2347 TargetInfo::ConstraintInfo &Info) const {
2348 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2349 Info.setAllowsRegister();
2350 return true;
2351 }
2352 return false;
2353 }
2354
2355 virtual const char *getClobbers() const {
2356 return "";
2357 }
2358
2359 virtual const char *getVAListDeclaration() const {
2360 return "typedef char* __builtin_va_list;";
2361 }
2362 };
2363
2364 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2365 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2366 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2367 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2368 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2369 "a0", "a1", "cc",
2370 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2371 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2372 };
2373
2374 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2375 unsigned &NumNames) const {
2376 Names = GCCRegNames;
2377 NumNames = llvm::array_lengthof(GCCRegNames);
2378 }
2379}
2380
Eli Friedmana9c3d712009-08-19 20:47:07 +00002381namespace {
2382
Mike Stump11289f42009-09-09 15:08:12 +00002383 // LLVM and Clang cannot be used directly to output native binaries for
2384 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00002385 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00002386 //
2387 // TCE uses the llvm bitcode as input and uses it for generating customized
2388 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00002389 // publicly available in http://tce.cs.tut.fi
2390
2391 class TCETargetInfo : public TargetInfo{
2392 public:
2393 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2394 TLSSupported = false;
2395 IntWidth = 32;
2396 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00002397 PointerWidth = 32;
2398 IntAlign = 32;
2399 LongAlign = LongLongAlign = 32;
2400 PointerAlign = 32;
2401 SizeType = UnsignedInt;
2402 IntMaxType = SignedLong;
2403 UIntMaxType = UnsignedLong;
2404 IntPtrType = SignedInt;
2405 PtrDiffType = SignedInt;
2406 FloatWidth = 32;
2407 FloatAlign = 32;
2408 DoubleWidth = 32;
2409 DoubleAlign = 32;
2410 LongDoubleWidth = 32;
2411 LongDoubleAlign = 32;
2412 FloatFormat = &llvm::APFloat::IEEEsingle;
2413 DoubleFormat = &llvm::APFloat::IEEEsingle;
2414 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00002415 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2416 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00002417 "f32:32:32-f64:32:32-v64:32:32-"
2418 "v128:32:32-a0:0:32-n32";
Eli Friedmana9c3d712009-08-19 20:47:07 +00002419 }
2420
2421 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002422 MacroBuilder &Builder) const {
2423 DefineStd(Builder, "tce", Opts);
2424 Builder.defineMacro("__TCE__");
2425 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00002426 }
2427 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2428 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00002429 virtual const char *getClobbers() const {
2430 return "";
2431 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002432 virtual const char *getVAListDeclaration() const {
2433 return "typedef void* __builtin_va_list;";
2434 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002435 virtual void getGCCRegNames(const char * const *&Names,
2436 unsigned &NumNames) const {}
2437 virtual bool validateAsmConstraint(const char *&Name,
2438 TargetInfo::ConstraintInfo &info) const {
2439 return true;
2440 }
2441 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2442 unsigned &NumAliases) const {}
2443 };
2444}
2445
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002446namespace {
2447class MipsTargetInfo : public TargetInfo {
Eric Christopher0b26a612010-03-02 02:41:08 +00002448 std::string ABI, CPU;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002449 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2450 static const char * const GCCRegNames[];
2451public:
Eric Christopher0b26a612010-03-02 02:41:08 +00002452 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002453 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2454 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2455 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002456 virtual const char *getABI() const { return ABI.c_str(); }
2457 virtual bool setABI(const std::string &Name) {
2458
2459 if ((Name == "o32") || (Name == "eabi")) {
2460 ABI = Name;
2461 return true;
2462 } else
2463 return false;
2464 }
2465 virtual bool setCPU(const std::string &Name) {
2466 CPU = Name;
2467 return true;
2468 }
2469 void getDefaultFeatures(const std::string &CPU,
2470 llvm::StringMap<bool> &Features) const {
2471 Features[ABI] = true;
2472 Features[CPU] = true;
2473 }
2474 virtual void getArchDefines(const LangOptions &Opts,
2475 MacroBuilder &Builder) const {
2476 if (ABI == "o32")
2477 Builder.defineMacro("__mips_o32");
2478 else if (ABI == "eabi")
2479 Builder.defineMacro("__mips_eabi");
2480 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002481 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002482 MacroBuilder &Builder) const {
2483 DefineStd(Builder, "mips", Opts);
2484 Builder.defineMacro("_mips");
2485 DefineStd(Builder, "MIPSEB", Opts);
2486 Builder.defineMacro("_MIPSEB");
2487 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002488 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002489 }
2490 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2491 unsigned &NumRecords) const {
2492 // FIXME: Implement!
2493 }
2494 virtual const char *getVAListDeclaration() const {
2495 return "typedef void* __builtin_va_list;";
2496 }
2497 virtual void getGCCRegNames(const char * const *&Names,
2498 unsigned &NumNames) const;
2499 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2500 unsigned &NumAliases) const;
2501 virtual bool validateAsmConstraint(const char *&Name,
2502 TargetInfo::ConstraintInfo &Info) const {
2503 switch (*Name) {
2504 default:
2505 case 'r': // CPU registers.
2506 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2507 case 'y': // Equivalent to "r", backwards compatibility only.
2508 case 'f': // floating-point registers.
2509 Info.setAllowsRegister();
2510 return true;
2511 }
2512 return false;
2513 }
2514
2515 virtual const char *getClobbers() const {
2516 // FIXME: Implement!
2517 return "";
2518 }
2519};
2520
2521const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002522 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002523 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2524 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2525 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2526 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2527 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2528 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2529 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2530 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2531 "$fcc5","$fcc6","$fcc7"
2532};
2533
2534void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2535 unsigned &NumNames) const {
2536 Names = GCCRegNames;
2537 NumNames = llvm::array_lengthof(GCCRegNames);
2538}
2539
2540const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2541 { { "at" }, "$1" },
2542 { { "v0" }, "$2" },
2543 { { "v1" }, "$3" },
2544 { { "a0" }, "$4" },
2545 { { "a1" }, "$5" },
2546 { { "a2" }, "$6" },
2547 { { "a3" }, "$7" },
2548 { { "t0" }, "$8" },
2549 { { "t1" }, "$9" },
2550 { { "t2" }, "$10" },
2551 { { "t3" }, "$11" },
2552 { { "t4" }, "$12" },
2553 { { "t5" }, "$13" },
2554 { { "t6" }, "$14" },
2555 { { "t7" }, "$15" },
2556 { { "s0" }, "$16" },
2557 { { "s1" }, "$17" },
2558 { { "s2" }, "$18" },
2559 { { "s3" }, "$19" },
2560 { { "s4" }, "$20" },
2561 { { "s5" }, "$21" },
2562 { { "s6" }, "$22" },
2563 { { "s7" }, "$23" },
2564 { { "t8" }, "$24" },
2565 { { "t9" }, "$25" },
2566 { { "k0" }, "$26" },
2567 { { "k1" }, "$27" },
2568 { { "gp" }, "$28" },
2569 { { "sp" }, "$29" },
2570 { { "fp" }, "$30" },
2571 { { "ra" }, "$31" }
2572};
2573
2574void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2575 unsigned &NumAliases) const {
2576 Aliases = GCCRegAliases;
2577 NumAliases = llvm::array_lengthof(GCCRegAliases);
2578}
2579} // end anonymous namespace.
2580
2581namespace {
2582class MipselTargetInfo : public MipsTargetInfo {
2583public:
2584 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2585 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2586 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2587 }
2588
2589 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002590 MacroBuilder &Builder) const;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002591};
2592
2593void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002594 MacroBuilder &Builder) const {
2595 DefineStd(Builder, "mips", Opts);
2596 Builder.defineMacro("_mips");
2597 DefineStd(Builder, "MIPSEL", Opts);
2598 Builder.defineMacro("_MIPSEL");
2599 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002600 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002601}
2602} // end anonymous namespace.
2603
Chris Lattner5ba61f02006-10-14 07:39:34 +00002604//===----------------------------------------------------------------------===//
2605// Driver code
2606//===----------------------------------------------------------------------===//
2607
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002608static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00002609 llvm::Triple Triple(T);
2610 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00002611
Daniel Dunbar52322032009-08-18 05:47:58 +00002612 switch (Triple.getArch()) {
2613 default:
2614 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00002615
Daniel Dunbar52322032009-08-18 05:47:58 +00002616 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00002617 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002618 if (Triple.isOSDarwin())
2619 return new DarwinARMTargetInfo(T);
2620
Daniel Dunbar52322032009-08-18 05:47:58 +00002621 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00002622 case llvm::Triple::Linux:
2623 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002624 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002625 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002626 default:
2627 return new ARMTargetInfo(T);
2628 }
Eli Friedmanb5366062008-05-20 14:21:01 +00002629
Daniel Dunbar52322032009-08-18 05:47:58 +00002630 case llvm::Triple::bfin:
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002631 return new BlackfinTargetInfo(T);
2632
Daniel Dunbar52322032009-08-18 05:47:58 +00002633 case llvm::Triple::msp430:
2634 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00002635
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002636 case llvm::Triple::mips:
2637 if (os == llvm::Triple::Psp)
2638 return new PSPTargetInfo<MipsTargetInfo>(T);
2639 if (os == llvm::Triple::Linux)
2640 return new LinuxTargetInfo<MipsTargetInfo>(T);
2641 return new MipsTargetInfo(T);
2642
2643 case llvm::Triple::mipsel:
2644 if (os == llvm::Triple::Psp)
2645 return new PSPTargetInfo<MipselTargetInfo>(T);
2646 if (os == llvm::Triple::Linux)
2647 return new LinuxTargetInfo<MipselTargetInfo>(T);
2648 return new MipselTargetInfo(T);
2649
Daniel Dunbar52322032009-08-18 05:47:58 +00002650 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002651 if (Triple.isOSDarwin())
Roman Divacky965b0b72011-01-06 08:27:10 +00002652 return new DarwinPPC32TargetInfo(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002653 else if (os == llvm::Triple::FreeBSD)
2654 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002655 return new PPC32TargetInfo(T);
2656
2657 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002658 if (Triple.isOSDarwin())
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00002659 return new DarwinPPC64TargetInfo(T);
John Thompsone467e192009-11-19 17:18:50 +00002660 else if (os == llvm::Triple::Lv2)
2661 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002662 else if (os == llvm::Triple::FreeBSD)
2663 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002664 return new PPC64TargetInfo(T);
2665
Chris Lattner5178f562010-03-06 21:21:27 +00002666 case llvm::Triple::mblaze:
2667 return new MBlazeTargetInfo(T);
2668
Daniel Dunbar52322032009-08-18 05:47:58 +00002669 case llvm::Triple::sparc:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002670 if (os == llvm::Triple::AuroraUX)
2671 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002672 if (os == llvm::Triple::Solaris)
2673 return new SolarisSparcV8TargetInfo(T);
2674 return new SparcV8TargetInfo(T);
2675
John Thompsone467e192009-11-19 17:18:50 +00002676 // FIXME: Need a real SPU target.
2677 case llvm::Triple::cellspu:
2678 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2679
Daniel Dunbar52322032009-08-18 05:47:58 +00002680 case llvm::Triple::systemz:
2681 return new SystemZTargetInfo(T);
2682
Eli Friedmana9c3d712009-08-19 20:47:07 +00002683 case llvm::Triple::tce:
2684 return new TCETargetInfo(T);
2685
Daniel Dunbar52322032009-08-18 05:47:58 +00002686 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002687 if (Triple.isOSDarwin())
2688 return new DarwinI386TargetInfo(T);
2689
Daniel Dunbar52322032009-08-18 05:47:58 +00002690 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002691 case llvm::Triple::AuroraUX:
2692 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002693 case llvm::Triple::Linux:
2694 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2695 case llvm::Triple::DragonFly:
2696 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2697 case llvm::Triple::NetBSD:
2698 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2699 case llvm::Triple::OpenBSD:
2700 return new OpenBSDI386TargetInfo(T);
2701 case llvm::Triple::FreeBSD:
2702 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00002703 case llvm::Triple::Minix:
2704 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002705 case llvm::Triple::Solaris:
2706 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2707 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002708 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002709 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002710 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002711 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002712 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00002713 case llvm::Triple::Haiku:
2714 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002715 default:
2716 return new X86_32TargetInfo(T);
2717 }
2718
2719 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002720 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
2721 return new DarwinX86_64TargetInfo(T);
2722
Daniel Dunbar52322032009-08-18 05:47:58 +00002723 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002724 case llvm::Triple::AuroraUX:
2725 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002726 case llvm::Triple::Linux:
2727 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00002728 case llvm::Triple::DragonFly:
2729 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002730 case llvm::Triple::NetBSD:
2731 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2732 case llvm::Triple::OpenBSD:
2733 return new OpenBSDX86_64TargetInfo(T);
2734 case llvm::Triple::FreeBSD:
2735 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2736 case llvm::Triple::Solaris:
2737 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00002738 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002739 return new MinGWX86_64TargetInfo(T);
2740 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002741 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002742 default:
2743 return new X86_64TargetInfo(T);
2744 }
2745 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002746}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002747
2748/// CreateTargetInfo - Return the target info object for the specified target
2749/// triple.
2750TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002751 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002752 llvm::Triple Triple(Opts.Triple);
2753
2754 // Construct the target
2755 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2756 if (!Target) {
2757 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2758 return 0;
2759 }
2760
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002761 // Set the target CPU if specified.
2762 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2763 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2764 return 0;
2765 }
2766
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002767 // Set the target ABI if specified.
2768 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2769 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2770 return 0;
2771 }
2772
Charles Davis95a546e2010-06-11 01:06:47 +00002773 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00002774 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00002775 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2776 return 0;
2777 }
2778
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002779 // Compute the default target features, we need the target to handle this
2780 // because features may have dependencies on one another.
2781 llvm::StringMap<bool> Features;
2782 Target->getDefaultFeatures(Opts.CPU, Features);
2783
2784 // Apply the user specified deltas.
2785 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2786 ie = Opts.Features.end(); it != ie; ++it) {
2787 const char *Name = it->c_str();
2788
2789 // Apply the feature via the target.
2790 if ((Name[0] != '-' && Name[0] != '+') ||
2791 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2792 Diags.Report(diag::err_target_invalid_feature) << Name;
2793 return 0;
2794 }
2795 }
2796
2797 // Add the features to the compile options.
2798 //
2799 // FIXME: If we are completely confident that we have the right set, we only
2800 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002801 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002802 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2803 ie = Features.end(); it != ie; ++it)
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002804 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2805 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002806
2807 return Target.take();
2808}