blob: 122702923636aa00172550e972cb5994152cc9f9 [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,
79 const llvm::Triple &Triple) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 Builder.defineMacro("__APPLE_CC__", "5621");
81 Builder.defineMacro("__APPLE__");
82 Builder.defineMacro("__MACH__");
83 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000084
Chris Lattner2a5c0a32009-04-07 16:50:40 +000085 // __weak is always defined, for use in blocks and with objc pointers.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000086 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000087
Chris Lattner2a5c0a32009-04-07 16:50:40 +000088 // Darwin defines __strong even in C mode (just to nothing).
89 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000090 Builder.defineMacro("__strong", "");
Chris Lattner2a5c0a32009-04-07 16:50:40 +000091 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
Eli Friedmanfd4b1552009-06-04 23:00:29 +000093
94 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000095 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +000096 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000097 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +000098
99 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000100 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000101
Daniel Dunbard86666f2010-01-26 01:44:04 +0000102 // Get the OS version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000103 unsigned Maj, Min, Rev;
Mike Stump11289f42009-09-09 15:08:12 +0000104
Daniel Dunbard86666f2010-01-26 01:44:04 +0000105 // If no version was given, default to to 10.4.0, for simplifying tests.
106 if (Triple.getOSName() == "darwin") {
107 Min = Rev = 0;
108 Maj = 8;
109 } else
110 Triple.getDarwinNumber(Maj, Min, Rev);
111
112 // Set the appropriate OS version define.
113 if (Triple.getEnvironmentName() == "iphoneos") {
114 assert(Maj < 10 && Min < 99 && Rev < 99 && "Invalid version!");
115 char Str[6];
116 Str[0] = '0' + Maj;
117 Str[1] = '0' + (Min / 10);
118 Str[2] = '0' + (Min % 10);
119 Str[3] = '0' + (Rev / 10);
120 Str[4] = '0' + (Rev % 10);
121 Str[5] = '\0';
122 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
123 } else {
124 // For historical reasons that make little sense, the version passed here is
125 // the "darwin" version, which drops the 10 and offsets by 4.
126 Rev = Min;
127 Min = Maj - 4;
128 Maj = 10;
129
130 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
131 assert(Maj < 99 && Min < 10 && Rev < 10 && "Invalid version!");
132 char Str[5];
133 Str[0] = '0' + (Maj / 10);
134 Str[1] = '0' + (Maj % 10);
135 Str[2] = '0' + Min;
136 Str[3] = '0' + Rev;
137 Str[4] = '\0';
138 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000140}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000141
Chris Lattner30ba6742009-08-10 19:03:04 +0000142namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000143template<typename Target>
144class DarwinTargetInfo : public OSTargetInfo<Target> {
145protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000146 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000147 MacroBuilder &Builder) const {
Daniel Dunbard86666f2010-01-26 01:44:04 +0000148 getDarwinDefines(Builder, Opts, Triple);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000149 }
Mike Stump11289f42009-09-09 15:08:12 +0000150
Torok Edwinb2b37c62009-06-30 17:10:35 +0000151public:
152 DarwinTargetInfo(const std::string& triple) :
153 OSTargetInfo<Target>(triple) {
Eric Christopher17c7b892010-06-25 19:04:52 +0000154 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000155 }
156
Anders Carlsson0b0a1222010-01-30 18:33:31 +0000157 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000158 // Let MCSectionMachO validate this.
159 llvm::StringRef Segment, Section;
160 unsigned TAA, StubSize;
161 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
162 TAA, StubSize);
163 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000164
Anders Carlsson851318a2010-06-08 22:47:50 +0000165 virtual const char *getStaticInitSectionSpecifier() const {
166 // FIXME: We should return 0 when building kexts.
167 return "__TEXT,__StaticInit,regular,pure_instructions";
168 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000169
Torok Edwinb2b37c62009-06-30 17:10:35 +0000170};
171
Chris Lattner30ba6742009-08-10 19:03:04 +0000172
Torok Edwinb2b37c62009-06-30 17:10:35 +0000173// DragonFlyBSD Target
174template<typename Target>
175class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
176protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000177 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000178 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000179 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000180 Builder.defineMacro("__DragonFly__");
181 Builder.defineMacro("__DragonFly_cc_version", "100001");
182 Builder.defineMacro("__ELF__");
183 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
184 Builder.defineMacro("__tune_i386__");
185 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000186 }
187public:
Mike Stump11289f42009-09-09 15:08:12 +0000188 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000189 : OSTargetInfo<Target>(triple) {}
190};
191
192// FreeBSD Target
193template<typename Target>
194class FreeBSDTargetInfo : public OSTargetInfo<Target> {
195protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000196 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000197 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000198 // FreeBSD defines; list based off of gcc output
199
Daniel Dunbar40165182009-08-24 09:10:05 +0000200 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000201 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000202
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000203 Builder.defineMacro("__FreeBSD__", Release);
204 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000205 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
206 DefineStd(Builder, "unix", Opts);
207 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000208 }
209public:
Mike Stump11289f42009-09-09 15:08:12 +0000210 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000211 : OSTargetInfo<Target>(triple) {
212 this->UserLabelPrefix = "";
213 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000214};
215
Chris Lattner3e2ee142010-07-07 16:01:42 +0000216// Minix Target
217template<typename Target>
218class MinixTargetInfo : public OSTargetInfo<Target> {
219protected:
220 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
221 MacroBuilder &Builder) const {
222 // Minix defines
223
224 Builder.defineMacro("__minix", "3");
225 Builder.defineMacro("_EM_WSIZE", "4");
226 Builder.defineMacro("_EM_PSIZE", "4");
227 Builder.defineMacro("_EM_SSIZE", "2");
228 Builder.defineMacro("_EM_LSIZE", "4");
229 Builder.defineMacro("_EM_FSIZE", "4");
230 Builder.defineMacro("_EM_DSIZE", "8");
231 DefineStd(Builder, "unix", Opts);
232 }
233public:
234 MinixTargetInfo(const std::string &triple)
235 : OSTargetInfo<Target>(triple) {
236 this->UserLabelPrefix = "";
237 }
238};
239
Torok Edwinb2b37c62009-06-30 17:10:35 +0000240// Linux target
241template<typename Target>
242class LinuxTargetInfo : public OSTargetInfo<Target> {
243protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000244 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000245 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000246 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000247 DefineStd(Builder, "unix", Opts);
248 DefineStd(Builder, "linux", Opts);
249 Builder.defineMacro("__gnu_linux__");
250 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000251 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000252 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000253 if (Opts.CPlusPlus)
254 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000255 }
256public:
Mike Stump11289f42009-09-09 15:08:12 +0000257 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000258 : OSTargetInfo<Target>(triple) {
259 this->UserLabelPrefix = "";
260 }
261};
262
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000263// NetBSD Target
264template<typename Target>
265class NetBSDTargetInfo : public OSTargetInfo<Target> {
266protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000267 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000268 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000269 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000270 Builder.defineMacro("__NetBSD__");
271 Builder.defineMacro("__unix__");
272 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000273 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000274 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000275 }
276public:
Mike Stump11289f42009-09-09 15:08:12 +0000277 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000278 : OSTargetInfo<Target>(triple) {
279 this->UserLabelPrefix = "";
280 }
281};
282
Torok Edwinb2b37c62009-06-30 17:10:35 +0000283// OpenBSD Target
284template<typename Target>
285class OpenBSDTargetInfo : public OSTargetInfo<Target> {
286protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000287 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000288 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000289 // OpenBSD defines; list based off of gcc output
290
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__OpenBSD__");
292 DefineStd(Builder, "unix", Opts);
293 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000294 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000295 Builder.defineMacro("_POSIX_THREADS");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000296 }
297public:
Mike Stump11289f42009-09-09 15:08:12 +0000298 OpenBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000299 : OSTargetInfo<Target>(triple) {}
300};
301
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000302// PSP Target
303template<typename Target>
304class PSPTargetInfo : public OSTargetInfo<Target> {
305protected:
306 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000307 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000308 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000309 Builder.defineMacro("PSP");
310 Builder.defineMacro("_PSP");
311 Builder.defineMacro("__psp__");
312 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000313 }
314public:
315 PSPTargetInfo(const std::string& triple)
316 : OSTargetInfo<Target>(triple) {
317 this->UserLabelPrefix = "";
318 }
319};
320
John Thompsone467e192009-11-19 17:18:50 +0000321// PS3 PPU Target
322template<typename Target>
323class PS3PPUTargetInfo : public OSTargetInfo<Target> {
324protected:
325 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000326 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000327 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000328 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000329 Builder.defineMacro("__PPU__");
330 Builder.defineMacro("__CELLOS_LV2__");
331 Builder.defineMacro("__ELF__");
332 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000333 Builder.defineMacro("_ARCH_PPC64");
334 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000335 }
336public:
337 PS3PPUTargetInfo(const std::string& triple)
338 : OSTargetInfo<Target>(triple) {
339 this->UserLabelPrefix = "";
John Thompson6f8dba72009-12-18 14:21:08 +0000340 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000341 this->IntMaxType = TargetInfo::SignedLongLong;
342 this->UIntMaxType = TargetInfo::UnsignedLongLong;
343 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000344 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000345 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
346 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000347 }
348};
349
350// FIXME: Need a real SPU target.
351// PS3 SPU Target
352template<typename Target>
353class PS3SPUTargetInfo : public OSTargetInfo<Target> {
354protected:
355 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000356 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000357 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000358 Builder.defineMacro("__SPU__");
359 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000360 }
361public:
362 PS3SPUTargetInfo(const std::string& triple)
363 : OSTargetInfo<Target>(triple) {
364 this->UserLabelPrefix = "";
365 }
366};
367
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000368// AuroraUX target
369template<typename Target>
370class AuroraUXTargetInfo : 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 {
374 DefineStd(Builder, "sun", Opts);
375 DefineStd(Builder, "unix", Opts);
376 Builder.defineMacro("__ELF__");
377 Builder.defineMacro("__svr4__");
378 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000379 }
380public:
381 AuroraUXTargetInfo(const std::string& triple)
382 : OSTargetInfo<Target>(triple) {
383 this->UserLabelPrefix = "";
384 this->WCharType = this->SignedLong;
385 // FIXME: WIntType should be SignedLong
386 }
387};
388
Torok Edwinb2b37c62009-06-30 17:10:35 +0000389// Solaris target
390template<typename Target>
391class SolarisTargetInfo : public OSTargetInfo<Target> {
392protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000393 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000394 MacroBuilder &Builder) const {
395 DefineStd(Builder, "sun", Opts);
396 DefineStd(Builder, "unix", Opts);
397 Builder.defineMacro("__ELF__");
398 Builder.defineMacro("__svr4__");
399 Builder.defineMacro("__SVR4");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 }
401public:
Mike Stump11289f42009-09-09 15:08:12 +0000402 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000403 : OSTargetInfo<Target>(triple) {
404 this->UserLabelPrefix = "";
405 this->WCharType = this->SignedLong;
406 // FIXME: WIntType should be SignedLong
407 }
408};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000409
410// Windows target
411template<typename Target>
412class WindowsTargetInfo : public OSTargetInfo<Target> {
413protected:
414 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
415 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000416 Builder.defineMacro("_WIN32");
417 }
418 void getVisualStudioDefines(const LangOptions &Opts,
419 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000420 if (Opts.CPlusPlus) {
421 if (Opts.RTTI)
422 Builder.defineMacro("_CPPRTTI");
423
424 if (Opts.Exceptions)
425 Builder.defineMacro("_CPPUNWIND");
426 }
427
428 if (!Opts.CharIsSigned)
429 Builder.defineMacro("_CHAR_UNSIGNED");
430
431 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
432 // but it works for now.
433 if (Opts.POSIXThreads)
434 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000435
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000436 if (Opts.MSCVersion != 0)
437 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
438
439 if (Opts.Microsoft) {
440 Builder.defineMacro("_MSC_EXTENSIONS");
441
442 if (Opts.CPlusPlus0x) {
443 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
444 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
445 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
446 }
447 }
448
449 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000450 }
451
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000452public:
453 WindowsTargetInfo(const std::string &triple)
454 : OSTargetInfo<Target>(triple) {}
455};
456
Mike Stump11289f42009-09-09 15:08:12 +0000457} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000458
Chris Lattner09d98f52008-10-05 21:50:58 +0000459//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000460// Specific target implementations.
461//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000462
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000463namespace {
464// PPC abstract base class
465class PPCTargetInfo : public TargetInfo {
466 static const Builtin::Info BuiltinInfo[];
467 static const char * const GCCRegNames[];
468 static const TargetInfo::GCCRegAlias GCCRegAliases[];
469
470public:
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000471 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
472
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000473 virtual void getTargetBuiltins(const Builtin::Info *&Records,
474 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000475 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000476 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000477 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000478
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000479 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000480 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000481
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000482 virtual const char *getVAListDeclaration() const {
Chris Lattner69f9bc22008-10-27 01:11:29 +0000483 return "typedef char* __builtin_va_list;";
484 // This is the right definition for ABI/V4: System V.4/eabi.
485 /*return "typedef struct __va_list_tag {"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000486 " unsigned char gpr;"
487 " unsigned char fpr;"
488 " unsigned short reserved;"
489 " void* overflow_arg_area;"
490 " void* reg_save_area;"
Chris Lattner69f9bc22008-10-27 01:11:29 +0000491 "} __builtin_va_list[1];";*/
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000492 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000493 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000494 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000495 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000496 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000497 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000498 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000499 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000500 default: return false;
501 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000502 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000503 case 'b': // Base register
504 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000505 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000506 break;
507 // FIXME: The following are added to allow parsing.
508 // I just took a guess at what the actions should be.
509 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000510 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000511 case 'v': // Altivec vector register
512 Info.setAllowsRegister();
513 break;
514 case 'w':
515 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000516 case 'd':// VSX vector register to hold vector double data
517 case 'f':// VSX vector register to hold vector float data
518 case 's':// VSX vector register to hold scalar float data
519 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000520 break;
521 default:
522 return false;
523 }
524 Info.setAllowsRegister();
525 Name++; // Skip over 'w'.
526 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000527 case 'h': // `MQ', `CTR', or `LINK' register
528 case 'q': // `MQ' register
529 case 'c': // `CTR' register
530 case 'l': // `LINK' register
531 case 'x': // `CR' register (condition register) number 0
532 case 'y': // `CR' register (condition register)
533 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000534 Info.setAllowsRegister();
535 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000536 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000537 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000538 // (use `L' instead for SImode constants)
539 case 'K': // Unsigned 16-bit constant
540 case 'L': // Signed 16-bit constant shifted left 16 bits
541 case 'M': // Constant larger than 31
542 case 'N': // Exact power of 2
543 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000544 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000545 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000546 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000547 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000548 break;
549 case 'm': // Memory operand. Note that on PowerPC targets, m can
550 // include addresses that update the base register. It
551 // is therefore only safe to use `m' in an asm statement
552 // if that asm statement accesses the operand exactly once.
553 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000554 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000555 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000556 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000557 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000558 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
559 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000560 // register to be updated.
561 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000562 if (Name[1] != 's')
563 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000564 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000565 // include any automodification of the base register. Unlike
566 // `m', this constraint can be used in asm statements that
567 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000568 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000569 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000570 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000571 break;
572 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000573 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000574 case 'Z': // Memory operand that is an indexed or indirect from a
575 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000576 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000577 Info.setAllowsMemory();
578 Info.setAllowsRegister();
579 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000580 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000581 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000582 // register (`p' is preferable for asm statements)
583 case 'S': // Constant suitable as a 64-bit mask operand
584 case 'T': // Constant suitable as a 32-bit mask operand
585 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000586 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000587 // instructions
588 case 'W': // Vector constant that does not require memory
589 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000590 break;
591 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000592 }
John Thompson07a61a42010-06-24 22:44:13 +0000593 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000594 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000595 virtual const char *getClobbers() const {
596 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000597 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000598};
Anders Carlssonf511f642007-11-27 04:11:28 +0000599
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000600const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000601#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
602#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
603 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000604#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000605};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000606
607
Chris Lattnerecd49032009-03-02 22:27:17 +0000608/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
609/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000610void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000611 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000612 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000613 Builder.defineMacro("__ppc__");
614 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000615 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000616 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000617 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000618 Builder.defineMacro("_ARCH_PPC64");
619 Builder.defineMacro("_LP64");
620 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000621 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000622 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000623 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000624 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000625 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000626
Chris Lattnerecd49032009-03-02 22:27:17 +0000627 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000628 Builder.defineMacro("_BIG_ENDIAN");
629 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000630
Chris Lattnerecd49032009-03-02 22:27:17 +0000631 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000632 Builder.defineMacro("__NATURAL_ALIGNMENT__");
633 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000634
Chris Lattnerecd49032009-03-02 22:27:17 +0000635 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000636 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000637
John Thompsone467e192009-11-19 17:18:50 +0000638 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000639 Builder.defineMacro("__VEC__", "10206");
640 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000641 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000642}
643
Chris Lattner17df24e2008-04-21 18:56:49 +0000644
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000645const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000646 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
647 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
648 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
649 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
650 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
651 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
652 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
653 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000654 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000655 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000656 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000657 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
658 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
659 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
660 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000661 "vrsave", "vscr",
662 "spe_acc", "spefscr",
663 "sfp"
664};
Chris Lattner10a5b382007-01-29 05:24:35 +0000665
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000666void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000667 unsigned &NumNames) const {
668 Names = GCCRegNames;
669 NumNames = llvm::array_lengthof(GCCRegNames);
670}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000671
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000672const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
673 // While some of these aliases do map to different registers
674 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000675 { { "0" }, "r0" },
676 { { "1"}, "r1" },
677 { { "2" }, "r2" },
678 { { "3" }, "r3" },
679 { { "4" }, "r4" },
680 { { "5" }, "r5" },
681 { { "6" }, "r6" },
682 { { "7" }, "r7" },
683 { { "8" }, "r8" },
684 { { "9" }, "r9" },
685 { { "10" }, "r10" },
686 { { "11" }, "r11" },
687 { { "12" }, "r12" },
688 { { "13" }, "r13" },
689 { { "14" }, "r14" },
690 { { "15" }, "r15" },
691 { { "16" }, "r16" },
692 { { "17" }, "r17" },
693 { { "18" }, "r18" },
694 { { "19" }, "r19" },
695 { { "20" }, "r20" },
696 { { "21" }, "r21" },
697 { { "22" }, "r22" },
698 { { "23" }, "r23" },
699 { { "24" }, "r24" },
700 { { "25" }, "r25" },
701 { { "26" }, "r26" },
702 { { "27" }, "r27" },
703 { { "28" }, "r28" },
704 { { "29" }, "r29" },
705 { { "30" }, "r30" },
706 { { "31" }, "r31" },
707 { { "fr0" }, "f0" },
708 { { "fr1" }, "f1" },
709 { { "fr2" }, "f2" },
710 { { "fr3" }, "f3" },
711 { { "fr4" }, "f4" },
712 { { "fr5" }, "f5" },
713 { { "fr6" }, "f6" },
714 { { "fr7" }, "f7" },
715 { { "fr8" }, "f8" },
716 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000717 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000718 { { "fr11" }, "f11" },
719 { { "fr12" }, "f12" },
720 { { "fr13" }, "f13" },
721 { { "fr14" }, "f14" },
722 { { "fr15" }, "f15" },
723 { { "fr16" }, "f16" },
724 { { "fr17" }, "f17" },
725 { { "fr18" }, "f18" },
726 { { "fr19" }, "f19" },
727 { { "fr20" }, "f20" },
728 { { "fr21" }, "f21" },
729 { { "fr22" }, "f22" },
730 { { "fr23" }, "f23" },
731 { { "fr24" }, "f24" },
732 { { "fr25" }, "f25" },
733 { { "fr26" }, "f26" },
734 { { "fr27" }, "f27" },
735 { { "fr28" }, "f28" },
736 { { "fr29" }, "f29" },
737 { { "fr30" }, "f30" },
738 { { "fr31" }, "f31" },
739 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000740};
741
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000742void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000743 unsigned &NumAliases) const {
744 Aliases = GCCRegAliases;
745 NumAliases = llvm::array_lengthof(GCCRegAliases);
746}
747} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000748
Chris Lattner5ba61f02006-10-14 07:39:34 +0000749namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000750class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000751public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000752 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000753 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 +0000754 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000755
756 if (getTriple().getOS() == llvm::Triple::FreeBSD)
757 this->SizeType = TargetInfo::UnsignedInt;
Eli Friedman873f65a2008-08-21 00:13:15 +0000758 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000759};
760} // end anonymous namespace.
761
762namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000763class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000764public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000765 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000766 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000767 IntMaxType = SignedLong;
768 UIntMaxType = UnsignedLong;
769 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000770 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 +0000771 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000772 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000773};
774} // end anonymous namespace.
775
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000776
777namespace {
778class DarwinPPCTargetInfo :
779 public DarwinTargetInfo<PPCTargetInfo> {
780public:
781 DarwinPPCTargetInfo(const std::string& triple)
782 : DarwinTargetInfo<PPCTargetInfo>(triple) {
783 HasAlignMac68kSupport = true;
784 }
785};
786
787class DarwinPPC64TargetInfo :
788 public DarwinTargetInfo<PPC64TargetInfo> {
789public:
790 DarwinPPC64TargetInfo(const std::string& triple)
791 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
792 HasAlignMac68kSupport = true;
793 }
794};
795} // end anonymous namespace.
796
Chris Lattner5ba61f02006-10-14 07:39:34 +0000797namespace {
Chris Lattner5178f562010-03-06 21:21:27 +0000798// MBlaze abstract base class
799class MBlazeTargetInfo : public TargetInfo {
800 static const char * const GCCRegNames[];
801 static const TargetInfo::GCCRegAlias GCCRegAliases[];
802
803public:
804 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
805 DescriptionString = "E-p:32:32-i8:8:8-i16:16:16-i64:32:32-f64:32:32-"
806 "v64:32:32-v128:32:32-n32";
807 }
808
809 virtual void getTargetBuiltins(const Builtin::Info *&Records,
810 unsigned &NumRecords) const {
811 // FIXME: Implement.
812 Records = 0;
813 NumRecords = 0;
814 }
815
816 virtual void getTargetDefines(const LangOptions &Opts,
817 MacroBuilder &Builder) const;
818
819 virtual const char *getVAListDeclaration() const {
820 return "typedef char* __builtin_va_list;";
821 }
822 virtual const char *getTargetPrefix() const {
823 return "mblaze";
824 }
825 virtual void getGCCRegNames(const char * const *&Names,
826 unsigned &NumNames) const;
827 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
828 unsigned &NumAliases) const;
829 virtual bool validateAsmConstraint(const char *&Name,
830 TargetInfo::ConstraintInfo &Info) const {
831 switch (*Name) {
832 default: return false;
833 case 'O': // Zero
834 return true;
835 case 'b': // Base register
836 case 'f': // Floating point register
837 Info.setAllowsRegister();
838 return true;
839 }
840 }
841 virtual const char *getClobbers() const {
842 return "";
843 }
844};
845
846/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
847/// #defines that are not tied to a specific subtarget.
848void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
849 MacroBuilder &Builder) const {
850 // Target identification.
851 Builder.defineMacro("__microblaze__");
852 Builder.defineMacro("_ARCH_MICROBLAZE");
853 Builder.defineMacro("__MICROBLAZE__");
854
855 // Target properties.
856 Builder.defineMacro("_BIG_ENDIAN");
857 Builder.defineMacro("__BIG_ENDIAN__");
858
859 // Subtarget options.
860 Builder.defineMacro("__REGISTER_PREFIX__", "");
861}
862
863
864const char * const MBlazeTargetInfo::GCCRegNames[] = {
865 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
866 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
867 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
868 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
869 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
870 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
871 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
872 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
873 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
874 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
875};
876
877void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
878 unsigned &NumNames) const {
879 Names = GCCRegNames;
880 NumNames = llvm::array_lengthof(GCCRegNames);
881}
882
883const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
884 { {"f0"}, "r0" },
885 { {"f1"}, "r1" },
886 { {"f2"}, "r2" },
887 { {"f3"}, "r3" },
888 { {"f4"}, "r4" },
889 { {"f5"}, "r5" },
890 { {"f6"}, "r6" },
891 { {"f7"}, "r7" },
892 { {"f8"}, "r8" },
893 { {"f9"}, "r9" },
894 { {"f10"}, "r10" },
895 { {"f11"}, "r11" },
896 { {"f12"}, "r12" },
897 { {"f13"}, "r13" },
898 { {"f14"}, "r14" },
899 { {"f15"}, "r15" },
900 { {"f16"}, "r16" },
901 { {"f17"}, "r17" },
902 { {"f18"}, "r18" },
903 { {"f19"}, "r19" },
904 { {"f20"}, "r20" },
905 { {"f21"}, "r21" },
906 { {"f22"}, "r22" },
907 { {"f23"}, "r23" },
908 { {"f24"}, "r24" },
909 { {"f25"}, "r25" },
910 { {"f26"}, "r26" },
911 { {"f27"}, "r27" },
912 { {"f28"}, "r28" },
913 { {"f29"}, "r29" },
914 { {"f30"}, "r30" },
915 { {"f31"}, "r31" },
916};
917
918void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
919 unsigned &NumAliases) const {
920 Aliases = GCCRegAliases;
921 NumAliases = llvm::array_lengthof(GCCRegAliases);
922}
923} // end anonymous namespace.
924
925namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000926// Namespace for x86 abstract base class
927const Builtin::Info BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000928#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
929#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
930 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000931#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +0000932};
Eli Friedmanb5366062008-05-20 14:21:01 +0000933
Nuno Lopescfca1f02009-12-23 17:49:57 +0000934static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000935 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
936 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
937 "argp", "flags", "fspr", "dirflag", "frame",
938 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
939 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
940 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
941 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
942};
943
944const TargetInfo::GCCRegAlias GCCRegAliases[] = {
945 { { "al", "ah", "eax", "rax" }, "ax" },
946 { { "bl", "bh", "ebx", "rbx" }, "bx" },
947 { { "cl", "ch", "ecx", "rcx" }, "cx" },
948 { { "dl", "dh", "edx", "rdx" }, "dx" },
949 { { "esi", "rsi" }, "si" },
950 { { "edi", "rdi" }, "di" },
951 { { "esp", "rsp" }, "sp" },
952 { { "ebp", "rbp" }, "bp" },
953};
954
955// X86 target abstract base class; x86-32 and x86-64 are very close, so
956// most of the implementation can be shared.
957class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +0000958 enum X86SSEEnum {
959 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
960 } SSELevel;
Anders Carlssone437c682010-01-27 03:47:49 +0000961 enum AMD3DNowEnum {
962 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
963 } AMD3DNowLevel;
964
Eric Christophere1ddaf92010-04-02 23:50:19 +0000965 bool HasAES;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +0000966 bool HasAVX;
967
Eli Friedman3fd920a2008-08-20 02:34:37 +0000968public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000969 X86TargetInfo(const std::string& triple)
Eric Christophere1ddaf92010-04-02 23:50:19 +0000970 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +0000971 HasAES(false), HasAVX(false) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000972 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000973 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000974 virtual void getTargetBuiltins(const Builtin::Info *&Records,
975 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000976 Records = BuiltinInfo;
977 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000978 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000979 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000980 unsigned &NumNames) const {
981 Names = GCCRegNames;
982 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000983 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000984 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000985 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000986 Aliases = GCCRegAliases;
987 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000988 }
Anders Carlsson58436352009-02-28 17:11:49 +0000989 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +0000990 TargetInfo::ConstraintInfo &info) const;
Dale Johannesen7d3dfc02010-10-29 23:12:32 +0000991 virtual const llvm::Type* adjustInlineAsmType(std::string& Constraint,
992 const llvm::Type* Ty,
993 llvm::LLVMContext& Context) const;
Eli Friedman3fd920a2008-08-20 02:34:37 +0000994 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +0000995 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000996 return "~{dirflag},~{fpsr},~{flags}";
997 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000998 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000999 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001000 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1001 const std::string &Name,
1002 bool Enabled) const;
Mike Stump11289f42009-09-09 15:08:12 +00001003 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001004 llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001005 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Chris Lattner5ba61f02006-10-14 07:39:34 +00001006};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001007
Mike Stump11289f42009-09-09 15:08:12 +00001008void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001009 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001010 // FIXME: This should not be here.
1011 Features["3dnow"] = false;
1012 Features["3dnowa"] = false;
1013 Features["mmx"] = false;
1014 Features["sse"] = false;
1015 Features["sse2"] = false;
1016 Features["sse3"] = false;
1017 Features["ssse3"] = false;
1018 Features["sse41"] = false;
1019 Features["sse42"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001020 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001021 Features["avx"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001022
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001023 // LLVM does not currently recognize this.
1024 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001025
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001026 // FIXME: This *really* should not be here.
1027
1028 // X86_64 always has SSE2.
1029 if (PointerWidth == 64)
1030 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1031
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001032 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1033 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1034 ;
1035 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1036 setFeatureEnabled(Features, "mmx", true);
1037 else if (CPU == "pentium3")
1038 setFeatureEnabled(Features, "sse", true);
1039 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1040 setFeatureEnabled(Features, "sse2", true);
1041 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1042 setFeatureEnabled(Features, "sse3", true);
1043 else if (CPU == "core2")
1044 setFeatureEnabled(Features, "ssse3", true);
1045 else if (CPU == "penryn") {
1046 setFeatureEnabled(Features, "sse4", true);
1047 Features["sse42"] = false;
1048 } else if (CPU == "atom")
1049 setFeatureEnabled(Features, "sse3", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001050 else if (CPU == "corei7") {
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001051 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001052 setFeatureEnabled(Features, "aes", true);
1053 }
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001054 else if (CPU == "k6" || CPU == "winchip-c6")
1055 setFeatureEnabled(Features, "mmx", true);
Mike Stump11289f42009-09-09 15:08:12 +00001056 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001057 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1058 setFeatureEnabled(Features, "mmx", true);
1059 setFeatureEnabled(Features, "3dnow", true);
1060 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1061 setFeatureEnabled(Features, "sse", true);
1062 setFeatureEnabled(Features, "3dnowa", true);
1063 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1064 CPU == "athlon-fx") {
Mike Stump11289f42009-09-09 15:08:12 +00001065 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001066 setFeatureEnabled(Features, "3dnowa", true);
1067 } else if (CPU == "c3-2")
1068 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001069}
1070
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001071bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001072 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001073 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001074 // FIXME: This *really* should not be here. We need some way of translating
1075 // options into llvm subtarget features.
1076 if (!Features.count(Name) &&
1077 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001078 return false;
1079
1080 if (Enabled) {
1081 if (Name == "mmx")
1082 Features["mmx"] = true;
1083 else if (Name == "sse")
1084 Features["mmx"] = Features["sse"] = true;
1085 else if (Name == "sse2")
1086 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1087 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001088 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001089 Features["sse3"] = true;
1090 else if (Name == "ssse3")
Mike Stump11289f42009-09-09 15:08:12 +00001091 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001092 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001093 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump11289f42009-09-09 15:08:12 +00001094 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001095 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001096 else if (Name == "sse4.1")
1097 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1098 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001099 else if (Name == "3dnow")
1100 Features["3dnowa"] = true;
1101 else if (Name == "3dnowa")
1102 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001103 else if (Name == "aes")
1104 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001105 else if (Name == "avx")
1106 Features["avx"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001107 } else {
1108 if (Name == "mmx")
Mike Stump11289f42009-09-09 15:08:12 +00001109 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001110 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1111 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001112 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001113 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1114 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001115 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001116 Features["sse41"] = Features["sse42"] = false;
1117 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001118 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001119 Features["sse42"] = false;
1120 else if (Name == "ssse3")
1121 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1122 else if (Name == "sse4")
1123 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001124 else if (Name == "sse4.2")
1125 Features["sse42"] = false;
1126 else if (Name == "sse4.1")
1127 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001128 else if (Name == "3dnow")
1129 Features["3dnow"] = Features["3dnowa"] = false;
1130 else if (Name == "3dnowa")
1131 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001132 else if (Name == "aes")
1133 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001134 else if (Name == "avx")
1135 Features["avx"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001136 }
1137
1138 return true;
1139}
1140
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001141/// HandleTargetOptions - Perform initialization based on the user
1142/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001143void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001144 // Remember the maximum enabled sselevel.
1145 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1146 // Ignore disabled features.
1147 if (Features[i][0] == '-')
1148 continue;
1149
Eric Christophere1ddaf92010-04-02 23:50:19 +00001150 if (Features[i].substr(1) == "aes") {
1151 HasAES = true;
1152 continue;
1153 }
1154
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001155 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1156 // For now let it be enabled together with other SSE levels.
1157 if (Features[i].substr(1) == "avx") {
1158 HasAVX = true;
1159 continue;
1160 }
1161
Daniel Dunbar979586e2009-11-11 09:38:56 +00001162 assert(Features[i][0] == '+' && "Invalid target feature!");
1163 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1164 .Case("sse42", SSE42)
1165 .Case("sse41", SSE41)
1166 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001167 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001168 .Case("sse2", SSE2)
1169 .Case("sse", SSE1)
1170 .Case("mmx", MMX)
1171 .Default(NoMMXSSE);
1172 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001173
1174 AMD3DNowEnum ThreeDNowLevel =
Anders Carlssone437c682010-01-27 03:47:49 +00001175 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1176 .Case("3dnowa", AMD3DNowAthlon)
1177 .Case("3dnow", AMD3DNow)
1178 .Default(NoAMD3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001179
Anders Carlssone437c682010-01-27 03:47:49 +00001180 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001181 }
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001182}
Chris Lattnerecd49032009-03-02 22:27:17 +00001183
1184/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1185/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001186void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001187 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001188 // Target identification.
1189 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001190 Builder.defineMacro("_LP64");
1191 Builder.defineMacro("__LP64__");
1192 Builder.defineMacro("__amd64__");
1193 Builder.defineMacro("__amd64");
1194 Builder.defineMacro("__x86_64");
1195 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001196 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001197 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001198 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001199
Eric Christophere1ddaf92010-04-02 23:50:19 +00001200 if (HasAES)
1201 Builder.defineMacro("__AES__");
1202
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001203 if (HasAVX)
1204 Builder.defineMacro("__AVX__");
1205
Chris Lattnerecd49032009-03-02 22:27:17 +00001206 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001207 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001208
Chris Lattnerecd49032009-03-02 22:27:17 +00001209 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001210 Builder.defineMacro("__nocona");
1211 Builder.defineMacro("__nocona__");
1212 Builder.defineMacro("__tune_nocona__");
1213 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +00001214
Chris Lattner6df41af2009-04-19 17:32:33 +00001215 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1216 // functions in glibc header files that use FP Stack inline asm which the
1217 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001218 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001219
Chris Lattner96e43572009-03-02 22:40:39 +00001220 // Each case falls through to the previous one here.
1221 switch (SSELevel) {
1222 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001223 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00001224 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001225 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00001226 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001227 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001228 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001229 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001230 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001231 Builder.defineMacro("__SSE2__");
1232 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001233 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001234 Builder.defineMacro("__SSE__");
1235 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001236 case MMX:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001237 Builder.defineMacro("__MMX__");
Chris Lattner96e43572009-03-02 22:40:39 +00001238 case NoMMXSSE:
1239 break;
1240 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001241
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001242 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001243 switch (SSELevel) {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001244 case SSE42:
1245 case SSE41:
1246 case SSSE3:
1247 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001248 case SSE2:
1249 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1250 break;
1251 case SSE1:
1252 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1253 break;
1254 default:
1255 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1256 }
1257 }
1258
Anders Carlssone437c682010-01-27 03:47:49 +00001259 // Each case falls through to the previous one here.
1260 switch (AMD3DNowLevel) {
1261 case AMD3DNowAthlon:
1262 Builder.defineMacro("__3dNOW_A__");
1263 case AMD3DNow:
1264 Builder.defineMacro("__3dNOW__");
1265 case NoAMD3DNow:
1266 break;
1267 }
Chris Lattnerecd49032009-03-02 22:27:17 +00001268}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001269
1270
Eli Friedman3fd920a2008-08-20 02:34:37 +00001271bool
Anders Carlsson58436352009-02-28 17:11:49 +00001272X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001273 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00001274 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001275 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00001276 case 'Y': // first letter of a pair:
1277 switch (*(Name+1)) {
1278 default: return false;
1279 case '0': // First SSE register.
1280 case 't': // Any SSE register, when SSE2 is enabled.
1281 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1282 case 'm': // any MMX register, when inter-unit moves enabled.
1283 break; // falls through to setAllowsRegister.
1284 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001285 case 'a': // eax.
1286 case 'b': // ebx.
1287 case 'c': // ecx.
1288 case 'd': // edx.
1289 case 'S': // esi.
1290 case 'D': // edi.
1291 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00001292 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001293 case 't': // top of floating point stack.
1294 case 'u': // second from top of floating point stack.
1295 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00001296 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00001297 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001298 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00001299 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1300 case 'l': // "Index" registers: any general register that can be used as an
1301 // index in a base+index memory access.
1302 Info.setAllowsRegister();
1303 return true;
1304 case 'C': // SSE floating point constant.
1305 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001306 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001307 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001308 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001309 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001310 return true;
1311 }
Dale Johannesen46742a42010-08-24 22:33:12 +00001312 return false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001313}
1314
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00001315const llvm::Type*
1316X86TargetInfo::adjustInlineAsmType(std::string& Constraint,
1317 const llvm::Type* Ty,
1318 llvm::LLVMContext &Context) const {
1319 if (Constraint=="y" && Ty->isVectorTy())
1320 return llvm::Type::getX86_MMXTy(Context);
1321 return Ty;
1322}
1323
1324
Eli Friedman3fd920a2008-08-20 02:34:37 +00001325std::string
1326X86TargetInfo::convertConstraint(const char Constraint) const {
1327 switch (Constraint) {
1328 case 'a': return std::string("{ax}");
1329 case 'b': return std::string("{bx}");
1330 case 'c': return std::string("{cx}");
1331 case 'd': return std::string("{dx}");
1332 case 'S': return std::string("{si}");
1333 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00001334 case 'p': // address
1335 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00001336 case 't': // top of floating point stack.
1337 return std::string("{st}");
1338 case 'u': // second from top of floating point stack.
1339 return std::string("{st(1)}"); // second from top of floating point stack.
1340 default:
1341 return std::string(1, Constraint);
1342 }
1343}
Eli Friedman3fd920a2008-08-20 02:34:37 +00001344} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00001345
1346namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001347// X86-32 generic target
1348class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001349public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00001350 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1351 DoubleAlign = LongLongAlign = 32;
1352 LongDoubleWidth = 96;
1353 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +00001354 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1355 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001356 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +00001357 SizeType = UnsignedInt;
1358 PtrDiffType = SignedInt;
1359 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001360 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001361
1362 // Use fpret for all types.
1363 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1364 (1 << TargetInfo::Double) |
1365 (1 << TargetInfo::LongDouble));
Eli Friedman3fd920a2008-08-20 02:34:37 +00001366 }
1367 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001368 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00001369 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001370
Chris Lattnerd545ad12009-09-23 06:06:36 +00001371 int getEHDataRegisterNumber(unsigned RegNo) const {
1372 if (RegNo == 0) return 0;
1373 if (RegNo == 1) return 2;
1374 return -1;
1375 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001376};
1377} // end anonymous namespace
1378
1379namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00001380class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1381public:
1382 OpenBSDI386TargetInfo(const std::string& triple) :
1383 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1384 SizeType = UnsignedLong;
1385 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00001386 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00001387 }
1388};
1389} // end anonymous namespace
1390
1391namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00001392class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001393public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00001394 DarwinI386TargetInfo(const std::string& triple) :
1395 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001396 LongDoubleWidth = 128;
1397 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00001398 SizeType = UnsignedLong;
1399 IntPtrType = SignedLong;
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:128:128-n8:16:32";
Daniel Dunbarbd606522010-05-27 00:35:16 +00001403 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00001404 }
1405
Eli Friedman3fd920a2008-08-20 02:34:37 +00001406};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00001407} // end anonymous namespace
1408
1409namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001410// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001411class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001412public:
1413 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001414 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001415 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00001416 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00001417 DoubleAlign = LongLongAlign = 64;
1418 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 +00001419 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1420 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001421 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001422 virtual void getTargetDefines(const LangOptions &Opts,
1423 MacroBuilder &Builder) const {
1424 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1425 }
1426};
1427} // end anonymous namespace
1428
1429namespace {
1430
1431// x86-32 Windows Visual Studio target
1432class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1433public:
1434 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1435 : WindowsX86_32TargetInfo(triple) {
1436 LongDoubleWidth = 64;
1437 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1438 }
1439 virtual void getTargetDefines(const LangOptions &Opts,
1440 MacroBuilder &Builder) const {
1441 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1442 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1443 // The value of the following reflects processor type.
1444 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1445 // We lost the original triple, so we use the default.
1446 Builder.defineMacro("_M_IX86", "600");
1447 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001448};
1449} // end anonymous namespace
1450
1451namespace {
1452// x86-32 MinGW target
1453class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1454public:
1455 MinGWX86_32TargetInfo(const std::string& triple)
1456 : WindowsX86_32TargetInfo(triple) {
1457 }
1458 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001459 MacroBuilder &Builder) const {
1460 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001461 DefineStd(Builder, "WIN32", Opts);
1462 DefineStd(Builder, "WINNT", Opts);
1463 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001464 Builder.defineMacro("__MSVCRT__");
1465 Builder.defineMacro("__MINGW32__");
1466 Builder.defineMacro("__declspec", "__declspec");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001467 }
1468};
1469} // end anonymous namespace
1470
1471namespace {
1472// x86-32 Cygwin target
1473class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1474public:
1475 CygwinX86_32TargetInfo(const std::string& triple)
1476 : X86_32TargetInfo(triple) {
1477 TLSSupported = false;
1478 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001479 DoubleAlign = LongLongAlign = 64;
1480 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1481 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001482 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001483 }
1484 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001485 MacroBuilder &Builder) const {
1486 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1487 Builder.defineMacro("__CYGWIN__");
1488 Builder.defineMacro("__CYGWIN32__");
1489 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00001490 if (Opts.CPlusPlus)
1491 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00001492 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001493};
1494} // end anonymous namespace
1495
1496namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00001497// x86-32 Haiku target
1498class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1499public:
1500 HaikuX86_32TargetInfo(const std::string& triple)
1501 : X86_32TargetInfo(triple) {
1502 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00001503 IntPtrType = SignedLong;
1504 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00001505 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00001506 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00001507 virtual void getTargetDefines(const LangOptions &Opts,
1508 MacroBuilder &Builder) const {
1509 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1510 Builder.defineMacro("__INTEL__");
1511 Builder.defineMacro("__HAIKU__");
1512 }
1513};
1514} // end anonymous namespace
1515
1516namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001517// x86-64 generic target
1518class X86_64TargetInfo : public X86TargetInfo {
1519public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001520 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001521 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00001522 LongDoubleWidth = 128;
1523 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00001524 LargeArrayMinWidth = 128;
1525 LargeArrayAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001526 IntMaxType = SignedLong;
1527 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001528 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001529 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001530
Eli Friedman873f65a2008-08-21 00:13:15 +00001531 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1532 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001533 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001534
1535 // Use fpret only for long double.
1536 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Chris Lattner10a5b382007-01-29 05:24:35 +00001537 }
Anders Carlssona7408e72007-10-13 00:45:48 +00001538 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001539 return "typedef struct __va_list_tag {"
1540 " unsigned gp_offset;"
1541 " unsigned fp_offset;"
1542 " void* overflow_arg_area;"
1543 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00001544 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00001545 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001546 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001547
Chris Lattnerd545ad12009-09-23 06:06:36 +00001548 int getEHDataRegisterNumber(unsigned RegNo) const {
1549 if (RegNo == 0) return 0;
1550 if (RegNo == 1) return 1;
1551 return -1;
1552 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001553};
1554} // end anonymous namespace
1555
1556namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001557// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001558class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001559public:
1560 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001561 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001562 TLSSupported = false;
1563 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00001564 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001565 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00001566 IntMaxType = SignedLongLong;
1567 UIntMaxType = UnsignedLongLong;
1568 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00001569 SizeType = UnsignedLongLong;
1570 PtrDiffType = SignedLongLong;
1571 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001572 }
1573 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001574 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001575 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001576 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001577 }
1578};
1579} // end anonymous namespace
1580
1581namespace {
1582// x86-64 Windows Visual Studio target
1583class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1584public:
1585 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1586 : WindowsX86_64TargetInfo(triple) {
1587 }
1588 virtual void getTargetDefines(const LangOptions &Opts,
1589 MacroBuilder &Builder) const {
1590 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1591 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001592 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001593 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001594 }
Chris Lattner04dc9572010-08-31 16:44:54 +00001595 virtual const char *getVAListDeclaration() const {
1596 return "typedef char* __builtin_va_list;";
1597 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001598};
1599} // end anonymous namespace
1600
1601namespace {
1602// x86-64 MinGW target
1603class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1604public:
1605 MinGWX86_64TargetInfo(const std::string& triple)
1606 : WindowsX86_64TargetInfo(triple) {
1607 }
1608 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001609 MacroBuilder &Builder) const {
1610 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001611 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001612 Builder.defineMacro("__MSVCRT__");
1613 Builder.defineMacro("__MINGW64__");
1614 Builder.defineMacro("__declspec");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001615 }
1616};
1617} // end anonymous namespace
1618
1619namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00001620class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1621public:
Mike Stump11289f42009-09-09 15:08:12 +00001622 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00001623 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1624 Int64Type = SignedLongLong;
1625 }
1626};
1627} // end anonymous namespace
1628
1629namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00001630class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1631public:
Mike Stump11289f42009-09-09 15:08:12 +00001632 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00001633 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1634 IntMaxType = SignedLongLong;
1635 UIntMaxType = UnsignedLongLong;
1636 Int64Type = SignedLongLong;
1637 }
1638};
1639} // end anonymous namespace
1640
1641namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001642class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001643 // Possible FPU choices.
1644 enum FPUMode {
1645 NoFPU,
1646 VFP2FPU,
1647 VFP3FPU,
1648 NeonFPU
1649 };
1650
1651 static bool FPUModeIsVFP(FPUMode Mode) {
1652 return Mode >= VFP2FPU && Mode <= NeonFPU;
1653 }
1654
1655 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1656 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001657
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001658 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001659
1660 unsigned FPU : 3;
1661
Daniel Dunbar893d4752009-12-19 04:15:38 +00001662 unsigned IsThumb : 1;
1663
1664 // Initialized via features.
1665 unsigned SoftFloat : 1;
1666 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001667
Chris Lattner5cc15e02010-03-03 19:03:45 +00001668 static const Builtin::Info BuiltinInfo[];
1669
Chris Lattner17df24e2008-04-21 18:56:49 +00001670public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001671 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001672 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001673 {
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001674 SizeType = UnsignedInt;
1675 PtrDiffType = SignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001676
Chris Lattner1a8f3942010-04-23 16:29:58 +00001677 // {} in inline assembly are neon specifiers, not assembly variant
1678 // specifiers.
1679 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001680
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001681 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00001682 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00001683 if (IsThumb) {
1684 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1685 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001686 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001687 } else {
1688 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1689 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001690 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001691 }
John McCall86353412010-08-21 22:46:04 +00001692
1693 // ARM targets default to using the ARM C++ ABI.
1694 CXXABI = CXXABI_ARM;
Eli Friedmanb5366062008-05-20 14:21:01 +00001695 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001696 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001697 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001698 ABI = Name;
1699
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001700 // The defaults (above) are for AAPCS, check if we need to change them.
1701 //
1702 // FIXME: We need support for -meabi... we could just mangle it into the
1703 // name.
1704 if (Name == "apcs-gnu") {
Daniel Dunbar377dc2f2010-01-27 20:23:08 +00001705 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001706 SizeType = UnsignedLong;
1707
Daniel Dunbarf8125062010-04-22 16:14:54 +00001708 // Do not respect the alignment of bit-field types when laying out
1709 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1710 UseBitFieldTypeAlignment = false;
1711
Daniel Dunbar03184792009-09-22 21:44:58 +00001712 if (IsThumb) {
1713 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1714 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001715 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001716 } else {
1717 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1718 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001719 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001720 }
1721
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001722 // FIXME: Override "preferred align" for double and long long.
1723 } else if (Name == "aapcs") {
1724 // FIXME: Enumerated types are variable width in straight AAPCS.
1725 } else if (Name == "aapcs-linux") {
1726 ;
1727 } else
1728 return false;
1729
1730 return true;
1731 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001732
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001733 void getDefaultFeatures(const std::string &CPU,
1734 llvm::StringMap<bool> &Features) const {
1735 // FIXME: This should not be here.
1736 Features["vfp2"] = false;
1737 Features["vfp3"] = false;
1738 Features["neon"] = false;
1739
1740 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1741 Features["vfp2"] = true;
1742 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1743 Features["neon"] = true;
1744 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001745
Daniel Dunbar893d4752009-12-19 04:15:38 +00001746 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1747 const std::string &Name,
1748 bool Enabled) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001749 if (Name == "soft-float" || Name == "soft-float-abi") {
1750 Features[Name] = Enabled;
1751 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1752 // These effectively are a single option, reset them when any is enabled.
1753 if (Enabled)
1754 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1755 Features[Name] = Enabled;
1756 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00001757 return false;
1758
Daniel Dunbar893d4752009-12-19 04:15:38 +00001759 return true;
1760 }
1761
1762 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001763 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001764 SoftFloat = SoftFloatABI = false;
1765 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1766 if (Features[i] == "+soft-float")
1767 SoftFloat = true;
1768 else if (Features[i] == "+soft-float-abi")
1769 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001770 else if (Features[i] == "+vfp2")
1771 FPU = VFP2FPU;
1772 else if (Features[i] == "+vfp3")
1773 FPU = VFP3FPU;
1774 else if (Features[i] == "+neon")
1775 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001776 }
1777
1778 // Remove front-end specific options which the backend handles differently.
1779 std::vector<std::string>::iterator it;
1780 it = std::find(Features.begin(), Features.end(), "+soft-float");
1781 if (it != Features.end())
1782 Features.erase(it);
1783 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1784 if (it != Features.end())
1785 Features.erase(it);
1786 }
1787
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001788 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1789 return llvm::StringSwitch<const char*>(Name)
1790 .Cases("arm8", "arm810", "4")
1791 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1792 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1793 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1794 .Case("ep9312", "4T")
1795 .Cases("arm10tdmi", "arm1020t", "5T")
1796 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1797 .Case("arm926ej-s", "5TEJ")
1798 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1799 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001800 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001801 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001802 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001803 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1804 .Cases("cortex-a8", "cortex-a9", "7A")
1805 .Default(0);
1806 }
1807 virtual bool setCPU(const std::string &Name) {
1808 if (!getCPUDefineSuffix(Name))
1809 return false;
1810
1811 CPU = Name;
1812 return true;
1813 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001814 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001815 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001816 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001817 Builder.defineMacro("__arm");
1818 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001819
Chris Lattnerecd49032009-03-02 22:27:17 +00001820 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001821 Builder.defineMacro("__ARMEL__");
1822 Builder.defineMacro("__LITTLE_ENDIAN__");
1823 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001824
1825 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001826 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001827
Mike Stump9d54bd72009-04-08 02:07:04 +00001828 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001829
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001830 // FIXME: It's more complicated than this and we don't really support
1831 // interworking.
1832 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001833 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001834
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001835 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001836 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001837
Daniel Dunbar893d4752009-12-19 04:15:38 +00001838 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001839 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001840
1841 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001842 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001843
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001844 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001845 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001846 Builder.defineMacro("__THUMBEL__");
1847 Builder.defineMacro("__thumb__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001848 if (IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001849 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001850 }
1851
1852 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001853 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001854
1855 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001856 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001857
1858 // This only gets set when Neon instructions are actually available, unlike
1859 // the VFP define, hence the soft float and arch check. This is subtly
1860 // different from gcc, we follow the intent which was that it should be set
1861 // when Neon instructions are actually available.
1862 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001863 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00001864 }
1865 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1866 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00001867 Records = BuiltinInfo;
1868 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00001869 }
1870 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001871 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00001872 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001873 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001874 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001875 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001876 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00001877 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001878 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001879 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00001880 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001881 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00001882 case 'l': // r0-r7
1883 case 'h': // r8-r15
1884 case 'w': // VFP Floating point register single precision
1885 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00001886 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00001887 return true;
1888 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001889 return false;
1890 }
1891 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001892 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00001893 return "";
1894 }
1895};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001896
1897const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001898 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001899 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001900 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
1901
1902 // Float registers
1903 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1904 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1905 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001906 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001907
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001908 // Double registers
1909 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
1910 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00001911 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
1912 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001913
1914 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00001915 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1916 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001917};
1918
1919void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00001920 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001921 Names = GCCRegNames;
1922 NumNames = llvm::array_lengthof(GCCRegNames);
1923}
1924
1925const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001926 { { "a1" }, "r0" },
1927 { { "a2" }, "r1" },
1928 { { "a3" }, "r2" },
1929 { { "a4" }, "r3" },
1930 { { "v1" }, "r4" },
1931 { { "v2" }, "r5" },
1932 { { "v3" }, "r6" },
1933 { { "v4" }, "r7" },
1934 { { "v5" }, "r8" },
1935 { { "v6", "rfp" }, "r9" },
1936 { { "sl" }, "r10" },
1937 { { "fp" }, "r11" },
1938 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00001939 { { "r13" }, "sp" },
1940 { { "r14" }, "lr" },
1941 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001942 // The S, D and Q registers overlap, but aren't really aliases; we
1943 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001944};
1945
1946void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1947 unsigned &NumAliases) const {
1948 Aliases = GCCRegAliases;
1949 NumAliases = llvm::array_lengthof(GCCRegAliases);
1950}
Chris Lattner5cc15e02010-03-03 19:03:45 +00001951
1952const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001953#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
1954#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1955 ALL_LANGUAGES, false },
Chris Lattner5cc15e02010-03-03 19:03:45 +00001956#include "clang/Basic/BuiltinsARM.def"
1957};
Chris Lattner17df24e2008-04-21 18:56:49 +00001958} // end anonymous namespace.
1959
Eli Friedmanf05b7722008-08-20 07:44:10 +00001960
1961namespace {
Mike Stump11289f42009-09-09 15:08:12 +00001962class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00001963 public DarwinTargetInfo<ARMTargetInfo> {
1964protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00001965 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001966 MacroBuilder &Builder) const {
Daniel Dunbard86666f2010-01-26 01:44:04 +00001967 getDarwinDefines(Builder, Opts, Triple);
Eli Friedmand88c8a12009-04-19 21:38:35 +00001968 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00001969
Torok Edwinb2b37c62009-06-30 17:10:35 +00001970public:
Mike Stump11289f42009-09-09 15:08:12 +00001971 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00001972 : DarwinTargetInfo<ARMTargetInfo>(triple) {
1973 HasAlignMac68kSupport = true;
1974 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00001975};
1976} // end anonymous namespace.
1977
Chris Lattner5ba61f02006-10-14 07:39:34 +00001978namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001979class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00001980 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1981 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001982 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00001983public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001984 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
1985 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00001986 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 +00001987 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001988 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001989 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1990 const std::string &Name,
1991 bool Enabled) const {
1992 if (Name == "soft-float")
1993 Features[Name] = Enabled;
1994 else
1995 return false;
1996
1997 return true;
1998 }
1999 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2000 SoftFloat = false;
2001 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2002 if (Features[i] == "+soft-float")
2003 SoftFloat = true;
2004 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002005 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002006 MacroBuilder &Builder) const {
2007 DefineStd(Builder, "sparc", Opts);
2008 Builder.defineMacro("__sparcv8");
2009 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002010
2011 if (SoftFloat)
2012 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00002013 }
2014 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2015 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002016 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00002017 }
2018 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002019 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00002020 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002021 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002022 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002023 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002024 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002025 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00002026 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002027 // FIXME: Implement!
2028 return false;
Gabor Greif49991682008-02-21 16:29:08 +00002029 }
2030 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002031 // FIXME: Implement!
2032 return "";
Gabor Greif49991682008-02-21 16:29:08 +00002033 }
2034};
2035
Chris Lattner9b415d62009-01-27 01:58:38 +00002036const char * const SparcV8TargetInfo::GCCRegNames[] = {
2037 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2038 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2039 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2040 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2041};
2042
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002043void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002044 unsigned &NumNames) const {
2045 Names = GCCRegNames;
2046 NumNames = llvm::array_lengthof(GCCRegNames);
2047}
2048
2049const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002050 { { "g0" }, "r0" },
2051 { { "g1" }, "r1" },
2052 { { "g2" }, "r2" },
2053 { { "g3" }, "r3" },
2054 { { "g4" }, "r4" },
2055 { { "g5" }, "r5" },
2056 { { "g6" }, "r6" },
2057 { { "g7" }, "r7" },
2058 { { "o0" }, "r8" },
2059 { { "o1" }, "r9" },
2060 { { "o2" }, "r10" },
2061 { { "o3" }, "r11" },
2062 { { "o4" }, "r12" },
2063 { { "o5" }, "r13" },
2064 { { "o6", "sp" }, "r14" },
2065 { { "o7" }, "r15" },
2066 { { "l0" }, "r16" },
2067 { { "l1" }, "r17" },
2068 { { "l2" }, "r18" },
2069 { { "l3" }, "r19" },
2070 { { "l4" }, "r20" },
2071 { { "l5" }, "r21" },
2072 { { "l6" }, "r22" },
2073 { { "l7" }, "r23" },
2074 { { "i0" }, "r24" },
2075 { { "i1" }, "r25" },
2076 { { "i2" }, "r26" },
2077 { { "i3" }, "r27" },
2078 { { "i4" }, "r28" },
2079 { { "i5" }, "r29" },
2080 { { "i6", "fp" }, "r30" },
2081 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00002082};
2083
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002084void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002085 unsigned &NumAliases) const {
2086 Aliases = GCCRegAliases;
2087 NumAliases = llvm::array_lengthof(GCCRegAliases);
2088}
Gabor Greif49991682008-02-21 16:29:08 +00002089} // end anonymous namespace.
2090
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002091namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002092class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2093public:
2094 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2095 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2096 SizeType = UnsignedInt;
2097 PtrDiffType = SignedInt;
2098 }
2099};
Torok Edwinb2b37c62009-06-30 17:10:35 +00002100class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002101public:
2102 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002103 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00002104 SizeType = UnsignedInt;
2105 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002106 }
2107};
2108} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00002109
Chris Lattnerb781dc792008-05-08 05:58:21 +00002110namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002111 class MSP430TargetInfo : public TargetInfo {
2112 static const char * const GCCRegNames[];
2113 public:
2114 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2115 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00002116 IntWidth = 16; IntAlign = 16;
2117 LongWidth = 32; LongLongWidth = 64;
2118 LongAlign = LongLongAlign = 16;
2119 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002120 SizeType = UnsignedInt;
2121 IntMaxType = SignedLong;
2122 UIntMaxType = UnsignedLong;
2123 IntPtrType = SignedShort;
2124 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00002125 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00002126 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002127 }
2128 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002129 MacroBuilder &Builder) const {
2130 Builder.defineMacro("MSP430");
2131 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002132 // FIXME: defines for different 'flavours' of MCU
2133 }
2134 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2135 unsigned &NumRecords) const {
2136 // FIXME: Implement.
2137 Records = 0;
2138 NumRecords = 0;
2139 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002140 virtual void getGCCRegNames(const char * const *&Names,
2141 unsigned &NumNames) const;
2142 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2143 unsigned &NumAliases) const {
2144 // No aliases.
2145 Aliases = 0;
2146 NumAliases = 0;
2147 }
2148 virtual bool validateAsmConstraint(const char *&Name,
2149 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00002150 // No target constraints for now.
2151 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002152 }
2153 virtual const char *getClobbers() const {
2154 // FIXME: Is this really right?
2155 return "";
2156 }
2157 virtual const char *getVAListDeclaration() const {
2158 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00002159 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002160 }
2161 };
2162
2163 const char * const MSP430TargetInfo::GCCRegNames[] = {
2164 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2165 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2166 };
2167
2168 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2169 unsigned &NumNames) const {
2170 Names = GCCRegNames;
2171 NumNames = llvm::array_lengthof(GCCRegNames);
2172 }
2173}
2174
2175
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002176namespace {
2177 class SystemZTargetInfo : public TargetInfo {
2178 static const char * const GCCRegNames[];
2179 public:
2180 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2181 TLSSupported = false;
2182 IntWidth = IntAlign = 32;
2183 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2184 PointerWidth = PointerAlign = 64;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002185 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2186 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002187 }
2188 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002189 MacroBuilder &Builder) const {
2190 Builder.defineMacro("__s390__");
2191 Builder.defineMacro("__s390x__");
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002192 }
2193 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2194 unsigned &NumRecords) const {
2195 // FIXME: Implement.
2196 Records = 0;
2197 NumRecords = 0;
2198 }
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002199
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002200 virtual void getGCCRegNames(const char * const *&Names,
2201 unsigned &NumNames) const;
2202 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2203 unsigned &NumAliases) const {
2204 // No aliases.
2205 Aliases = 0;
2206 NumAliases = 0;
2207 }
2208 virtual bool validateAsmConstraint(const char *&Name,
2209 TargetInfo::ConstraintInfo &info) const {
2210 // FIXME: implement
2211 return true;
2212 }
2213 virtual const char *getClobbers() const {
2214 // FIXME: Is this really right?
2215 return "";
2216 }
2217 virtual const char *getVAListDeclaration() const {
2218 // FIXME: implement
2219 return "typedef char* __builtin_va_list;";
2220 }
2221 };
2222
2223 const char * const SystemZTargetInfo::GCCRegNames[] = {
2224 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2225 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2226 };
2227
2228 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2229 unsigned &NumNames) const {
2230 Names = GCCRegNames;
2231 NumNames = llvm::array_lengthof(GCCRegNames);
2232 }
2233}
2234
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002235namespace {
2236 class BlackfinTargetInfo : public TargetInfo {
2237 static const char * const GCCRegNames[];
2238 public:
2239 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2240 TLSSupported = false;
2241 DoubleAlign = 32;
2242 LongLongAlign = 32;
2243 LongDoubleAlign = 32;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002244 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002245 }
2246
2247 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002248 MacroBuilder &Builder) const {
2249 DefineStd(Builder, "bfin", Opts);
2250 DefineStd(Builder, "BFIN", Opts);
2251 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002252 // FIXME: This one is really dependent on -mcpu
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002253 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002254 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2255 }
2256
2257 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2258 unsigned &NumRecords) const {
2259 // FIXME: Implement.
2260 Records = 0;
2261 NumRecords = 0;
2262 }
2263
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002264 virtual void getGCCRegNames(const char * const *&Names,
2265 unsigned &NumNames) const;
2266
2267 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2268 unsigned &NumAliases) const {
2269 // No aliases.
2270 Aliases = 0;
2271 NumAliases = 0;
2272 }
2273
2274 virtual bool validateAsmConstraint(const char *&Name,
2275 TargetInfo::ConstraintInfo &Info) const {
2276 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2277 Info.setAllowsRegister();
2278 return true;
2279 }
2280 return false;
2281 }
2282
2283 virtual const char *getClobbers() const {
2284 return "";
2285 }
2286
2287 virtual const char *getVAListDeclaration() const {
2288 return "typedef char* __builtin_va_list;";
2289 }
2290 };
2291
2292 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2293 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2294 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2295 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2296 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2297 "a0", "a1", "cc",
2298 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2299 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2300 };
2301
2302 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2303 unsigned &NumNames) const {
2304 Names = GCCRegNames;
2305 NumNames = llvm::array_lengthof(GCCRegNames);
2306 }
2307}
2308
Eli Friedmana9c3d712009-08-19 20:47:07 +00002309namespace {
2310
Mike Stump11289f42009-09-09 15:08:12 +00002311 // LLVM and Clang cannot be used directly to output native binaries for
2312 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00002313 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00002314 //
2315 // TCE uses the llvm bitcode as input and uses it for generating customized
2316 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00002317 // publicly available in http://tce.cs.tut.fi
2318
2319 class TCETargetInfo : public TargetInfo{
2320 public:
2321 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2322 TLSSupported = false;
2323 IntWidth = 32;
2324 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00002325 PointerWidth = 32;
2326 IntAlign = 32;
2327 LongAlign = LongLongAlign = 32;
2328 PointerAlign = 32;
2329 SizeType = UnsignedInt;
2330 IntMaxType = SignedLong;
2331 UIntMaxType = UnsignedLong;
2332 IntPtrType = SignedInt;
2333 PtrDiffType = SignedInt;
2334 FloatWidth = 32;
2335 FloatAlign = 32;
2336 DoubleWidth = 32;
2337 DoubleAlign = 32;
2338 LongDoubleWidth = 32;
2339 LongDoubleAlign = 32;
2340 FloatFormat = &llvm::APFloat::IEEEsingle;
2341 DoubleFormat = &llvm::APFloat::IEEEsingle;
2342 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00002343 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2344 "i16:16:32-i32:32:32-i64:32:32-"
2345 "f32:32:32-f64:64:64-v64:64:64-"
2346 "v128:128:128-a0:0:64-n32";
Eli Friedmana9c3d712009-08-19 20:47:07 +00002347 }
2348
2349 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002350 MacroBuilder &Builder) const {
2351 DefineStd(Builder, "tce", Opts);
2352 Builder.defineMacro("__TCE__");
2353 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00002354 }
2355 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2356 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00002357 virtual const char *getClobbers() const {
2358 return "";
2359 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002360 virtual const char *getVAListDeclaration() const {
2361 return "typedef void* __builtin_va_list;";
2362 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002363 virtual void getGCCRegNames(const char * const *&Names,
2364 unsigned &NumNames) const {}
2365 virtual bool validateAsmConstraint(const char *&Name,
2366 TargetInfo::ConstraintInfo &info) const {
2367 return true;
2368 }
2369 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2370 unsigned &NumAliases) const {}
2371 };
2372}
2373
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002374namespace {
2375class MipsTargetInfo : public TargetInfo {
Eric Christopher0b26a612010-03-02 02:41:08 +00002376 std::string ABI, CPU;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002377 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2378 static const char * const GCCRegNames[];
2379public:
Eric Christopher0b26a612010-03-02 02:41:08 +00002380 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002381 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2382 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2383 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002384 virtual const char *getABI() const { return ABI.c_str(); }
2385 virtual bool setABI(const std::string &Name) {
2386
2387 if ((Name == "o32") || (Name == "eabi")) {
2388 ABI = Name;
2389 return true;
2390 } else
2391 return false;
2392 }
2393 virtual bool setCPU(const std::string &Name) {
2394 CPU = Name;
2395 return true;
2396 }
2397 void getDefaultFeatures(const std::string &CPU,
2398 llvm::StringMap<bool> &Features) const {
2399 Features[ABI] = true;
2400 Features[CPU] = true;
2401 }
2402 virtual void getArchDefines(const LangOptions &Opts,
2403 MacroBuilder &Builder) const {
2404 if (ABI == "o32")
2405 Builder.defineMacro("__mips_o32");
2406 else if (ABI == "eabi")
2407 Builder.defineMacro("__mips_eabi");
2408 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002409 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002410 MacroBuilder &Builder) const {
2411 DefineStd(Builder, "mips", Opts);
2412 Builder.defineMacro("_mips");
2413 DefineStd(Builder, "MIPSEB", Opts);
2414 Builder.defineMacro("_MIPSEB");
2415 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002416 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002417 }
2418 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2419 unsigned &NumRecords) const {
2420 // FIXME: Implement!
2421 }
2422 virtual const char *getVAListDeclaration() const {
2423 return "typedef void* __builtin_va_list;";
2424 }
2425 virtual void getGCCRegNames(const char * const *&Names,
2426 unsigned &NumNames) const;
2427 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2428 unsigned &NumAliases) const;
2429 virtual bool validateAsmConstraint(const char *&Name,
2430 TargetInfo::ConstraintInfo &Info) const {
2431 switch (*Name) {
2432 default:
2433 case 'r': // CPU registers.
2434 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2435 case 'y': // Equivalent to "r", backwards compatibility only.
2436 case 'f': // floating-point registers.
2437 Info.setAllowsRegister();
2438 return true;
2439 }
2440 return false;
2441 }
2442
2443 virtual const char *getClobbers() const {
2444 // FIXME: Implement!
2445 return "";
2446 }
2447};
2448
2449const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002450 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002451 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2452 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2453 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2454 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2455 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2456 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2457 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2458 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2459 "$fcc5","$fcc6","$fcc7"
2460};
2461
2462void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2463 unsigned &NumNames) const {
2464 Names = GCCRegNames;
2465 NumNames = llvm::array_lengthof(GCCRegNames);
2466}
2467
2468const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2469 { { "at" }, "$1" },
2470 { { "v0" }, "$2" },
2471 { { "v1" }, "$3" },
2472 { { "a0" }, "$4" },
2473 { { "a1" }, "$5" },
2474 { { "a2" }, "$6" },
2475 { { "a3" }, "$7" },
2476 { { "t0" }, "$8" },
2477 { { "t1" }, "$9" },
2478 { { "t2" }, "$10" },
2479 { { "t3" }, "$11" },
2480 { { "t4" }, "$12" },
2481 { { "t5" }, "$13" },
2482 { { "t6" }, "$14" },
2483 { { "t7" }, "$15" },
2484 { { "s0" }, "$16" },
2485 { { "s1" }, "$17" },
2486 { { "s2" }, "$18" },
2487 { { "s3" }, "$19" },
2488 { { "s4" }, "$20" },
2489 { { "s5" }, "$21" },
2490 { { "s6" }, "$22" },
2491 { { "s7" }, "$23" },
2492 { { "t8" }, "$24" },
2493 { { "t9" }, "$25" },
2494 { { "k0" }, "$26" },
2495 { { "k1" }, "$27" },
2496 { { "gp" }, "$28" },
2497 { { "sp" }, "$29" },
2498 { { "fp" }, "$30" },
2499 { { "ra" }, "$31" }
2500};
2501
2502void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2503 unsigned &NumAliases) const {
2504 Aliases = GCCRegAliases;
2505 NumAliases = llvm::array_lengthof(GCCRegAliases);
2506}
2507} // end anonymous namespace.
2508
2509namespace {
2510class MipselTargetInfo : public MipsTargetInfo {
2511public:
2512 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2513 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2514 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2515 }
2516
2517 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002518 MacroBuilder &Builder) const;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002519};
2520
2521void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002522 MacroBuilder &Builder) const {
2523 DefineStd(Builder, "mips", Opts);
2524 Builder.defineMacro("_mips");
2525 DefineStd(Builder, "MIPSEL", Opts);
2526 Builder.defineMacro("_MIPSEL");
2527 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002528 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002529}
2530} // end anonymous namespace.
2531
Chris Lattner5ba61f02006-10-14 07:39:34 +00002532//===----------------------------------------------------------------------===//
2533// Driver code
2534//===----------------------------------------------------------------------===//
2535
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002536static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00002537 llvm::Triple Triple(T);
2538 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00002539
Daniel Dunbar52322032009-08-18 05:47:58 +00002540 switch (Triple.getArch()) {
2541 default:
2542 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00002543
Daniel Dunbar52322032009-08-18 05:47:58 +00002544 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00002545 case llvm::Triple::thumb:
Daniel Dunbar52322032009-08-18 05:47:58 +00002546 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00002547 case llvm::Triple::Linux:
2548 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002549 case llvm::Triple::Darwin:
Eli Friedman873f65a2008-08-21 00:13:15 +00002550 return new DarwinARMTargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002551 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002552 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002553 default:
2554 return new ARMTargetInfo(T);
2555 }
Eli Friedmanb5366062008-05-20 14:21:01 +00002556
Daniel Dunbar52322032009-08-18 05:47:58 +00002557 case llvm::Triple::bfin:
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002558 return new BlackfinTargetInfo(T);
2559
Daniel Dunbar52322032009-08-18 05:47:58 +00002560 case llvm::Triple::msp430:
2561 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00002562
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002563 case llvm::Triple::mips:
2564 if (os == llvm::Triple::Psp)
2565 return new PSPTargetInfo<MipsTargetInfo>(T);
2566 if (os == llvm::Triple::Linux)
2567 return new LinuxTargetInfo<MipsTargetInfo>(T);
2568 return new MipsTargetInfo(T);
2569
2570 case llvm::Triple::mipsel:
2571 if (os == llvm::Triple::Psp)
2572 return new PSPTargetInfo<MipselTargetInfo>(T);
2573 if (os == llvm::Triple::Linux)
2574 return new LinuxTargetInfo<MipselTargetInfo>(T);
2575 return new MipselTargetInfo(T);
2576
Daniel Dunbar52322032009-08-18 05:47:58 +00002577 case llvm::Triple::ppc:
2578 if (os == llvm::Triple::Darwin)
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00002579 return new DarwinPPCTargetInfo(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002580 else if (os == llvm::Triple::FreeBSD)
2581 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002582 return new PPC32TargetInfo(T);
2583
2584 case llvm::Triple::ppc64:
2585 if (os == llvm::Triple::Darwin)
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00002586 return new DarwinPPC64TargetInfo(T);
John Thompsone467e192009-11-19 17:18:50 +00002587 else if (os == llvm::Triple::Lv2)
2588 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002589 else if (os == llvm::Triple::FreeBSD)
2590 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002591 return new PPC64TargetInfo(T);
2592
Chris Lattner5178f562010-03-06 21:21:27 +00002593 case llvm::Triple::mblaze:
2594 return new MBlazeTargetInfo(T);
2595
Daniel Dunbar52322032009-08-18 05:47:58 +00002596 case llvm::Triple::sparc:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002597 if (os == llvm::Triple::AuroraUX)
2598 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002599 if (os == llvm::Triple::Solaris)
2600 return new SolarisSparcV8TargetInfo(T);
2601 return new SparcV8TargetInfo(T);
2602
John Thompsone467e192009-11-19 17:18:50 +00002603 // FIXME: Need a real SPU target.
2604 case llvm::Triple::cellspu:
2605 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2606
Daniel Dunbar52322032009-08-18 05:47:58 +00002607 case llvm::Triple::systemz:
2608 return new SystemZTargetInfo(T);
2609
Eli Friedmana9c3d712009-08-19 20:47:07 +00002610 case llvm::Triple::tce:
2611 return new TCETargetInfo(T);
2612
Daniel Dunbar52322032009-08-18 05:47:58 +00002613 case llvm::Triple::x86:
2614 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002615 case llvm::Triple::AuroraUX:
2616 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002617 case llvm::Triple::Darwin:
2618 return new DarwinI386TargetInfo(T);
2619 case llvm::Triple::Linux:
2620 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2621 case llvm::Triple::DragonFly:
2622 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2623 case llvm::Triple::NetBSD:
2624 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2625 case llvm::Triple::OpenBSD:
2626 return new OpenBSDI386TargetInfo(T);
2627 case llvm::Triple::FreeBSD:
2628 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00002629 case llvm::Triple::Minix:
2630 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002631 case llvm::Triple::Solaris:
2632 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2633 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002634 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002635 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002636 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002637 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002638 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00002639 case llvm::Triple::Haiku:
2640 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002641 default:
2642 return new X86_32TargetInfo(T);
2643 }
2644
2645 case llvm::Triple::x86_64:
2646 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002647 case llvm::Triple::AuroraUX:
2648 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002649 case llvm::Triple::Darwin:
2650 return new DarwinX86_64TargetInfo(T);
2651 case llvm::Triple::Linux:
2652 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00002653 case llvm::Triple::DragonFly:
2654 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002655 case llvm::Triple::NetBSD:
2656 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2657 case llvm::Triple::OpenBSD:
2658 return new OpenBSDX86_64TargetInfo(T);
2659 case llvm::Triple::FreeBSD:
2660 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2661 case llvm::Triple::Solaris:
2662 return new SolarisTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002663 case llvm::Triple::MinGW64:
2664 return new MinGWX86_64TargetInfo(T);
2665 case llvm::Triple::Win32: // This is what Triple.h supports now.
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002666 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002667 default:
2668 return new X86_64TargetInfo(T);
2669 }
2670 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002671}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002672
2673/// CreateTargetInfo - Return the target info object for the specified target
2674/// triple.
2675TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002676 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002677 llvm::Triple Triple(Opts.Triple);
2678
2679 // Construct the target
2680 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2681 if (!Target) {
2682 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2683 return 0;
2684 }
2685
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002686 // Set the target CPU if specified.
2687 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2688 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2689 return 0;
2690 }
2691
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002692 // Set the target ABI if specified.
2693 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2694 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2695 return 0;
2696 }
2697
Charles Davis95a546e2010-06-11 01:06:47 +00002698 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00002699 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00002700 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2701 return 0;
2702 }
2703
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002704 // Compute the default target features, we need the target to handle this
2705 // because features may have dependencies on one another.
2706 llvm::StringMap<bool> Features;
2707 Target->getDefaultFeatures(Opts.CPU, Features);
2708
2709 // Apply the user specified deltas.
2710 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2711 ie = Opts.Features.end(); it != ie; ++it) {
2712 const char *Name = it->c_str();
2713
2714 // Apply the feature via the target.
2715 if ((Name[0] != '-' && Name[0] != '+') ||
2716 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2717 Diags.Report(diag::err_target_invalid_feature) << Name;
2718 return 0;
2719 }
2720 }
2721
2722 // Add the features to the compile options.
2723 //
2724 // FIXME: If we are completely confident that we have the right set, we only
2725 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002726 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002727 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2728 ie = Features.end(); it != ie; ++it)
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002729 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2730 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002731
2732 return Target.take();
2733}