blob: a8198e4ae79e288207cc8e73bcc96da7e8345793 [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikova7c47172009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenekbbced582007-12-12 18:05:32 +000011// target triple.
Reid Spencer5f016e22007-07-11 17:01:13 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer5f016e22007-07-11 17:01:13 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattner8fc4dfb2008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth103b71c2010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman25531262008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar29a790b2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar77659342009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar29a790b2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner4c28b1c2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner797c3c42009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
Dale Johannesen1e592cb2010-10-29 23:24:33 +000029#include "llvm/Type.h"
Benjamin Kramer48725082010-01-09 18:20:57 +000030#include <algorithm>
Reid Spencer5f016e22007-07-11 17:01:13 +000031using namespace clang;
32
Reid Spencer5f016e22007-07-11 17:01:13 +000033//===----------------------------------------------------------------------===//
34// Common code shared among targets.
35//===----------------------------------------------------------------------===//
36
Chris Lattnerca45cff2009-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 Kramera9992772010-01-09 17:55:51 +000040static void DefineStd(MacroBuilder &Builder, llvm::StringRef MacroName,
Chris Lattnerca45cff2009-03-20 16:06:38 +000041 const LangOptions &Opts) {
42 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000043
Chris Lattnerca45cff2009-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 Kramera9992772010-01-09 17:55:51 +000047 Builder.defineMacro(MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000048
Chris Lattnerca45cff2009-03-20 16:06:38 +000049 // Define __unix.
Benjamin Kramera9992772010-01-09 17:55:51 +000050 Builder.defineMacro("__" + MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000051
Chris Lattnerca45cff2009-03-20 16:06:38 +000052 // Define __unix__.
Benjamin Kramera9992772010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerca45cff2009-03-20 16:06:38 +000054}
55
Chris Lattnerd29b6302008-10-05 21:50:58 +000056//===----------------------------------------------------------------------===//
57// Defines specific to certain operating systems.
58//===----------------------------------------------------------------------===//
Chris Lattner797c3c42009-08-10 19:03:04 +000059
Torok Edwin5f6c1942009-06-30 17:10:35 +000060namespace {
Douglas Gregora3844922009-07-01 15:12:53 +000061template<typename TgtInfo>
62class OSTargetInfo : public TgtInfo {
Torok Edwin5f6c1942009-06-30 17:10:35 +000063protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +000064 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +000065 MacroBuilder &Builder) const=0;
Torok Edwin5f6c1942009-06-30 17:10:35 +000066public:
Douglas Gregora3844922009-07-01 15:12:53 +000067 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwin5f6c1942009-06-30 17:10:35 +000068 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +000069 MacroBuilder &Builder) const {
70 TgtInfo::getTargetDefines(Opts, Builder);
71 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwinb0a5b242009-06-30 17:00:25 +000072 }
Torok Edwin5f6c1942009-06-30 17:10:35 +000073
74};
Chris Lattner4c28b1c2009-08-12 06:24:27 +000075} // end anonymous namespace
Torok Edwinb0a5b242009-06-30 17:00:25 +000076
Chris Lattner797c3c42009-08-10 19:03:04 +000077
Daniel Dunbar21ae3192010-01-26 01:44:04 +000078static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
79 const llvm::Triple &Triple) {
Benjamin Kramera9992772010-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 Korobeynikova7c47172009-05-03 13:42:53 +000084
Chris Lattner10d24272009-04-07 16:50:40 +000085 // __weak is always defined, for use in blocks and with objc pointers.
Benjamin Kramera9992772010-01-09 17:55:51 +000086 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000087
Chris Lattner10d24272009-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 Kramera9992772010-01-09 17:55:51 +000090 Builder.defineMacro("__strong", "");
Chris Lattner10d24272009-04-07 16:50:40 +000091 else
Benjamin Kramera9992772010-01-09 17:55:51 +000092 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
Eli Friedman2de4fee2009-06-04 23:00:29 +000093
94 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +000095 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +000096 else
Benjamin Kramera9992772010-01-09 17:55:51 +000097 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +000098
99 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000100 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000101
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000102 // Get the OS version number from the triple.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000103 unsigned Maj, Min, Rev;
Mike Stump1eb44332009-09-09 15:08:12 +0000104
Daniel Dunbar21ae3192010-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 Dunbar8d33cd72009-04-10 19:52:24 +0000139 }
Eli Friedman618234a2008-08-20 02:34:37 +0000140}
Reid Spencer5f016e22007-07-11 17:01:13 +0000141
Chris Lattner797c3c42009-08-10 19:03:04 +0000142namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000143template<typename Target>
144class DarwinTargetInfo : public OSTargetInfo<Target> {
145protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000146 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000147 MacroBuilder &Builder) const {
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000148 getDarwinDefines(Builder, Opts, Triple);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000149 }
Mike Stump1eb44332009-09-09 15:08:12 +0000150
Torok Edwin5f6c1942009-06-30 17:10:35 +0000151public:
152 DarwinTargetInfo(const std::string& triple) :
153 OSTargetInfo<Target>(triple) {
Eric Christopherdd53ec92010-06-25 19:04:52 +0000154 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000155 }
156
Anders Carlssonf959fb52010-01-30 18:33:31 +0000157 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner797c3c42009-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. Spencer20249a12010-10-21 03:16:25 +0000164
Anders Carlsson18af3682010-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. Spencer20249a12010-10-21 03:16:25 +0000169
Torok Edwin5f6c1942009-06-30 17:10:35 +0000170};
171
Chris Lattner797c3c42009-08-10 19:03:04 +0000172
Torok Edwin5f6c1942009-06-30 17:10:35 +0000173// DragonFlyBSD Target
174template<typename Target>
175class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
176protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000177 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000178 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000179 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-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 Edwin5f6c1942009-06-30 17:10:35 +0000186 }
187public:
Mike Stump1eb44332009-09-09 15:08:12 +0000188 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000189 : OSTargetInfo<Target>(triple) {}
190};
191
192// FreeBSD Target
193template<typename Target>
194class FreeBSDTargetInfo : public OSTargetInfo<Target> {
195protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000196 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000197 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000198 // FreeBSD defines; list based off of gcc output
199
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000200 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000201 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000202
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000203 Builder.defineMacro("__FreeBSD__", Release);
204 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramera9992772010-01-09 17:55:51 +0000205 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
206 DefineStd(Builder, "unix", Opts);
207 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000208 }
209public:
Mike Stump1eb44332009-09-09 15:08:12 +0000210 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000211 : OSTargetInfo<Target>(triple) {
212 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000213
214 llvm::Triple Triple(triple);
215 switch (Triple.getArch()) {
216 default:
217 case llvm::Triple::x86:
218 case llvm::Triple::x86_64:
219 this->MCountName = ".mcount";
220 break;
221 case llvm::Triple::mips:
222 case llvm::Triple::mipsel:
223 case llvm::Triple::ppc:
224 case llvm::Triple::ppc64:
225 this->MCountName = "_mcount";
226 break;
227 case llvm::Triple::arm:
228 this->MCountName = "__mcount";
229 break;
230 }
231
Duncan Sands1e90faf2009-07-08 13:55:08 +0000232 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000233};
234
Chris Lattner38e317d2010-07-07 16:01:42 +0000235// Minix Target
236template<typename Target>
237class MinixTargetInfo : public OSTargetInfo<Target> {
238protected:
239 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
240 MacroBuilder &Builder) const {
241 // Minix defines
242
243 Builder.defineMacro("__minix", "3");
244 Builder.defineMacro("_EM_WSIZE", "4");
245 Builder.defineMacro("_EM_PSIZE", "4");
246 Builder.defineMacro("_EM_SSIZE", "2");
247 Builder.defineMacro("_EM_LSIZE", "4");
248 Builder.defineMacro("_EM_FSIZE", "4");
249 Builder.defineMacro("_EM_DSIZE", "8");
250 DefineStd(Builder, "unix", Opts);
251 }
252public:
253 MinixTargetInfo(const std::string &triple)
254 : OSTargetInfo<Target>(triple) {
255 this->UserLabelPrefix = "";
256 }
257};
258
Torok Edwin5f6c1942009-06-30 17:10:35 +0000259// Linux target
260template<typename Target>
261class LinuxTargetInfo : public OSTargetInfo<Target> {
262protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000263 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000264 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000265 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000266 DefineStd(Builder, "unix", Opts);
267 DefineStd(Builder, "linux", Opts);
268 Builder.defineMacro("__gnu_linux__");
269 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000270 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000271 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000272 if (Opts.CPlusPlus)
273 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000274 }
275public:
Mike Stump1eb44332009-09-09 15:08:12 +0000276 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000277 : OSTargetInfo<Target>(triple) {
278 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000279 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000280 }
281};
282
Chris Lattnerb62bb282009-07-13 20:29:08 +0000283// NetBSD Target
284template<typename Target>
285class NetBSDTargetInfo : public OSTargetInfo<Target> {
286protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000287 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000288 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000289 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000290 Builder.defineMacro("__NetBSD__");
291 Builder.defineMacro("__unix__");
292 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000293 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000294 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000295 }
296public:
Mike Stump1eb44332009-09-09 15:08:12 +0000297 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000298 : OSTargetInfo<Target>(triple) {
299 this->UserLabelPrefix = "";
300 }
301};
302
Torok Edwin5f6c1942009-06-30 17:10:35 +0000303// OpenBSD Target
304template<typename Target>
305class OpenBSDTargetInfo : public OSTargetInfo<Target> {
306protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000307 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000308 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000309 // OpenBSD defines; list based off of gcc output
310
Benjamin Kramera9992772010-01-09 17:55:51 +0000311 Builder.defineMacro("__OpenBSD__");
312 DefineStd(Builder, "unix", Opts);
313 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000314 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000315 Builder.defineMacro("_POSIX_THREADS");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000316 }
317public:
Mike Stump1eb44332009-09-09 15:08:12 +0000318 OpenBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000319 : OSTargetInfo<Target>(triple) {}
320};
321
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000322// PSP Target
323template<typename Target>
324class PSPTargetInfo : public OSTargetInfo<Target> {
325protected:
326 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000327 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000328 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000329 Builder.defineMacro("PSP");
330 Builder.defineMacro("_PSP");
331 Builder.defineMacro("__psp__");
332 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000333 }
334public:
335 PSPTargetInfo(const std::string& triple)
336 : OSTargetInfo<Target>(triple) {
337 this->UserLabelPrefix = "";
338 }
339};
340
John Thompson3f6918a2009-11-19 17:18:50 +0000341// PS3 PPU Target
342template<typename Target>
343class PS3PPUTargetInfo : public OSTargetInfo<Target> {
344protected:
345 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000346 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000347 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000348 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000349 Builder.defineMacro("__PPU__");
350 Builder.defineMacro("__CELLOS_LV2__");
351 Builder.defineMacro("__ELF__");
352 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000353 Builder.defineMacro("_ARCH_PPC64");
354 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000355 }
356public:
357 PS3PPUTargetInfo(const std::string& triple)
358 : OSTargetInfo<Target>(triple) {
359 this->UserLabelPrefix = "";
John Thompsonec387af2009-12-18 14:21:08 +0000360 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000361 this->IntMaxType = TargetInfo::SignedLongLong;
362 this->UIntMaxType = TargetInfo::UnsignedLongLong;
363 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000364 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000365 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
366 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000367 }
368};
369
370// FIXME: Need a real SPU target.
371// PS3 SPU Target
372template<typename Target>
373class PS3SPUTargetInfo : public OSTargetInfo<Target> {
374protected:
375 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000376 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000377 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000378 Builder.defineMacro("__SPU__");
379 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000380 }
381public:
382 PS3SPUTargetInfo(const std::string& triple)
383 : OSTargetInfo<Target>(triple) {
384 this->UserLabelPrefix = "";
385 }
386};
387
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000388// AuroraUX target
389template<typename Target>
390class AuroraUXTargetInfo : public OSTargetInfo<Target> {
391protected:
392 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000393 MacroBuilder &Builder) const {
394 DefineStd(Builder, "sun", Opts);
395 DefineStd(Builder, "unix", Opts);
396 Builder.defineMacro("__ELF__");
397 Builder.defineMacro("__svr4__");
398 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000399 }
400public:
401 AuroraUXTargetInfo(const std::string& triple)
402 : OSTargetInfo<Target>(triple) {
403 this->UserLabelPrefix = "";
404 this->WCharType = this->SignedLong;
405 // FIXME: WIntType should be SignedLong
406 }
407};
408
Torok Edwin5f6c1942009-06-30 17:10:35 +0000409// Solaris target
410template<typename Target>
411class SolarisTargetInfo : public OSTargetInfo<Target> {
412protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000413 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000414 MacroBuilder &Builder) const {
415 DefineStd(Builder, "sun", Opts);
416 DefineStd(Builder, "unix", Opts);
417 Builder.defineMacro("__ELF__");
418 Builder.defineMacro("__svr4__");
419 Builder.defineMacro("__SVR4");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000420 }
421public:
Mike Stump1eb44332009-09-09 15:08:12 +0000422 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000423 : OSTargetInfo<Target>(triple) {
424 this->UserLabelPrefix = "";
425 this->WCharType = this->SignedLong;
426 // FIXME: WIntType should be SignedLong
427 }
428};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000429
430// Windows target
431template<typename Target>
432class WindowsTargetInfo : public OSTargetInfo<Target> {
433protected:
434 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
435 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000436 Builder.defineMacro("_WIN32");
437 }
438 void getVisualStudioDefines(const LangOptions &Opts,
439 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000440 if (Opts.CPlusPlus) {
441 if (Opts.RTTI)
442 Builder.defineMacro("_CPPRTTI");
443
444 if (Opts.Exceptions)
445 Builder.defineMacro("_CPPUNWIND");
446 }
447
448 if (!Opts.CharIsSigned)
449 Builder.defineMacro("_CHAR_UNSIGNED");
450
451 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
452 // but it works for now.
453 if (Opts.POSIXThreads)
454 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000455
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000456 if (Opts.MSCVersion != 0)
457 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
458
459 if (Opts.Microsoft) {
460 Builder.defineMacro("_MSC_EXTENSIONS");
461
462 if (Opts.CPlusPlus0x) {
463 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
464 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
465 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
466 }
467 }
468
469 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000470 }
471
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000472public:
473 WindowsTargetInfo(const std::string &triple)
474 : OSTargetInfo<Target>(triple) {}
475};
476
Mike Stump1eb44332009-09-09 15:08:12 +0000477} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000478
Chris Lattnerd29b6302008-10-05 21:50:58 +0000479//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000480// Specific target implementations.
481//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000482
Eli Friedmane4277982008-08-20 23:11:40 +0000483namespace {
484// PPC abstract base class
485class PPCTargetInfo : public TargetInfo {
486 static const Builtin::Info BuiltinInfo[];
487 static const char * const GCCRegNames[];
488 static const TargetInfo::GCCRegAlias GCCRegAliases[];
489
490public:
Eli Friedman15b91762009-06-05 07:05:05 +0000491 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
492
Eli Friedmane4277982008-08-20 23:11:40 +0000493 virtual void getTargetBuiltins(const Builtin::Info *&Records,
494 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000495 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000496 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000497 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000498
Chris Lattner33328642009-03-20 15:52:06 +0000499 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000500 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000501
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000502 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000503 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000504 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000505 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000506 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000507 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000508 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000509 default: return false;
510 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000511 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000512 case 'b': // Base register
513 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000514 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000515 break;
516 // FIXME: The following are added to allow parsing.
517 // I just took a guess at what the actions should be.
518 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000519 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000520 case 'v': // Altivec vector register
521 Info.setAllowsRegister();
522 break;
523 case 'w':
524 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000525 case 'd':// VSX vector register to hold vector double data
526 case 'f':// VSX vector register to hold vector float data
527 case 's':// VSX vector register to hold scalar float data
528 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000529 break;
530 default:
531 return false;
532 }
533 Info.setAllowsRegister();
534 Name++; // Skip over 'w'.
535 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000536 case 'h': // `MQ', `CTR', or `LINK' register
537 case 'q': // `MQ' register
538 case 'c': // `CTR' register
539 case 'l': // `LINK' register
540 case 'x': // `CR' register (condition register) number 0
541 case 'y': // `CR' register (condition register)
542 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000543 Info.setAllowsRegister();
544 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000545 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000546 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000547 // (use `L' instead for SImode constants)
548 case 'K': // Unsigned 16-bit constant
549 case 'L': // Signed 16-bit constant shifted left 16 bits
550 case 'M': // Constant larger than 31
551 case 'N': // Exact power of 2
552 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000553 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000554 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000555 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000556 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000557 break;
558 case 'm': // Memory operand. Note that on PowerPC targets, m can
559 // include addresses that update the base register. It
560 // is therefore only safe to use `m' in an asm statement
561 // if that asm statement accesses the operand exactly once.
562 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000563 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000564 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000565 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000566 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000567 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
568 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000569 // register to be updated.
570 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000571 if (Name[1] != 's')
572 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000573 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000574 // include any automodification of the base register. Unlike
575 // `m', this constraint can be used in asm statements that
576 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000577 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000578 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000579 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000580 break;
581 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000582 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000583 case 'Z': // Memory operand that is an indexed or indirect from a
584 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000585 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000586 Info.setAllowsMemory();
587 Info.setAllowsRegister();
588 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000589 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000590 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000591 // register (`p' is preferable for asm statements)
592 case 'S': // Constant suitable as a 64-bit mask operand
593 case 'T': // Constant suitable as a 32-bit mask operand
594 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000595 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000596 // instructions
597 case 'W': // Vector constant that does not require memory
598 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000599 break;
600 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000601 }
John Thompson8e6065a2010-06-24 22:44:13 +0000602 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000603 }
Eli Friedmane4277982008-08-20 23:11:40 +0000604 virtual const char *getClobbers() const {
605 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000606 }
Eli Friedmane4277982008-08-20 23:11:40 +0000607};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000608
Eli Friedmane4277982008-08-20 23:11:40 +0000609const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000610#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
611#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
612 ALL_LANGUAGES, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000613#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000614};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000615
616
Chris Lattnerc0f59212009-03-02 22:27:17 +0000617/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
618/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000619void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000620 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000621 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000622 Builder.defineMacro("__ppc__");
623 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000624 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000625 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000626 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000627 Builder.defineMacro("_ARCH_PPC64");
628 Builder.defineMacro("_LP64");
629 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000630 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000631 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000632 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000633 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000634 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000635
Chris Lattnerc0f59212009-03-02 22:27:17 +0000636 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +0000637 Builder.defineMacro("_BIG_ENDIAN");
638 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000639
Chris Lattnerc0f59212009-03-02 22:27:17 +0000640 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000641 Builder.defineMacro("__NATURAL_ALIGNMENT__");
642 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000643
Chris Lattnerc0f59212009-03-02 22:27:17 +0000644 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000645 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000646
John Thompson3f6918a2009-11-19 17:18:50 +0000647 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000648 Builder.defineMacro("__VEC__", "10206");
649 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000650 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000651}
652
Chris Lattner393ff042008-04-21 18:56:49 +0000653
Eli Friedmane4277982008-08-20 23:11:40 +0000654const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000655 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
656 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
657 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
658 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
659 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
660 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
661 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
662 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000663 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000664 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000665 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000666 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
667 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
668 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
669 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000670 "vrsave", "vscr",
671 "spe_acc", "spefscr",
672 "sfp"
673};
Reid Spencer5f016e22007-07-11 17:01:13 +0000674
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000675void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000676 unsigned &NumNames) const {
677 Names = GCCRegNames;
678 NumNames = llvm::array_lengthof(GCCRegNames);
679}
Reid Spencer5f016e22007-07-11 17:01:13 +0000680
Eli Friedmane4277982008-08-20 23:11:40 +0000681const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
682 // While some of these aliases do map to different registers
683 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000684 { { "0" }, "r0" },
685 { { "1"}, "r1" },
686 { { "2" }, "r2" },
687 { { "3" }, "r3" },
688 { { "4" }, "r4" },
689 { { "5" }, "r5" },
690 { { "6" }, "r6" },
691 { { "7" }, "r7" },
692 { { "8" }, "r8" },
693 { { "9" }, "r9" },
694 { { "10" }, "r10" },
695 { { "11" }, "r11" },
696 { { "12" }, "r12" },
697 { { "13" }, "r13" },
698 { { "14" }, "r14" },
699 { { "15" }, "r15" },
700 { { "16" }, "r16" },
701 { { "17" }, "r17" },
702 { { "18" }, "r18" },
703 { { "19" }, "r19" },
704 { { "20" }, "r20" },
705 { { "21" }, "r21" },
706 { { "22" }, "r22" },
707 { { "23" }, "r23" },
708 { { "24" }, "r24" },
709 { { "25" }, "r25" },
710 { { "26" }, "r26" },
711 { { "27" }, "r27" },
712 { { "28" }, "r28" },
713 { { "29" }, "r29" },
714 { { "30" }, "r30" },
715 { { "31" }, "r31" },
716 { { "fr0" }, "f0" },
717 { { "fr1" }, "f1" },
718 { { "fr2" }, "f2" },
719 { { "fr3" }, "f3" },
720 { { "fr4" }, "f4" },
721 { { "fr5" }, "f5" },
722 { { "fr6" }, "f6" },
723 { { "fr7" }, "f7" },
724 { { "fr8" }, "f8" },
725 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000726 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000727 { { "fr11" }, "f11" },
728 { { "fr12" }, "f12" },
729 { { "fr13" }, "f13" },
730 { { "fr14" }, "f14" },
731 { { "fr15" }, "f15" },
732 { { "fr16" }, "f16" },
733 { { "fr17" }, "f17" },
734 { { "fr18" }, "f18" },
735 { { "fr19" }, "f19" },
736 { { "fr20" }, "f20" },
737 { { "fr21" }, "f21" },
738 { { "fr22" }, "f22" },
739 { { "fr23" }, "f23" },
740 { { "fr24" }, "f24" },
741 { { "fr25" }, "f25" },
742 { { "fr26" }, "f26" },
743 { { "fr27" }, "f27" },
744 { { "fr28" }, "f28" },
745 { { "fr29" }, "f29" },
746 { { "fr30" }, "f30" },
747 { { "fr31" }, "f31" },
748 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000749};
750
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000751void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000752 unsigned &NumAliases) const {
753 Aliases = GCCRegAliases;
754 NumAliases = llvm::array_lengthof(GCCRegAliases);
755}
756} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000757
758namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000759class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000760public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000761 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000762 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +0000763 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000764
765 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divackyc81f2a22011-01-06 08:27:10 +0000766 SizeType = UnsignedInt;
767 }
768
769 virtual const char *getVAListDeclaration() const {
770 // This is the ELF definition, and is overridden by the Darwin sub-target
771 return "typedef struct __va_list_tag {"
772 " unsigned char gpr;"
773 " unsigned char fpr;"
774 " unsigned short reserved;"
775 " void* overflow_arg_area;"
776 " void* reg_save_area;"
777 "} __builtin_va_list[1];";
Eli Friedmaned855cb2008-08-21 00:13:15 +0000778 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000779};
780} // end anonymous namespace.
781
782namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000783class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000784public:
Eli Friedmane4277982008-08-20 23:11:40 +0000785 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000786 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000787 IntMaxType = SignedLong;
788 UIntMaxType = UnsignedLong;
789 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000790 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +0000791 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerf291b102008-05-09 06:17:04 +0000792 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000793 virtual const char *getVAListDeclaration() const {
794 return "typedef char* __builtin_va_list;";
795 }
Eli Friedmane4277982008-08-20 23:11:40 +0000796};
797} // end anonymous namespace.
798
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000799
800namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000801class DarwinPPC32TargetInfo :
802 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000803public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000804 DarwinPPC32TargetInfo(const std::string& triple)
805 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000806 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000807 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
808 }
809 virtual const char *getVAListDeclaration() const {
810 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000811 }
812};
813
814class DarwinPPC64TargetInfo :
815 public DarwinTargetInfo<PPC64TargetInfo> {
816public:
817 DarwinPPC64TargetInfo(const std::string& triple)
818 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
819 HasAlignMac68kSupport = true;
820 }
821};
822} // end anonymous namespace.
823
Reid Spencer5f016e22007-07-11 17:01:13 +0000824namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +0000825// MBlaze abstract base class
826class MBlazeTargetInfo : public TargetInfo {
827 static const char * const GCCRegNames[];
828 static const TargetInfo::GCCRegAlias GCCRegAliases[];
829
830public:
831 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +0000832 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +0000833 }
834
835 virtual void getTargetBuiltins(const Builtin::Info *&Records,
836 unsigned &NumRecords) const {
837 // FIXME: Implement.
838 Records = 0;
839 NumRecords = 0;
840 }
841
842 virtual void getTargetDefines(const LangOptions &Opts,
843 MacroBuilder &Builder) const;
844
845 virtual const char *getVAListDeclaration() const {
846 return "typedef char* __builtin_va_list;";
847 }
848 virtual const char *getTargetPrefix() const {
849 return "mblaze";
850 }
851 virtual void getGCCRegNames(const char * const *&Names,
852 unsigned &NumNames) const;
853 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
854 unsigned &NumAliases) const;
855 virtual bool validateAsmConstraint(const char *&Name,
856 TargetInfo::ConstraintInfo &Info) const {
857 switch (*Name) {
858 default: return false;
859 case 'O': // Zero
860 return true;
861 case 'b': // Base register
862 case 'f': // Floating point register
863 Info.setAllowsRegister();
864 return true;
865 }
866 }
867 virtual const char *getClobbers() const {
868 return "";
869 }
870};
871
872/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
873/// #defines that are not tied to a specific subtarget.
874void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
875 MacroBuilder &Builder) const {
876 // Target identification.
877 Builder.defineMacro("__microblaze__");
878 Builder.defineMacro("_ARCH_MICROBLAZE");
879 Builder.defineMacro("__MICROBLAZE__");
880
881 // Target properties.
882 Builder.defineMacro("_BIG_ENDIAN");
883 Builder.defineMacro("__BIG_ENDIAN__");
884
885 // Subtarget options.
886 Builder.defineMacro("__REGISTER_PREFIX__", "");
887}
888
889
890const char * const MBlazeTargetInfo::GCCRegNames[] = {
891 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
892 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
893 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
894 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
895 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
896 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
897 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
898 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
899 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
900 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
901};
902
903void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
904 unsigned &NumNames) const {
905 Names = GCCRegNames;
906 NumNames = llvm::array_lengthof(GCCRegNames);
907}
908
909const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
910 { {"f0"}, "r0" },
911 { {"f1"}, "r1" },
912 { {"f2"}, "r2" },
913 { {"f3"}, "r3" },
914 { {"f4"}, "r4" },
915 { {"f5"}, "r5" },
916 { {"f6"}, "r6" },
917 { {"f7"}, "r7" },
918 { {"f8"}, "r8" },
919 { {"f9"}, "r9" },
920 { {"f10"}, "r10" },
921 { {"f11"}, "r11" },
922 { {"f12"}, "r12" },
923 { {"f13"}, "r13" },
924 { {"f14"}, "r14" },
925 { {"f15"}, "r15" },
926 { {"f16"}, "r16" },
927 { {"f17"}, "r17" },
928 { {"f18"}, "r18" },
929 { {"f19"}, "r19" },
930 { {"f20"}, "r20" },
931 { {"f21"}, "r21" },
932 { {"f22"}, "r22" },
933 { {"f23"}, "r23" },
934 { {"f24"}, "r24" },
935 { {"f25"}, "r25" },
936 { {"f26"}, "r26" },
937 { {"f27"}, "r27" },
938 { {"f28"}, "r28" },
939 { {"f29"}, "r29" },
940 { {"f30"}, "r30" },
941 { {"f31"}, "r31" },
942};
943
944void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
945 unsigned &NumAliases) const {
946 Aliases = GCCRegAliases;
947 NumAliases = llvm::array_lengthof(GCCRegAliases);
948}
949} // end anonymous namespace.
950
951namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000952// Namespace for x86 abstract base class
953const Builtin::Info BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000954#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
955#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
956 ALL_LANGUAGES, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000957#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +0000958};
Eli Friedman61538a72008-05-20 14:21:01 +0000959
Nuno Lopes2550d702009-12-23 17:49:57 +0000960static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +0000961 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
962 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
963 "argp", "flags", "fspr", "dirflag", "frame",
964 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
965 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
966 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
967 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
968};
969
970const TargetInfo::GCCRegAlias GCCRegAliases[] = {
971 { { "al", "ah", "eax", "rax" }, "ax" },
972 { { "bl", "bh", "ebx", "rbx" }, "bx" },
973 { { "cl", "ch", "ecx", "rcx" }, "cx" },
974 { { "dl", "dh", "edx", "rdx" }, "dx" },
975 { { "esi", "rsi" }, "si" },
976 { { "edi", "rdi" }, "di" },
977 { { "esp", "rsp" }, "sp" },
978 { { "ebp", "rbp" }, "bp" },
979};
980
981// X86 target abstract base class; x86-32 and x86-64 are very close, so
982// most of the implementation can be shared.
983class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +0000984 enum X86SSEEnum {
985 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
986 } SSELevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +0000987 enum AMD3DNowEnum {
988 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
989 } AMD3DNowLevel;
990
Eric Christophereea12d12010-04-02 23:50:19 +0000991 bool HasAES;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +0000992 bool HasAVX;
993
Eli Friedman618234a2008-08-20 02:34:37 +0000994public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000995 X86TargetInfo(const std::string& triple)
Eric Christophereea12d12010-04-02 23:50:19 +0000996 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +0000997 HasAES(false), HasAVX(false) {
Eli Friedman618234a2008-08-20 02:34:37 +0000998 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +0000999 }
1000 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1001 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001002 Records = BuiltinInfo;
1003 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001004 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001005 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001006 unsigned &NumNames) const {
1007 Names = GCCRegNames;
1008 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001009 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001010 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001011 unsigned &NumAliases) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001012 Aliases = GCCRegAliases;
1013 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001014 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001015 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001016 TargetInfo::ConstraintInfo &info) const;
1017 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001018 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001019 return "~{dirflag},~{fpsr},~{flags}";
1020 }
Chris Lattner33328642009-03-20 15:52:06 +00001021 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001022 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001023 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1024 const std::string &Name,
1025 bool Enabled) const;
Mike Stump1eb44332009-09-09 15:08:12 +00001026 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001027 llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001028 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Reid Spencer5f016e22007-07-11 17:01:13 +00001029};
Chris Lattner3daed522009-03-02 22:20:04 +00001030
Mike Stump1eb44332009-09-09 15:08:12 +00001031void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001032 llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001033 // FIXME: This should not be here.
1034 Features["3dnow"] = false;
1035 Features["3dnowa"] = false;
1036 Features["mmx"] = false;
1037 Features["sse"] = false;
1038 Features["sse2"] = false;
1039 Features["sse3"] = false;
1040 Features["ssse3"] = false;
1041 Features["sse41"] = false;
1042 Features["sse42"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001043 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001044 Features["avx"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001045
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001046 // LLVM does not currently recognize this.
1047 // Features["sse4a"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001048
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001049 // FIXME: This *really* should not be here.
1050
1051 // X86_64 always has SSE2.
1052 if (PointerWidth == 64)
1053 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1054
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001055 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1056 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1057 ;
1058 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1059 setFeatureEnabled(Features, "mmx", true);
1060 else if (CPU == "pentium3")
1061 setFeatureEnabled(Features, "sse", true);
1062 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1063 setFeatureEnabled(Features, "sse2", true);
1064 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1065 setFeatureEnabled(Features, "sse3", true);
1066 else if (CPU == "core2")
1067 setFeatureEnabled(Features, "ssse3", true);
1068 else if (CPU == "penryn") {
1069 setFeatureEnabled(Features, "sse4", true);
1070 Features["sse42"] = false;
1071 } else if (CPU == "atom")
1072 setFeatureEnabled(Features, "sse3", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001073 else if (CPU == "corei7") {
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001074 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001075 setFeatureEnabled(Features, "aes", true);
1076 }
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001077 else if (CPU == "k6" || CPU == "winchip-c6")
1078 setFeatureEnabled(Features, "mmx", true);
Mike Stump1eb44332009-09-09 15:08:12 +00001079 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001080 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1081 setFeatureEnabled(Features, "mmx", true);
1082 setFeatureEnabled(Features, "3dnow", true);
1083 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1084 setFeatureEnabled(Features, "sse", true);
1085 setFeatureEnabled(Features, "3dnowa", true);
1086 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1087 CPU == "athlon-fx") {
Mike Stump1eb44332009-09-09 15:08:12 +00001088 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001089 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001090 } else if (CPU == "k8-sse3") {
1091 setFeatureEnabled(Features, "sse3", true);
1092 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001093 } else if (CPU == "c3-2")
1094 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001095}
1096
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001097bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001098 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001099 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001100 // FIXME: This *really* should not be here. We need some way of translating
1101 // options into llvm subtarget features.
1102 if (!Features.count(Name) &&
1103 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001104 return false;
1105
1106 if (Enabled) {
1107 if (Name == "mmx")
1108 Features["mmx"] = true;
1109 else if (Name == "sse")
1110 Features["mmx"] = Features["sse"] = true;
1111 else if (Name == "sse2")
1112 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1113 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001114 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001115 Features["sse3"] = true;
1116 else if (Name == "ssse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001117 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001118 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001119 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump1eb44332009-09-09 15:08:12 +00001120 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001121 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001122 else if (Name == "sse4.1")
1123 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1124 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001125 else if (Name == "3dnow")
1126 Features["3dnowa"] = true;
1127 else if (Name == "3dnowa")
1128 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001129 else if (Name == "aes")
1130 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001131 else if (Name == "avx")
1132 Features["avx"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001133 } else {
1134 if (Name == "mmx")
Mike Stump1eb44332009-09-09 15:08:12 +00001135 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001136 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1137 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001138 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001139 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1140 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001141 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001142 Features["sse41"] = Features["sse42"] = false;
1143 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001144 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001145 Features["sse42"] = false;
1146 else if (Name == "ssse3")
1147 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1148 else if (Name == "sse4")
1149 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001150 else if (Name == "sse4.2")
1151 Features["sse42"] = false;
1152 else if (Name == "sse4.1")
1153 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001154 else if (Name == "3dnow")
1155 Features["3dnow"] = Features["3dnowa"] = false;
1156 else if (Name == "3dnowa")
1157 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001158 else if (Name == "aes")
1159 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001160 else if (Name == "avx")
1161 Features["avx"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001162 }
1163
1164 return true;
1165}
1166
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001167/// HandleTargetOptions - Perform initialization based on the user
1168/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001169void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001170 // Remember the maximum enabled sselevel.
1171 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1172 // Ignore disabled features.
1173 if (Features[i][0] == '-')
1174 continue;
1175
Eric Christophereea12d12010-04-02 23:50:19 +00001176 if (Features[i].substr(1) == "aes") {
1177 HasAES = true;
1178 continue;
1179 }
1180
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001181 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1182 // For now let it be enabled together with other SSE levels.
1183 if (Features[i].substr(1) == "avx") {
1184 HasAVX = true;
1185 continue;
1186 }
1187
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001188 assert(Features[i][0] == '+' && "Invalid target feature!");
1189 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1190 .Case("sse42", SSE42)
1191 .Case("sse41", SSE41)
1192 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001193 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001194 .Case("sse2", SSE2)
1195 .Case("sse", SSE1)
1196 .Case("mmx", MMX)
1197 .Default(NoMMXSSE);
1198 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001199
1200 AMD3DNowEnum ThreeDNowLevel =
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001201 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1202 .Case("3dnowa", AMD3DNowAthlon)
1203 .Case("3dnow", AMD3DNow)
1204 .Default(NoAMD3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001205
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001206 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001207 }
Chris Lattner3daed522009-03-02 22:20:04 +00001208}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001209
1210/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1211/// that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001212void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001213 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001214 // Target identification.
1215 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001216 Builder.defineMacro("_LP64");
1217 Builder.defineMacro("__LP64__");
1218 Builder.defineMacro("__amd64__");
1219 Builder.defineMacro("__amd64");
1220 Builder.defineMacro("__x86_64");
1221 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001222 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001223 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001224 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001225
Eric Christophereea12d12010-04-02 23:50:19 +00001226 if (HasAES)
1227 Builder.defineMacro("__AES__");
1228
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001229 if (HasAVX)
1230 Builder.defineMacro("__AVX__");
1231
Chris Lattnerc0f59212009-03-02 22:27:17 +00001232 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001233 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001234
Chris Lattnerc0f59212009-03-02 22:27:17 +00001235 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +00001236 Builder.defineMacro("__nocona");
1237 Builder.defineMacro("__nocona__");
1238 Builder.defineMacro("__tune_nocona__");
1239 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001240
Chris Lattner54175442009-04-19 17:32:33 +00001241 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1242 // functions in glibc header files that use FP Stack inline asm which the
1243 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001244 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001245
Chris Lattner84f0ea82009-03-02 22:40:39 +00001246 // Each case falls through to the previous one here.
1247 switch (SSELevel) {
1248 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00001249 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001250 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00001251 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001252 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001253 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001254 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001255 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001256 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00001257 Builder.defineMacro("__SSE2__");
1258 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001259 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00001260 Builder.defineMacro("__SSE__");
1261 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001262 case MMX:
Benjamin Kramera9992772010-01-09 17:55:51 +00001263 Builder.defineMacro("__MMX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001264 case NoMMXSSE:
1265 break;
1266 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001267
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001268 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001269 switch (SSELevel) {
Michael J. Spencera764e832010-10-21 08:22:51 +00001270 case SSE42:
1271 case SSE41:
1272 case SSSE3:
1273 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001274 case SSE2:
1275 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1276 break;
1277 case SSE1:
1278 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1279 break;
1280 default:
1281 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1282 }
1283 }
1284
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001285 // Each case falls through to the previous one here.
1286 switch (AMD3DNowLevel) {
1287 case AMD3DNowAthlon:
1288 Builder.defineMacro("__3dNOW_A__");
1289 case AMD3DNow:
1290 Builder.defineMacro("__3dNOW__");
1291 case NoAMD3DNow:
1292 break;
1293 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00001294}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001295
1296
Eli Friedman618234a2008-08-20 02:34:37 +00001297bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001298X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001299 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001300 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00001301 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00001302 case 'Y': // first letter of a pair:
1303 switch (*(Name+1)) {
1304 default: return false;
1305 case '0': // First SSE register.
1306 case 't': // Any SSE register, when SSE2 is enabled.
1307 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1308 case 'm': // any MMX register, when inter-unit moves enabled.
1309 break; // falls through to setAllowsRegister.
1310 }
Eli Friedman618234a2008-08-20 02:34:37 +00001311 case 'a': // eax.
1312 case 'b': // ebx.
1313 case 'c': // ecx.
1314 case 'd': // edx.
1315 case 'S': // esi.
1316 case 'D': // edi.
1317 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00001318 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00001319 case 't': // top of floating point stack.
1320 case 'u': // second from top of floating point stack.
1321 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00001322 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00001323 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00001324 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00001325 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1326 case 'l': // "Index" registers: any general register that can be used as an
1327 // index in a base+index memory access.
1328 Info.setAllowsRegister();
1329 return true;
1330 case 'C': // SSE floating point constant.
1331 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001332 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001333 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001334 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001335 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00001336 return true;
1337 }
Dale Johannesen545be512010-08-24 22:33:12 +00001338 return false;
Eli Friedman618234a2008-08-20 02:34:37 +00001339}
1340
Dale Johannesenf6e2c202010-10-29 23:12:32 +00001341
Eli Friedman618234a2008-08-20 02:34:37 +00001342std::string
1343X86TargetInfo::convertConstraint(const char Constraint) const {
1344 switch (Constraint) {
1345 case 'a': return std::string("{ax}");
1346 case 'b': return std::string("{bx}");
1347 case 'c': return std::string("{cx}");
1348 case 'd': return std::string("{dx}");
1349 case 'S': return std::string("{si}");
1350 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00001351 case 'p': // address
1352 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00001353 case 't': // top of floating point stack.
1354 return std::string("{st}");
1355 case 'u': // second from top of floating point stack.
1356 return std::string("{st(1)}"); // second from top of floating point stack.
1357 default:
1358 return std::string(1, Constraint);
1359 }
1360}
Eli Friedman618234a2008-08-20 02:34:37 +00001361} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00001362
1363namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001364// X86-32 generic target
1365class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001366public:
Eli Friedman618234a2008-08-20 02:34:37 +00001367 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1368 DoubleAlign = LongLongAlign = 32;
1369 LongDoubleWidth = 96;
1370 LongDoubleAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001371 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1372 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001373 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman1afabd92009-03-29 20:31:09 +00001374 SizeType = UnsignedInt;
1375 PtrDiffType = SignedInt;
1376 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001377 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001378
1379 // Use fpret for all types.
1380 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1381 (1 << TargetInfo::Double) |
1382 (1 << TargetInfo::LongDouble));
Eli Friedman618234a2008-08-20 02:34:37 +00001383 }
1384 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001385 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00001386 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001387
Chris Lattner21fb98e2009-09-23 06:06:36 +00001388 int getEHDataRegisterNumber(unsigned RegNo) const {
1389 if (RegNo == 0) return 0;
1390 if (RegNo == 1) return 2;
1391 return -1;
1392 }
Eli Friedman618234a2008-08-20 02:34:37 +00001393};
1394} // end anonymous namespace
1395
1396namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00001397class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1398public:
1399 OpenBSDI386TargetInfo(const std::string& triple) :
1400 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1401 SizeType = UnsignedLong;
1402 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00001403 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00001404 }
1405};
1406} // end anonymous namespace
1407
1408namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00001409class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00001410public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00001411 DarwinI386TargetInfo(const std::string& triple) :
1412 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00001413 LongDoubleWidth = 128;
1414 LongDoubleAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00001415 SizeType = UnsignedLong;
1416 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001417 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1418 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001419 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbar613fd672010-05-27 00:35:16 +00001420 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00001421 }
1422
Eli Friedman618234a2008-08-20 02:34:37 +00001423};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001424} // end anonymous namespace
1425
1426namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00001427// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001428class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00001429public:
1430 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001431 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00001432 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00001433 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00001434 DoubleAlign = LongLongAlign = 64;
1435 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Anton Korobeynikovb3814412009-12-19 02:05:07 +00001436 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1437 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedman29a30502008-08-21 01:40:19 +00001438 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001439 virtual void getTargetDefines(const LangOptions &Opts,
1440 MacroBuilder &Builder) const {
1441 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1442 }
1443};
1444} // end anonymous namespace
1445
1446namespace {
1447
1448// x86-32 Windows Visual Studio target
1449class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1450public:
1451 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1452 : WindowsX86_32TargetInfo(triple) {
1453 LongDoubleWidth = 64;
1454 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1455 }
1456 virtual void getTargetDefines(const LangOptions &Opts,
1457 MacroBuilder &Builder) const {
1458 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1459 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1460 // The value of the following reflects processor type.
1461 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1462 // We lost the original triple, so we use the default.
1463 Builder.defineMacro("_M_IX86", "600");
1464 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001465};
1466} // end anonymous namespace
1467
1468namespace {
1469// x86-32 MinGW target
1470class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1471public:
1472 MinGWX86_32TargetInfo(const std::string& triple)
1473 : WindowsX86_32TargetInfo(triple) {
1474 }
1475 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001476 MacroBuilder &Builder) const {
1477 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001478 DefineStd(Builder, "WIN32", Opts);
1479 DefineStd(Builder, "WINNT", Opts);
1480 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00001481 Builder.defineMacro("__MSVCRT__");
1482 Builder.defineMacro("__MINGW32__");
1483 Builder.defineMacro("__declspec", "__declspec");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001484 }
1485};
1486} // end anonymous namespace
1487
1488namespace {
1489// x86-32 Cygwin target
1490class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1491public:
1492 CygwinX86_32TargetInfo(const std::string& triple)
1493 : X86_32TargetInfo(triple) {
1494 TLSSupported = false;
1495 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001496 DoubleAlign = LongLongAlign = 64;
1497 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1498 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001499 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001500 }
1501 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001502 MacroBuilder &Builder) const {
1503 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1504 Builder.defineMacro("__CYGWIN__");
1505 Builder.defineMacro("__CYGWIN32__");
1506 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00001507 if (Opts.CPlusPlus)
1508 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00001509 }
Eli Friedman29a30502008-08-21 01:40:19 +00001510};
1511} // end anonymous namespace
1512
1513namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00001514// x86-32 Haiku target
1515class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1516public:
1517 HaikuX86_32TargetInfo(const std::string& triple)
1518 : X86_32TargetInfo(triple) {
1519 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00001520 IntPtrType = SignedLong;
1521 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00001522 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00001523 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00001524 virtual void getTargetDefines(const LangOptions &Opts,
1525 MacroBuilder &Builder) const {
1526 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1527 Builder.defineMacro("__INTEL__");
1528 Builder.defineMacro("__HAIKU__");
1529 }
1530};
1531} // end anonymous namespace
1532
1533namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001534// x86-64 generic target
1535class X86_64TargetInfo : public X86TargetInfo {
1536public:
Chris Lattner33328642009-03-20 15:52:06 +00001537 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001538 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00001539 LongDoubleWidth = 128;
1540 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00001541 LargeArrayMinWidth = 128;
1542 LargeArrayAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00001543 IntMaxType = SignedLong;
1544 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001545 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001546 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00001547
Eli Friedmaned855cb2008-08-21 00:13:15 +00001548 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1549 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001550 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001551
1552 // Use fpret only for long double.
1553 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Reid Spencer5f016e22007-07-11 17:01:13 +00001554 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001555 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001556 return "typedef struct __va_list_tag {"
1557 " unsigned gp_offset;"
1558 " unsigned fp_offset;"
1559 " void* overflow_arg_area;"
1560 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00001561 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00001562 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00001563 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001564
Chris Lattner21fb98e2009-09-23 06:06:36 +00001565 int getEHDataRegisterNumber(unsigned RegNo) const {
1566 if (RegNo == 0) return 0;
1567 if (RegNo == 1) return 1;
1568 return -1;
1569 }
Eli Friedman618234a2008-08-20 02:34:37 +00001570};
1571} // end anonymous namespace
1572
1573namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001574// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001575class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001576public:
1577 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001578 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001579 TLSSupported = false;
1580 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00001581 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00001582 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00001583 IntMaxType = SignedLongLong;
1584 UIntMaxType = UnsignedLongLong;
1585 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00001586 SizeType = UnsignedLongLong;
1587 PtrDiffType = SignedLongLong;
1588 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00001589 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001590 }
1591 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001592 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001593 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001594 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00001595 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00001596 virtual const char *getVAListDeclaration() const {
1597 return "typedef char* __builtin_va_list;";
1598 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001599};
1600} // end anonymous namespace
1601
1602namespace {
1603// x86-64 Windows Visual Studio target
1604class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1605public:
1606 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1607 : WindowsX86_64TargetInfo(triple) {
1608 }
1609 virtual void getTargetDefines(const LangOptions &Opts,
1610 MacroBuilder &Builder) const {
1611 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1612 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00001613 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001614 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001615 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001616};
1617} // end anonymous namespace
1618
1619namespace {
1620// x86-64 MinGW target
1621class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1622public:
1623 MinGWX86_64TargetInfo(const std::string& triple)
1624 : WindowsX86_64TargetInfo(triple) {
1625 }
1626 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001627 MacroBuilder &Builder) const {
1628 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001629 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00001630 Builder.defineMacro("__MSVCRT__");
1631 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi1b24cd32011-01-17 22:56:16 +00001632 Builder.defineMacro("__declspec", "__declspec");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001633 }
1634};
1635} // end anonymous namespace
1636
1637namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001638class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1639public:
Mike Stump1eb44332009-09-09 15:08:12 +00001640 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001641 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1642 Int64Type = SignedLongLong;
1643 }
1644};
1645} // end anonymous namespace
1646
1647namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00001648class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1649public:
Mike Stump1eb44332009-09-09 15:08:12 +00001650 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00001651 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1652 IntMaxType = SignedLongLong;
1653 UIntMaxType = UnsignedLongLong;
1654 Int64Type = SignedLongLong;
1655 }
1656};
1657} // end anonymous namespace
1658
1659namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00001660class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001661 // Possible FPU choices.
1662 enum FPUMode {
1663 NoFPU,
1664 VFP2FPU,
1665 VFP3FPU,
1666 NeonFPU
1667 };
1668
1669 static bool FPUModeIsVFP(FPUMode Mode) {
1670 return Mode >= VFP2FPU && Mode <= NeonFPU;
1671 }
1672
1673 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1674 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001675
Daniel Dunbareac7c532009-12-18 18:42:37 +00001676 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001677
1678 unsigned FPU : 3;
1679
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001680 unsigned IsThumb : 1;
1681
1682 // Initialized via features.
1683 unsigned SoftFloat : 1;
1684 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001685
Chris Lattner2752c012010-03-03 19:03:45 +00001686 static const Builtin::Info BuiltinInfo[];
1687
Chris Lattner393ff042008-04-21 18:56:49 +00001688public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001689 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00001690 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001691 {
Daniel Dunbara2a41612009-09-14 00:02:24 +00001692 SizeType = UnsignedInt;
1693 PtrDiffType = SignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001694
Chris Lattner9bffb072010-04-23 16:29:58 +00001695 // {} in inline assembly are neon specifiers, not assembly variant
1696 // specifiers.
1697 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00001698
Daniel Dunbareac7c532009-12-18 18:42:37 +00001699 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00001700 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001701 if (IsThumb) {
1702 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1703 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner1932e122009-11-07 18:59:41 +00001704 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001705 } else {
1706 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1707 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner1932e122009-11-07 18:59:41 +00001708 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001709 }
John McCallee79a4c2010-08-21 22:46:04 +00001710
1711 // ARM targets default to using the ARM C++ ABI.
1712 CXXABI = CXXABI_ARM;
Eli Friedman61538a72008-05-20 14:21:01 +00001713 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001714 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00001715 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001716 ABI = Name;
1717
Daniel Dunbara2a41612009-09-14 00:02:24 +00001718 // The defaults (above) are for AAPCS, check if we need to change them.
1719 //
1720 // FIXME: We need support for -meabi... we could just mangle it into the
1721 // name.
1722 if (Name == "apcs-gnu") {
Daniel Dunbard410fa22010-01-27 20:23:08 +00001723 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00001724 SizeType = UnsignedLong;
1725
Daniel Dunbar684de632010-04-22 16:14:54 +00001726 // Do not respect the alignment of bit-field types when laying out
1727 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1728 UseBitFieldTypeAlignment = false;
1729
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001730 if (IsThumb) {
1731 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1732 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001733 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001734 } else {
1735 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1736 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001737 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001738 }
1739
Daniel Dunbara2a41612009-09-14 00:02:24 +00001740 // FIXME: Override "preferred align" for double and long long.
1741 } else if (Name == "aapcs") {
1742 // FIXME: Enumerated types are variable width in straight AAPCS.
1743 } else if (Name == "aapcs-linux") {
1744 ;
1745 } else
1746 return false;
1747
1748 return true;
1749 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001750
Daniel Dunbara91320b2009-12-21 23:28:17 +00001751 void getDefaultFeatures(const std::string &CPU,
1752 llvm::StringMap<bool> &Features) const {
1753 // FIXME: This should not be here.
1754 Features["vfp2"] = false;
1755 Features["vfp3"] = false;
1756 Features["neon"] = false;
1757
1758 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1759 Features["vfp2"] = true;
1760 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1761 Features["neon"] = true;
1762 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001763
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001764 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1765 const std::string &Name,
1766 bool Enabled) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001767 if (Name == "soft-float" || Name == "soft-float-abi") {
1768 Features[Name] = Enabled;
1769 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1770 // These effectively are a single option, reset them when any is enabled.
1771 if (Enabled)
1772 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1773 Features[Name] = Enabled;
1774 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001775 return false;
1776
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001777 return true;
1778 }
1779
1780 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001781 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001782 SoftFloat = SoftFloatABI = false;
1783 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1784 if (Features[i] == "+soft-float")
1785 SoftFloat = true;
1786 else if (Features[i] == "+soft-float-abi")
1787 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001788 else if (Features[i] == "+vfp2")
1789 FPU = VFP2FPU;
1790 else if (Features[i] == "+vfp3")
1791 FPU = VFP3FPU;
1792 else if (Features[i] == "+neon")
1793 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001794 }
1795
1796 // Remove front-end specific options which the backend handles differently.
1797 std::vector<std::string>::iterator it;
1798 it = std::find(Features.begin(), Features.end(), "+soft-float");
1799 if (it != Features.end())
1800 Features.erase(it);
1801 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1802 if (it != Features.end())
1803 Features.erase(it);
1804 }
1805
Daniel Dunbareac7c532009-12-18 18:42:37 +00001806 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1807 return llvm::StringSwitch<const char*>(Name)
1808 .Cases("arm8", "arm810", "4")
1809 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1810 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1811 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1812 .Case("ep9312", "4T")
1813 .Cases("arm10tdmi", "arm1020t", "5T")
1814 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1815 .Case("arm926ej-s", "5TEJ")
1816 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1817 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001818 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001819 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001820 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001821 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1822 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00001823 .Case("cortex-m3", "7M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001824 .Default(0);
1825 }
1826 virtual bool setCPU(const std::string &Name) {
1827 if (!getCPUDefineSuffix(Name))
1828 return false;
1829
1830 CPU = Name;
1831 return true;
1832 }
Chris Lattner33328642009-03-20 15:52:06 +00001833 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001834 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001835 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00001836 Builder.defineMacro("__arm");
1837 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001838
Chris Lattnerc0f59212009-03-02 22:27:17 +00001839 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001840 Builder.defineMacro("__ARMEL__");
1841 Builder.defineMacro("__LITTLE_ENDIAN__");
1842 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001843
1844 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00001845 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001846
Mike Stump437bb4b2009-04-08 02:07:04 +00001847 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001848
Daniel Dunbareac7c532009-12-18 18:42:37 +00001849 // FIXME: It's more complicated than this and we don't really support
1850 // interworking.
1851 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00001852 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001853
Daniel Dunbareac7c532009-12-18 18:42:37 +00001854 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00001855 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001856
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001857 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00001858 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001859
1860 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00001861 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001862
Daniel Dunbara91320b2009-12-21 23:28:17 +00001863 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001864 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001865 Builder.defineMacro("__THUMBEL__");
1866 Builder.defineMacro("__thumb__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001867 if (IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00001868 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001869 }
1870
1871 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00001872 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001873
1874 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00001875 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001876
1877 // This only gets set when Neon instructions are actually available, unlike
1878 // the VFP define, hence the soft float and arch check. This is subtly
1879 // different from gcc, we follow the intent which was that it should be set
1880 // when Neon instructions are actually available.
1881 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00001882 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00001883 }
1884 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1885 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00001886 Records = BuiltinInfo;
1887 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00001888 }
1889 virtual const char *getVAListDeclaration() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001890 return "typedef char* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00001891 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001892 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001893 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001894 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001895 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001896 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001897 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001898 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001899 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00001900 default:
Nate Begemanad487f42008-04-22 05:03:19 +00001901 case 'l': // r0-r7
1902 case 'h': // r8-r15
1903 case 'w': // VFP Floating point register single precision
1904 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00001905 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00001906 return true;
1907 }
Chris Lattner393ff042008-04-21 18:56:49 +00001908 return false;
1909 }
1910 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001911 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00001912 return "";
1913 }
1914};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001915
1916const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001917 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001918 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001919 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
1920
1921 // Float registers
1922 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1923 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1924 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001925 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001926
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001927 // Double registers
1928 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
1929 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00001930 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
1931 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001932
1933 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00001934 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1935 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001936};
1937
1938void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00001939 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001940 Names = GCCRegNames;
1941 NumNames = llvm::array_lengthof(GCCRegNames);
1942}
1943
1944const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001945 { { "a1" }, "r0" },
1946 { { "a2" }, "r1" },
1947 { { "a3" }, "r2" },
1948 { { "a4" }, "r3" },
1949 { { "v1" }, "r4" },
1950 { { "v2" }, "r5" },
1951 { { "v3" }, "r6" },
1952 { { "v4" }, "r7" },
1953 { { "v5" }, "r8" },
1954 { { "v6", "rfp" }, "r9" },
1955 { { "sl" }, "r10" },
1956 { { "fp" }, "r11" },
1957 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00001958 { { "r13" }, "sp" },
1959 { { "r14" }, "lr" },
1960 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001961 // The S, D and Q registers overlap, but aren't really aliases; we
1962 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001963};
1964
1965void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1966 unsigned &NumAliases) const {
1967 Aliases = GCCRegAliases;
1968 NumAliases = llvm::array_lengthof(GCCRegAliases);
1969}
Chris Lattner2752c012010-03-03 19:03:45 +00001970
1971const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001972#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
1973#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1974 ALL_LANGUAGES, false },
Chris Lattner2752c012010-03-03 19:03:45 +00001975#include "clang/Basic/BuiltinsARM.def"
1976};
Chris Lattner393ff042008-04-21 18:56:49 +00001977} // end anonymous namespace.
1978
Eli Friedmana9f54962008-08-20 07:44:10 +00001979
1980namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00001981class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00001982 public DarwinTargetInfo<ARMTargetInfo> {
1983protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00001984 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00001985 MacroBuilder &Builder) const {
Daniel Dunbar21ae3192010-01-26 01:44:04 +00001986 getDarwinDefines(Builder, Opts, Triple);
Eli Friedmanb030f022009-04-19 21:38:35 +00001987 }
Eli Friedmana9f54962008-08-20 07:44:10 +00001988
Torok Edwin5f6c1942009-06-30 17:10:35 +00001989public:
Mike Stump1eb44332009-09-09 15:08:12 +00001990 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00001991 : DarwinTargetInfo<ARMTargetInfo>(triple) {
1992 HasAlignMac68kSupport = true;
1993 }
Eli Friedmana9f54962008-08-20 07:44:10 +00001994};
1995} // end anonymous namespace.
1996
Reid Spencer5f016e22007-07-11 17:01:13 +00001997namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00001998class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00001999 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2000 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002001 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00002002public:
Eli Friedman01b86682008-08-20 07:28:14 +00002003 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2004 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00002005 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00002006 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00002007 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002008 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2009 const std::string &Name,
2010 bool Enabled) const {
2011 if (Name == "soft-float")
2012 Features[Name] = Enabled;
2013 else
2014 return false;
2015
2016 return true;
2017 }
2018 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2019 SoftFloat = false;
2020 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2021 if (Features[i] == "+soft-float")
2022 SoftFloat = true;
2023 }
Chris Lattner33328642009-03-20 15:52:06 +00002024 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002025 MacroBuilder &Builder) const {
2026 DefineStd(Builder, "sparc", Opts);
2027 Builder.defineMacro("__sparcv8");
2028 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002029
2030 if (SoftFloat)
2031 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00002032 }
2033 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2034 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002035 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00002036 }
2037 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002038 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00002039 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002040 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002041 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002042 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002043 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002044 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00002045 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002046 // FIXME: Implement!
2047 return false;
Gabor Greif26658672008-02-21 16:29:08 +00002048 }
2049 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002050 // FIXME: Implement!
2051 return "";
Gabor Greif26658672008-02-21 16:29:08 +00002052 }
2053};
2054
Chris Lattnere957f532009-01-27 01:58:38 +00002055const char * const SparcV8TargetInfo::GCCRegNames[] = {
2056 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2057 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2058 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2059 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2060};
2061
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002062void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002063 unsigned &NumNames) const {
2064 Names = GCCRegNames;
2065 NumNames = llvm::array_lengthof(GCCRegNames);
2066}
2067
2068const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002069 { { "g0" }, "r0" },
2070 { { "g1" }, "r1" },
2071 { { "g2" }, "r2" },
2072 { { "g3" }, "r3" },
2073 { { "g4" }, "r4" },
2074 { { "g5" }, "r5" },
2075 { { "g6" }, "r6" },
2076 { { "g7" }, "r7" },
2077 { { "o0" }, "r8" },
2078 { { "o1" }, "r9" },
2079 { { "o2" }, "r10" },
2080 { { "o3" }, "r11" },
2081 { { "o4" }, "r12" },
2082 { { "o5" }, "r13" },
2083 { { "o6", "sp" }, "r14" },
2084 { { "o7" }, "r15" },
2085 { { "l0" }, "r16" },
2086 { { "l1" }, "r17" },
2087 { { "l2" }, "r18" },
2088 { { "l3" }, "r19" },
2089 { { "l4" }, "r20" },
2090 { { "l5" }, "r21" },
2091 { { "l6" }, "r22" },
2092 { { "l7" }, "r23" },
2093 { { "i0" }, "r24" },
2094 { { "i1" }, "r25" },
2095 { { "i2" }, "r26" },
2096 { { "i3" }, "r27" },
2097 { { "i4" }, "r28" },
2098 { { "i5" }, "r29" },
2099 { { "i6", "fp" }, "r30" },
2100 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00002101};
2102
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002103void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002104 unsigned &NumAliases) const {
2105 Aliases = GCCRegAliases;
2106 NumAliases = llvm::array_lengthof(GCCRegAliases);
2107}
Gabor Greif26658672008-02-21 16:29:08 +00002108} // end anonymous namespace.
2109
Eli Friedman01b86682008-08-20 07:28:14 +00002110namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002111class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2112public:
2113 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2114 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2115 SizeType = UnsignedInt;
2116 PtrDiffType = SignedInt;
2117 }
2118};
Torok Edwin5f6c1942009-06-30 17:10:35 +00002119class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00002120public:
2121 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002122 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00002123 SizeType = UnsignedInt;
2124 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00002125 }
2126};
2127} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00002128
Chris Lattner2621fd12008-05-08 05:58:21 +00002129namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002130 class MSP430TargetInfo : public TargetInfo {
2131 static const char * const GCCRegNames[];
2132 public:
2133 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2134 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00002135 IntWidth = 16; IntAlign = 16;
2136 LongWidth = 32; LongLongWidth = 64;
2137 LongAlign = LongLongAlign = 16;
2138 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002139 SizeType = UnsignedInt;
2140 IntMaxType = SignedLong;
2141 UIntMaxType = UnsignedLong;
2142 IntPtrType = SignedShort;
2143 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00002144 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00002145 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002146 }
2147 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002148 MacroBuilder &Builder) const {
2149 Builder.defineMacro("MSP430");
2150 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002151 // FIXME: defines for different 'flavours' of MCU
2152 }
2153 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2154 unsigned &NumRecords) const {
2155 // FIXME: Implement.
2156 Records = 0;
2157 NumRecords = 0;
2158 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002159 virtual void getGCCRegNames(const char * const *&Names,
2160 unsigned &NumNames) const;
2161 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2162 unsigned &NumAliases) const {
2163 // No aliases.
2164 Aliases = 0;
2165 NumAliases = 0;
2166 }
2167 virtual bool validateAsmConstraint(const char *&Name,
2168 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00002169 // No target constraints for now.
2170 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002171 }
2172 virtual const char *getClobbers() const {
2173 // FIXME: Is this really right?
2174 return "";
2175 }
2176 virtual const char *getVAListDeclaration() const {
2177 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00002178 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002179 }
2180 };
2181
2182 const char * const MSP430TargetInfo::GCCRegNames[] = {
2183 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2184 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2185 };
2186
2187 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2188 unsigned &NumNames) const {
2189 Names = GCCRegNames;
2190 NumNames = llvm::array_lengthof(GCCRegNames);
2191 }
2192}
2193
2194
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002195namespace {
2196 class SystemZTargetInfo : public TargetInfo {
2197 static const char * const GCCRegNames[];
2198 public:
2199 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2200 TLSSupported = false;
2201 IntWidth = IntAlign = 32;
2202 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2203 PointerWidth = PointerAlign = 64;
Chris Lattner1932e122009-11-07 18:59:41 +00002204 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2205 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002206 }
2207 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002208 MacroBuilder &Builder) const {
2209 Builder.defineMacro("__s390__");
2210 Builder.defineMacro("__s390x__");
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002211 }
2212 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2213 unsigned &NumRecords) const {
2214 // FIXME: Implement.
2215 Records = 0;
2216 NumRecords = 0;
2217 }
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002218
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002219 virtual void getGCCRegNames(const char * const *&Names,
2220 unsigned &NumNames) const;
2221 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2222 unsigned &NumAliases) const {
2223 // No aliases.
2224 Aliases = 0;
2225 NumAliases = 0;
2226 }
2227 virtual bool validateAsmConstraint(const char *&Name,
2228 TargetInfo::ConstraintInfo &info) const {
2229 // FIXME: implement
2230 return true;
2231 }
2232 virtual const char *getClobbers() const {
2233 // FIXME: Is this really right?
2234 return "";
2235 }
2236 virtual const char *getVAListDeclaration() const {
2237 // FIXME: implement
2238 return "typedef char* __builtin_va_list;";
2239 }
2240 };
2241
2242 const char * const SystemZTargetInfo::GCCRegNames[] = {
2243 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2244 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2245 };
2246
2247 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2248 unsigned &NumNames) const {
2249 Names = GCCRegNames;
2250 NumNames = llvm::array_lengthof(GCCRegNames);
2251 }
2252}
2253
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002254namespace {
2255 class BlackfinTargetInfo : public TargetInfo {
2256 static const char * const GCCRegNames[];
2257 public:
2258 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2259 TLSSupported = false;
2260 DoubleAlign = 32;
2261 LongLongAlign = 32;
2262 LongDoubleAlign = 32;
Chris Lattner1932e122009-11-07 18:59:41 +00002263 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002264 }
2265
2266 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002267 MacroBuilder &Builder) const {
2268 DefineStd(Builder, "bfin", Opts);
2269 DefineStd(Builder, "BFIN", Opts);
2270 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002271 // FIXME: This one is really dependent on -mcpu
Benjamin Kramera9992772010-01-09 17:55:51 +00002272 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002273 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2274 }
2275
2276 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2277 unsigned &NumRecords) const {
2278 // FIXME: Implement.
2279 Records = 0;
2280 NumRecords = 0;
2281 }
2282
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002283 virtual void getGCCRegNames(const char * const *&Names,
2284 unsigned &NumNames) const;
2285
2286 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2287 unsigned &NumAliases) const {
2288 // No aliases.
2289 Aliases = 0;
2290 NumAliases = 0;
2291 }
2292
2293 virtual bool validateAsmConstraint(const char *&Name,
2294 TargetInfo::ConstraintInfo &Info) const {
2295 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2296 Info.setAllowsRegister();
2297 return true;
2298 }
2299 return false;
2300 }
2301
2302 virtual const char *getClobbers() const {
2303 return "";
2304 }
2305
2306 virtual const char *getVAListDeclaration() const {
2307 return "typedef char* __builtin_va_list;";
2308 }
2309 };
2310
2311 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2312 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2313 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2314 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2315 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2316 "a0", "a1", "cc",
2317 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2318 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2319 };
2320
2321 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2322 unsigned &NumNames) const {
2323 Names = GCCRegNames;
2324 NumNames = llvm::array_lengthof(GCCRegNames);
2325 }
2326}
2327
Eli Friedmanb63decf2009-08-19 20:47:07 +00002328namespace {
2329
Mike Stump1eb44332009-09-09 15:08:12 +00002330 // LLVM and Clang cannot be used directly to output native binaries for
2331 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00002332 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00002333 //
2334 // TCE uses the llvm bitcode as input and uses it for generating customized
2335 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00002336 // publicly available in http://tce.cs.tut.fi
2337
2338 class TCETargetInfo : public TargetInfo{
2339 public:
2340 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2341 TLSSupported = false;
2342 IntWidth = 32;
2343 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00002344 PointerWidth = 32;
2345 IntAlign = 32;
2346 LongAlign = LongLongAlign = 32;
2347 PointerAlign = 32;
2348 SizeType = UnsignedInt;
2349 IntMaxType = SignedLong;
2350 UIntMaxType = UnsignedLong;
2351 IntPtrType = SignedInt;
2352 PtrDiffType = SignedInt;
2353 FloatWidth = 32;
2354 FloatAlign = 32;
2355 DoubleWidth = 32;
2356 DoubleAlign = 32;
2357 LongDoubleWidth = 32;
2358 LongDoubleAlign = 32;
2359 FloatFormat = &llvm::APFloat::IEEEsingle;
2360 DoubleFormat = &llvm::APFloat::IEEEsingle;
2361 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00002362 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2363 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00002364 "f32:32:32-f64:32:32-v64:32:32-"
2365 "v128:32:32-a0:0:32-n32";
Eli Friedmanb63decf2009-08-19 20:47:07 +00002366 }
2367
2368 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002369 MacroBuilder &Builder) const {
2370 DefineStd(Builder, "tce", Opts);
2371 Builder.defineMacro("__TCE__");
2372 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00002373 }
2374 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2375 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00002376 virtual const char *getClobbers() const {
2377 return "";
2378 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002379 virtual const char *getVAListDeclaration() const {
2380 return "typedef void* __builtin_va_list;";
2381 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002382 virtual void getGCCRegNames(const char * const *&Names,
2383 unsigned &NumNames) const {}
2384 virtual bool validateAsmConstraint(const char *&Name,
2385 TargetInfo::ConstraintInfo &info) const {
2386 return true;
2387 }
2388 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2389 unsigned &NumAliases) const {}
2390 };
2391}
2392
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002393namespace {
2394class MipsTargetInfo : public TargetInfo {
Eric Christophered734732010-03-02 02:41:08 +00002395 std::string ABI, CPU;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002396 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2397 static const char * const GCCRegNames[];
2398public:
Eric Christophered734732010-03-02 02:41:08 +00002399 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002400 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2401 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2402 }
Eric Christophered734732010-03-02 02:41:08 +00002403 virtual const char *getABI() const { return ABI.c_str(); }
2404 virtual bool setABI(const std::string &Name) {
2405
2406 if ((Name == "o32") || (Name == "eabi")) {
2407 ABI = Name;
2408 return true;
2409 } else
2410 return false;
2411 }
2412 virtual bool setCPU(const std::string &Name) {
2413 CPU = Name;
2414 return true;
2415 }
2416 void getDefaultFeatures(const std::string &CPU,
2417 llvm::StringMap<bool> &Features) const {
2418 Features[ABI] = true;
2419 Features[CPU] = true;
2420 }
2421 virtual void getArchDefines(const LangOptions &Opts,
2422 MacroBuilder &Builder) const {
2423 if (ABI == "o32")
2424 Builder.defineMacro("__mips_o32");
2425 else if (ABI == "eabi")
2426 Builder.defineMacro("__mips_eabi");
2427 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002428 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002429 MacroBuilder &Builder) const {
2430 DefineStd(Builder, "mips", Opts);
2431 Builder.defineMacro("_mips");
2432 DefineStd(Builder, "MIPSEB", Opts);
2433 Builder.defineMacro("_MIPSEB");
2434 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002435 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002436 }
2437 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2438 unsigned &NumRecords) const {
2439 // FIXME: Implement!
2440 }
2441 virtual const char *getVAListDeclaration() const {
2442 return "typedef void* __builtin_va_list;";
2443 }
2444 virtual void getGCCRegNames(const char * const *&Names,
2445 unsigned &NumNames) const;
2446 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2447 unsigned &NumAliases) const;
2448 virtual bool validateAsmConstraint(const char *&Name,
2449 TargetInfo::ConstraintInfo &Info) const {
2450 switch (*Name) {
2451 default:
2452 case 'r': // CPU registers.
2453 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2454 case 'y': // Equivalent to "r", backwards compatibility only.
2455 case 'f': // floating-point registers.
2456 Info.setAllowsRegister();
2457 return true;
2458 }
2459 return false;
2460 }
2461
2462 virtual const char *getClobbers() const {
2463 // FIXME: Implement!
2464 return "";
2465 }
2466};
2467
2468const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer20249a12010-10-21 03:16:25 +00002469 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002470 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2471 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2472 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2473 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2474 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2475 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2476 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2477 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2478 "$fcc5","$fcc6","$fcc7"
2479};
2480
2481void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2482 unsigned &NumNames) const {
2483 Names = GCCRegNames;
2484 NumNames = llvm::array_lengthof(GCCRegNames);
2485}
2486
2487const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2488 { { "at" }, "$1" },
2489 { { "v0" }, "$2" },
2490 { { "v1" }, "$3" },
2491 { { "a0" }, "$4" },
2492 { { "a1" }, "$5" },
2493 { { "a2" }, "$6" },
2494 { { "a3" }, "$7" },
2495 { { "t0" }, "$8" },
2496 { { "t1" }, "$9" },
2497 { { "t2" }, "$10" },
2498 { { "t3" }, "$11" },
2499 { { "t4" }, "$12" },
2500 { { "t5" }, "$13" },
2501 { { "t6" }, "$14" },
2502 { { "t7" }, "$15" },
2503 { { "s0" }, "$16" },
2504 { { "s1" }, "$17" },
2505 { { "s2" }, "$18" },
2506 { { "s3" }, "$19" },
2507 { { "s4" }, "$20" },
2508 { { "s5" }, "$21" },
2509 { { "s6" }, "$22" },
2510 { { "s7" }, "$23" },
2511 { { "t8" }, "$24" },
2512 { { "t9" }, "$25" },
2513 { { "k0" }, "$26" },
2514 { { "k1" }, "$27" },
2515 { { "gp" }, "$28" },
2516 { { "sp" }, "$29" },
2517 { { "fp" }, "$30" },
2518 { { "ra" }, "$31" }
2519};
2520
2521void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2522 unsigned &NumAliases) const {
2523 Aliases = GCCRegAliases;
2524 NumAliases = llvm::array_lengthof(GCCRegAliases);
2525}
2526} // end anonymous namespace.
2527
2528namespace {
2529class MipselTargetInfo : public MipsTargetInfo {
2530public:
2531 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2532 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2533 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2534 }
2535
2536 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002537 MacroBuilder &Builder) const;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002538};
2539
2540void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002541 MacroBuilder &Builder) const {
2542 DefineStd(Builder, "mips", Opts);
2543 Builder.defineMacro("_mips");
2544 DefineStd(Builder, "MIPSEL", Opts);
2545 Builder.defineMacro("_MIPSEL");
2546 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002547 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002548}
2549} // end anonymous namespace.
2550
Reid Spencer5f016e22007-07-11 17:01:13 +00002551//===----------------------------------------------------------------------===//
2552// Driver code
2553//===----------------------------------------------------------------------===//
2554
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002555static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002556 llvm::Triple Triple(T);
2557 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00002558
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002559 switch (Triple.getArch()) {
2560 default:
2561 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00002562
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002563 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00002564 case llvm::Triple::thumb:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002565 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00002566 case llvm::Triple::Linux:
2567 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002568 case llvm::Triple::Darwin:
Eli Friedmaned855cb2008-08-21 00:13:15 +00002569 return new DarwinARMTargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002570 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002571 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002572 default:
2573 return new ARMTargetInfo(T);
2574 }
Eli Friedman61538a72008-05-20 14:21:01 +00002575
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002576 case llvm::Triple::bfin:
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002577 return new BlackfinTargetInfo(T);
2578
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002579 case llvm::Triple::msp430:
2580 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00002581
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002582 case llvm::Triple::mips:
2583 if (os == llvm::Triple::Psp)
2584 return new PSPTargetInfo<MipsTargetInfo>(T);
2585 if (os == llvm::Triple::Linux)
2586 return new LinuxTargetInfo<MipsTargetInfo>(T);
2587 return new MipsTargetInfo(T);
2588
2589 case llvm::Triple::mipsel:
2590 if (os == llvm::Triple::Psp)
2591 return new PSPTargetInfo<MipselTargetInfo>(T);
2592 if (os == llvm::Triple::Linux)
2593 return new LinuxTargetInfo<MipselTargetInfo>(T);
2594 return new MipselTargetInfo(T);
2595
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002596 case llvm::Triple::ppc:
2597 if (os == llvm::Triple::Darwin)
Roman Divackyc81f2a22011-01-06 08:27:10 +00002598 return new DarwinPPC32TargetInfo(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002599 else if (os == llvm::Triple::FreeBSD)
2600 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002601 return new PPC32TargetInfo(T);
2602
2603 case llvm::Triple::ppc64:
2604 if (os == llvm::Triple::Darwin)
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00002605 return new DarwinPPC64TargetInfo(T);
John Thompson3f6918a2009-11-19 17:18:50 +00002606 else if (os == llvm::Triple::Lv2)
2607 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002608 else if (os == llvm::Triple::FreeBSD)
2609 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002610 return new PPC64TargetInfo(T);
2611
Chris Lattner9cbeb632010-03-06 21:21:27 +00002612 case llvm::Triple::mblaze:
2613 return new MBlazeTargetInfo(T);
2614
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002615 case llvm::Triple::sparc:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002616 if (os == llvm::Triple::AuroraUX)
2617 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002618 if (os == llvm::Triple::Solaris)
2619 return new SolarisSparcV8TargetInfo(T);
2620 return new SparcV8TargetInfo(T);
2621
John Thompson3f6918a2009-11-19 17:18:50 +00002622 // FIXME: Need a real SPU target.
2623 case llvm::Triple::cellspu:
2624 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2625
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002626 case llvm::Triple::systemz:
2627 return new SystemZTargetInfo(T);
2628
Eli Friedmanb63decf2009-08-19 20:47:07 +00002629 case llvm::Triple::tce:
2630 return new TCETargetInfo(T);
2631
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002632 case llvm::Triple::x86:
2633 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002634 case llvm::Triple::AuroraUX:
2635 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002636 case llvm::Triple::Darwin:
2637 return new DarwinI386TargetInfo(T);
2638 case llvm::Triple::Linux:
2639 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2640 case llvm::Triple::DragonFly:
2641 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2642 case llvm::Triple::NetBSD:
2643 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2644 case llvm::Triple::OpenBSD:
2645 return new OpenBSDI386TargetInfo(T);
2646 case llvm::Triple::FreeBSD:
2647 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00002648 case llvm::Triple::Minix:
2649 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002650 case llvm::Triple::Solaris:
2651 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2652 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002653 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002654 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002655 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002656 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00002657 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00002658 case llvm::Triple::Haiku:
2659 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002660 default:
2661 return new X86_32TargetInfo(T);
2662 }
2663
2664 case llvm::Triple::x86_64:
2665 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002666 case llvm::Triple::AuroraUX:
2667 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002668 case llvm::Triple::Darwin:
2669 return new DarwinX86_64TargetInfo(T);
2670 case llvm::Triple::Linux:
2671 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00002672 case llvm::Triple::DragonFly:
2673 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002674 case llvm::Triple::NetBSD:
2675 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2676 case llvm::Triple::OpenBSD:
2677 return new OpenBSDX86_64TargetInfo(T);
2678 case llvm::Triple::FreeBSD:
2679 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2680 case llvm::Triple::Solaris:
2681 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00002682 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002683 return new MinGWX86_64TargetInfo(T);
2684 case llvm::Triple::Win32: // This is what Triple.h supports now.
Douglas Gregorfb7049a2011-02-01 15:06:18 +00002685 if (Triple.getEnvironment() == llvm::Triple::MachO)
2686 return new DarwinX86_64TargetInfo(T);
2687 else
2688 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002689 default:
2690 return new X86_64TargetInfo(T);
2691 }
2692 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002693}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002694
2695/// CreateTargetInfo - Return the target info object for the specified target
2696/// triple.
2697TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002698 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002699 llvm::Triple Triple(Opts.Triple);
2700
2701 // Construct the target
2702 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2703 if (!Target) {
2704 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2705 return 0;
2706 }
2707
Daniel Dunbareac7c532009-12-18 18:42:37 +00002708 // Set the target CPU if specified.
2709 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2710 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2711 return 0;
2712 }
2713
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002714 // Set the target ABI if specified.
2715 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2716 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2717 return 0;
2718 }
2719
Charles Davis98b7c5c2010-06-11 01:06:47 +00002720 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00002721 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00002722 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2723 return 0;
2724 }
2725
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002726 // Compute the default target features, we need the target to handle this
2727 // because features may have dependencies on one another.
2728 llvm::StringMap<bool> Features;
2729 Target->getDefaultFeatures(Opts.CPU, Features);
2730
2731 // Apply the user specified deltas.
2732 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2733 ie = Opts.Features.end(); it != ie; ++it) {
2734 const char *Name = it->c_str();
2735
2736 // Apply the feature via the target.
2737 if ((Name[0] != '-' && Name[0] != '+') ||
2738 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2739 Diags.Report(diag::err_target_invalid_feature) << Name;
2740 return 0;
2741 }
2742 }
2743
2744 // Add the features to the compile options.
2745 //
2746 // FIXME: If we are completely confident that we have the right set, we only
2747 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002748 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002749 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2750 ie = Features.end(); it != ie; ++it)
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002751 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2752 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002753
2754 return Target.take();
2755}