blob: 35817a2453dbd9a393cc2b667527499ab8a772b6 [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;
Dale Johannesenf6e2c202010-10-29 23:12:32 +00001017 virtual const llvm::Type* adjustInlineAsmType(std::string& Constraint,
1018 const llvm::Type* Ty,
1019 llvm::LLVMContext& Context) const;
Eli Friedman618234a2008-08-20 02:34:37 +00001020 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001021 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001022 return "~{dirflag},~{fpsr},~{flags}";
1023 }
Chris Lattner33328642009-03-20 15:52:06 +00001024 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001025 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001026 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1027 const std::string &Name,
1028 bool Enabled) const;
Mike Stump1eb44332009-09-09 15:08:12 +00001029 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001030 llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001031 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Reid Spencer5f016e22007-07-11 17:01:13 +00001032};
Chris Lattner3daed522009-03-02 22:20:04 +00001033
Mike Stump1eb44332009-09-09 15:08:12 +00001034void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001035 llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001036 // FIXME: This should not be here.
1037 Features["3dnow"] = false;
1038 Features["3dnowa"] = false;
1039 Features["mmx"] = false;
1040 Features["sse"] = false;
1041 Features["sse2"] = false;
1042 Features["sse3"] = false;
1043 Features["ssse3"] = false;
1044 Features["sse41"] = false;
1045 Features["sse42"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001046 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001047 Features["avx"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001048
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001049 // LLVM does not currently recognize this.
1050 // Features["sse4a"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001051
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001052 // FIXME: This *really* should not be here.
1053
1054 // X86_64 always has SSE2.
1055 if (PointerWidth == 64)
1056 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1057
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001058 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1059 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1060 ;
1061 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1062 setFeatureEnabled(Features, "mmx", true);
1063 else if (CPU == "pentium3")
1064 setFeatureEnabled(Features, "sse", true);
1065 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1066 setFeatureEnabled(Features, "sse2", true);
1067 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1068 setFeatureEnabled(Features, "sse3", true);
1069 else if (CPU == "core2")
1070 setFeatureEnabled(Features, "ssse3", true);
1071 else if (CPU == "penryn") {
1072 setFeatureEnabled(Features, "sse4", true);
1073 Features["sse42"] = false;
1074 } else if (CPU == "atom")
1075 setFeatureEnabled(Features, "sse3", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001076 else if (CPU == "corei7") {
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001077 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001078 setFeatureEnabled(Features, "aes", true);
1079 }
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001080 else if (CPU == "k6" || CPU == "winchip-c6")
1081 setFeatureEnabled(Features, "mmx", true);
Mike Stump1eb44332009-09-09 15:08:12 +00001082 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001083 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1084 setFeatureEnabled(Features, "mmx", true);
1085 setFeatureEnabled(Features, "3dnow", true);
1086 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1087 setFeatureEnabled(Features, "sse", true);
1088 setFeatureEnabled(Features, "3dnowa", true);
1089 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1090 CPU == "athlon-fx") {
Mike Stump1eb44332009-09-09 15:08:12 +00001091 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001092 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001093 } else if (CPU == "k8-sse3") {
1094 setFeatureEnabled(Features, "sse3", true);
1095 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001096 } else if (CPU == "c3-2")
1097 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001098}
1099
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001100bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001101 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001102 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001103 // FIXME: This *really* should not be here. We need some way of translating
1104 // options into llvm subtarget features.
1105 if (!Features.count(Name) &&
1106 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001107 return false;
1108
1109 if (Enabled) {
1110 if (Name == "mmx")
1111 Features["mmx"] = true;
1112 else if (Name == "sse")
1113 Features["mmx"] = Features["sse"] = true;
1114 else if (Name == "sse2")
1115 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1116 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001117 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001118 Features["sse3"] = true;
1119 else if (Name == "ssse3")
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"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001122 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump1eb44332009-09-09 15:08:12 +00001123 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001124 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001125 else if (Name == "sse4.1")
1126 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1127 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001128 else if (Name == "3dnow")
1129 Features["3dnowa"] = true;
1130 else if (Name == "3dnowa")
1131 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001132 else if (Name == "aes")
1133 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001134 else if (Name == "avx")
1135 Features["avx"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001136 } else {
1137 if (Name == "mmx")
Mike Stump1eb44332009-09-09 15:08:12 +00001138 Features["mmx"] = 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 == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001141 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001142 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1143 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001144 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001145 Features["sse41"] = Features["sse42"] = false;
1146 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001147 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001148 Features["sse42"] = false;
1149 else if (Name == "ssse3")
1150 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1151 else if (Name == "sse4")
1152 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001153 else if (Name == "sse4.2")
1154 Features["sse42"] = false;
1155 else if (Name == "sse4.1")
1156 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001157 else if (Name == "3dnow")
1158 Features["3dnow"] = Features["3dnowa"] = false;
1159 else if (Name == "3dnowa")
1160 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001161 else if (Name == "aes")
1162 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001163 else if (Name == "avx")
1164 Features["avx"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001165 }
1166
1167 return true;
1168}
1169
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001170/// HandleTargetOptions - Perform initialization based on the user
1171/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001172void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001173 // Remember the maximum enabled sselevel.
1174 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1175 // Ignore disabled features.
1176 if (Features[i][0] == '-')
1177 continue;
1178
Eric Christophereea12d12010-04-02 23:50:19 +00001179 if (Features[i].substr(1) == "aes") {
1180 HasAES = true;
1181 continue;
1182 }
1183
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001184 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1185 // For now let it be enabled together with other SSE levels.
1186 if (Features[i].substr(1) == "avx") {
1187 HasAVX = true;
1188 continue;
1189 }
1190
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001191 assert(Features[i][0] == '+' && "Invalid target feature!");
1192 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1193 .Case("sse42", SSE42)
1194 .Case("sse41", SSE41)
1195 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001196 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001197 .Case("sse2", SSE2)
1198 .Case("sse", SSE1)
1199 .Case("mmx", MMX)
1200 .Default(NoMMXSSE);
1201 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001202
1203 AMD3DNowEnum ThreeDNowLevel =
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001204 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1205 .Case("3dnowa", AMD3DNowAthlon)
1206 .Case("3dnow", AMD3DNow)
1207 .Default(NoAMD3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001208
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001209 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001210 }
Chris Lattner3daed522009-03-02 22:20:04 +00001211}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001212
1213/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1214/// that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001215void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001216 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001217 // Target identification.
1218 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001219 Builder.defineMacro("_LP64");
1220 Builder.defineMacro("__LP64__");
1221 Builder.defineMacro("__amd64__");
1222 Builder.defineMacro("__amd64");
1223 Builder.defineMacro("__x86_64");
1224 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001225 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001226 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001227 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001228
Eric Christophereea12d12010-04-02 23:50:19 +00001229 if (HasAES)
1230 Builder.defineMacro("__AES__");
1231
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001232 if (HasAVX)
1233 Builder.defineMacro("__AVX__");
1234
Chris Lattnerc0f59212009-03-02 22:27:17 +00001235 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001236 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001237
Chris Lattnerc0f59212009-03-02 22:27:17 +00001238 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +00001239 Builder.defineMacro("__nocona");
1240 Builder.defineMacro("__nocona__");
1241 Builder.defineMacro("__tune_nocona__");
1242 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001243
Chris Lattner54175442009-04-19 17:32:33 +00001244 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1245 // functions in glibc header files that use FP Stack inline asm which the
1246 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001247 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001248
Chris Lattner84f0ea82009-03-02 22:40:39 +00001249 // Each case falls through to the previous one here.
1250 switch (SSELevel) {
1251 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00001252 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001253 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00001254 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001255 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001256 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001257 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001258 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001259 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00001260 Builder.defineMacro("__SSE2__");
1261 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001262 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00001263 Builder.defineMacro("__SSE__");
1264 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001265 case MMX:
Benjamin Kramera9992772010-01-09 17:55:51 +00001266 Builder.defineMacro("__MMX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001267 case NoMMXSSE:
1268 break;
1269 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001270
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001271 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001272 switch (SSELevel) {
Michael J. Spencera764e832010-10-21 08:22:51 +00001273 case SSE42:
1274 case SSE41:
1275 case SSSE3:
1276 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001277 case SSE2:
1278 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1279 break;
1280 case SSE1:
1281 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1282 break;
1283 default:
1284 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1285 }
1286 }
1287
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001288 // Each case falls through to the previous one here.
1289 switch (AMD3DNowLevel) {
1290 case AMD3DNowAthlon:
1291 Builder.defineMacro("__3dNOW_A__");
1292 case AMD3DNow:
1293 Builder.defineMacro("__3dNOW__");
1294 case NoAMD3DNow:
1295 break;
1296 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00001297}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001298
1299
Eli Friedman618234a2008-08-20 02:34:37 +00001300bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001301X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001302 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001303 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00001304 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00001305 case 'Y': // first letter of a pair:
1306 switch (*(Name+1)) {
1307 default: return false;
1308 case '0': // First SSE register.
1309 case 't': // Any SSE register, when SSE2 is enabled.
1310 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1311 case 'm': // any MMX register, when inter-unit moves enabled.
1312 break; // falls through to setAllowsRegister.
1313 }
Eli Friedman618234a2008-08-20 02:34:37 +00001314 case 'a': // eax.
1315 case 'b': // ebx.
1316 case 'c': // ecx.
1317 case 'd': // edx.
1318 case 'S': // esi.
1319 case 'D': // edi.
1320 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00001321 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00001322 case 't': // top of floating point stack.
1323 case 'u': // second from top of floating point stack.
1324 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00001325 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00001326 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00001327 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00001328 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1329 case 'l': // "Index" registers: any general register that can be used as an
1330 // index in a base+index memory access.
1331 Info.setAllowsRegister();
1332 return true;
1333 case 'C': // SSE floating point constant.
1334 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001335 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001336 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001337 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001338 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00001339 return true;
1340 }
Dale Johannesen545be512010-08-24 22:33:12 +00001341 return false;
Eli Friedman618234a2008-08-20 02:34:37 +00001342}
1343
Dale Johannesenf6e2c202010-10-29 23:12:32 +00001344const llvm::Type*
1345X86TargetInfo::adjustInlineAsmType(std::string& Constraint,
1346 const llvm::Type* Ty,
1347 llvm::LLVMContext &Context) const {
1348 if (Constraint=="y" && Ty->isVectorTy())
1349 return llvm::Type::getX86_MMXTy(Context);
1350 return Ty;
1351}
1352
1353
Eli Friedman618234a2008-08-20 02:34:37 +00001354std::string
1355X86TargetInfo::convertConstraint(const char Constraint) const {
1356 switch (Constraint) {
1357 case 'a': return std::string("{ax}");
1358 case 'b': return std::string("{bx}");
1359 case 'c': return std::string("{cx}");
1360 case 'd': return std::string("{dx}");
1361 case 'S': return std::string("{si}");
1362 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00001363 case 'p': // address
1364 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00001365 case 't': // top of floating point stack.
1366 return std::string("{st}");
1367 case 'u': // second from top of floating point stack.
1368 return std::string("{st(1)}"); // second from top of floating point stack.
1369 default:
1370 return std::string(1, Constraint);
1371 }
1372}
Eli Friedman618234a2008-08-20 02:34:37 +00001373} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00001374
1375namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001376// X86-32 generic target
1377class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001378public:
Eli Friedman618234a2008-08-20 02:34:37 +00001379 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1380 DoubleAlign = LongLongAlign = 32;
1381 LongDoubleWidth = 96;
1382 LongDoubleAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001383 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1384 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001385 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman1afabd92009-03-29 20:31:09 +00001386 SizeType = UnsignedInt;
1387 PtrDiffType = SignedInt;
1388 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001389 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001390
1391 // Use fpret for all types.
1392 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1393 (1 << TargetInfo::Double) |
1394 (1 << TargetInfo::LongDouble));
Eli Friedman618234a2008-08-20 02:34:37 +00001395 }
1396 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001397 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00001398 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001399
Chris Lattner21fb98e2009-09-23 06:06:36 +00001400 int getEHDataRegisterNumber(unsigned RegNo) const {
1401 if (RegNo == 0) return 0;
1402 if (RegNo == 1) return 2;
1403 return -1;
1404 }
Eli Friedman618234a2008-08-20 02:34:37 +00001405};
1406} // end anonymous namespace
1407
1408namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00001409class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1410public:
1411 OpenBSDI386TargetInfo(const std::string& triple) :
1412 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1413 SizeType = UnsignedLong;
1414 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00001415 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00001416 }
1417};
1418} // end anonymous namespace
1419
1420namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00001421class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00001422public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00001423 DarwinI386TargetInfo(const std::string& triple) :
1424 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00001425 LongDoubleWidth = 128;
1426 LongDoubleAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00001427 SizeType = UnsignedLong;
1428 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001429 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1430 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001431 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbar613fd672010-05-27 00:35:16 +00001432 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00001433 }
1434
Eli Friedman618234a2008-08-20 02:34:37 +00001435};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001436} // end anonymous namespace
1437
1438namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00001439// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001440class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00001441public:
1442 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001443 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00001444 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00001445 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00001446 DoubleAlign = LongLongAlign = 64;
1447 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 +00001448 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1449 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedman29a30502008-08-21 01:40:19 +00001450 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001451 virtual void getTargetDefines(const LangOptions &Opts,
1452 MacroBuilder &Builder) const {
1453 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1454 }
1455};
1456} // end anonymous namespace
1457
1458namespace {
1459
1460// x86-32 Windows Visual Studio target
1461class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1462public:
1463 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1464 : WindowsX86_32TargetInfo(triple) {
1465 LongDoubleWidth = 64;
1466 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1467 }
1468 virtual void getTargetDefines(const LangOptions &Opts,
1469 MacroBuilder &Builder) const {
1470 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1471 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1472 // The value of the following reflects processor type.
1473 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1474 // We lost the original triple, so we use the default.
1475 Builder.defineMacro("_M_IX86", "600");
1476 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001477};
1478} // end anonymous namespace
1479
1480namespace {
1481// x86-32 MinGW target
1482class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1483public:
1484 MinGWX86_32TargetInfo(const std::string& triple)
1485 : WindowsX86_32TargetInfo(triple) {
1486 }
1487 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001488 MacroBuilder &Builder) const {
1489 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001490 DefineStd(Builder, "WIN32", Opts);
1491 DefineStd(Builder, "WINNT", Opts);
1492 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00001493 Builder.defineMacro("__MSVCRT__");
1494 Builder.defineMacro("__MINGW32__");
1495 Builder.defineMacro("__declspec", "__declspec");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001496 }
1497};
1498} // end anonymous namespace
1499
1500namespace {
1501// x86-32 Cygwin target
1502class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1503public:
1504 CygwinX86_32TargetInfo(const std::string& triple)
1505 : X86_32TargetInfo(triple) {
1506 TLSSupported = false;
1507 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001508 DoubleAlign = LongLongAlign = 64;
1509 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1510 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001511 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001512 }
1513 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001514 MacroBuilder &Builder) const {
1515 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1516 Builder.defineMacro("__CYGWIN__");
1517 Builder.defineMacro("__CYGWIN32__");
1518 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00001519 if (Opts.CPlusPlus)
1520 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00001521 }
Eli Friedman29a30502008-08-21 01:40:19 +00001522};
1523} // end anonymous namespace
1524
1525namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00001526// x86-32 Haiku target
1527class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1528public:
1529 HaikuX86_32TargetInfo(const std::string& triple)
1530 : X86_32TargetInfo(triple) {
1531 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00001532 IntPtrType = SignedLong;
1533 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00001534 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00001535 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00001536 virtual void getTargetDefines(const LangOptions &Opts,
1537 MacroBuilder &Builder) const {
1538 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1539 Builder.defineMacro("__INTEL__");
1540 Builder.defineMacro("__HAIKU__");
1541 }
1542};
1543} // end anonymous namespace
1544
1545namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001546// x86-64 generic target
1547class X86_64TargetInfo : public X86TargetInfo {
1548public:
Chris Lattner33328642009-03-20 15:52:06 +00001549 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001550 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00001551 LongDoubleWidth = 128;
1552 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00001553 LargeArrayMinWidth = 128;
1554 LargeArrayAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00001555 IntMaxType = SignedLong;
1556 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001557 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001558 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00001559
Eli Friedmaned855cb2008-08-21 00:13:15 +00001560 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1561 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001562 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001563
1564 // Use fpret only for long double.
1565 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Reid Spencer5f016e22007-07-11 17:01:13 +00001566 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001567 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001568 return "typedef struct __va_list_tag {"
1569 " unsigned gp_offset;"
1570 " unsigned fp_offset;"
1571 " void* overflow_arg_area;"
1572 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00001573 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00001574 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00001575 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001576
Chris Lattner21fb98e2009-09-23 06:06:36 +00001577 int getEHDataRegisterNumber(unsigned RegNo) const {
1578 if (RegNo == 0) return 0;
1579 if (RegNo == 1) return 1;
1580 return -1;
1581 }
Eli Friedman618234a2008-08-20 02:34:37 +00001582};
1583} // end anonymous namespace
1584
1585namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001586// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001587class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001588public:
1589 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001590 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001591 TLSSupported = false;
1592 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00001593 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00001594 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00001595 IntMaxType = SignedLongLong;
1596 UIntMaxType = UnsignedLongLong;
1597 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00001598 SizeType = UnsignedLongLong;
1599 PtrDiffType = SignedLongLong;
1600 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00001601 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001602 }
1603 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001604 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001605 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001606 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00001607 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00001608 virtual const char *getVAListDeclaration() const {
1609 return "typedef char* __builtin_va_list;";
1610 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001611};
1612} // end anonymous namespace
1613
1614namespace {
1615// x86-64 Windows Visual Studio target
1616class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1617public:
1618 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1619 : WindowsX86_64TargetInfo(triple) {
1620 }
1621 virtual void getTargetDefines(const LangOptions &Opts,
1622 MacroBuilder &Builder) const {
1623 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1624 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00001625 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001626 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001627 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001628};
1629} // end anonymous namespace
1630
1631namespace {
1632// x86-64 MinGW target
1633class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1634public:
1635 MinGWX86_64TargetInfo(const std::string& triple)
1636 : WindowsX86_64TargetInfo(triple) {
1637 }
1638 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001639 MacroBuilder &Builder) const {
1640 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001641 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00001642 Builder.defineMacro("__MSVCRT__");
1643 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi1b24cd32011-01-17 22:56:16 +00001644 Builder.defineMacro("__declspec", "__declspec");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001645 }
1646};
1647} // end anonymous namespace
1648
1649namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001650class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1651public:
Mike Stump1eb44332009-09-09 15:08:12 +00001652 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001653 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1654 Int64Type = SignedLongLong;
1655 }
1656};
1657} // end anonymous namespace
1658
1659namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00001660class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1661public:
Mike Stump1eb44332009-09-09 15:08:12 +00001662 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00001663 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1664 IntMaxType = SignedLongLong;
1665 UIntMaxType = UnsignedLongLong;
1666 Int64Type = SignedLongLong;
1667 }
1668};
1669} // end anonymous namespace
1670
1671namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00001672class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001673 // Possible FPU choices.
1674 enum FPUMode {
1675 NoFPU,
1676 VFP2FPU,
1677 VFP3FPU,
1678 NeonFPU
1679 };
1680
1681 static bool FPUModeIsVFP(FPUMode Mode) {
1682 return Mode >= VFP2FPU && Mode <= NeonFPU;
1683 }
1684
1685 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1686 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001687
Daniel Dunbareac7c532009-12-18 18:42:37 +00001688 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001689
1690 unsigned FPU : 3;
1691
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001692 unsigned IsThumb : 1;
1693
1694 // Initialized via features.
1695 unsigned SoftFloat : 1;
1696 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001697
Chris Lattner2752c012010-03-03 19:03:45 +00001698 static const Builtin::Info BuiltinInfo[];
1699
Chris Lattner393ff042008-04-21 18:56:49 +00001700public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001701 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00001702 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001703 {
Daniel Dunbara2a41612009-09-14 00:02:24 +00001704 SizeType = UnsignedInt;
1705 PtrDiffType = SignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001706
Chris Lattner9bffb072010-04-23 16:29:58 +00001707 // {} in inline assembly are neon specifiers, not assembly variant
1708 // specifiers.
1709 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00001710
Daniel Dunbareac7c532009-12-18 18:42:37 +00001711 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00001712 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001713 if (IsThumb) {
1714 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1715 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner1932e122009-11-07 18:59:41 +00001716 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001717 } else {
1718 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1719 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner1932e122009-11-07 18:59:41 +00001720 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001721 }
John McCallee79a4c2010-08-21 22:46:04 +00001722
1723 // ARM targets default to using the ARM C++ ABI.
1724 CXXABI = CXXABI_ARM;
Eli Friedman61538a72008-05-20 14:21:01 +00001725 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001726 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00001727 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001728 ABI = Name;
1729
Daniel Dunbara2a41612009-09-14 00:02:24 +00001730 // The defaults (above) are for AAPCS, check if we need to change them.
1731 //
1732 // FIXME: We need support for -meabi... we could just mangle it into the
1733 // name.
1734 if (Name == "apcs-gnu") {
Daniel Dunbard410fa22010-01-27 20:23:08 +00001735 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00001736 SizeType = UnsignedLong;
1737
Daniel Dunbar684de632010-04-22 16:14:54 +00001738 // Do not respect the alignment of bit-field types when laying out
1739 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1740 UseBitFieldTypeAlignment = false;
1741
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001742 if (IsThumb) {
1743 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1744 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001745 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001746 } else {
1747 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1748 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001749 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001750 }
1751
Daniel Dunbara2a41612009-09-14 00:02:24 +00001752 // FIXME: Override "preferred align" for double and long long.
1753 } else if (Name == "aapcs") {
1754 // FIXME: Enumerated types are variable width in straight AAPCS.
1755 } else if (Name == "aapcs-linux") {
1756 ;
1757 } else
1758 return false;
1759
1760 return true;
1761 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001762
Daniel Dunbara91320b2009-12-21 23:28:17 +00001763 void getDefaultFeatures(const std::string &CPU,
1764 llvm::StringMap<bool> &Features) const {
1765 // FIXME: This should not be here.
1766 Features["vfp2"] = false;
1767 Features["vfp3"] = false;
1768 Features["neon"] = false;
1769
1770 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1771 Features["vfp2"] = true;
1772 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1773 Features["neon"] = true;
1774 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001775
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001776 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1777 const std::string &Name,
1778 bool Enabled) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001779 if (Name == "soft-float" || Name == "soft-float-abi") {
1780 Features[Name] = Enabled;
1781 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1782 // These effectively are a single option, reset them when any is enabled.
1783 if (Enabled)
1784 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1785 Features[Name] = Enabled;
1786 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001787 return false;
1788
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001789 return true;
1790 }
1791
1792 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001793 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001794 SoftFloat = SoftFloatABI = false;
1795 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1796 if (Features[i] == "+soft-float")
1797 SoftFloat = true;
1798 else if (Features[i] == "+soft-float-abi")
1799 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001800 else if (Features[i] == "+vfp2")
1801 FPU = VFP2FPU;
1802 else if (Features[i] == "+vfp3")
1803 FPU = VFP3FPU;
1804 else if (Features[i] == "+neon")
1805 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001806 }
1807
1808 // Remove front-end specific options which the backend handles differently.
1809 std::vector<std::string>::iterator it;
1810 it = std::find(Features.begin(), Features.end(), "+soft-float");
1811 if (it != Features.end())
1812 Features.erase(it);
1813 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1814 if (it != Features.end())
1815 Features.erase(it);
1816 }
1817
Daniel Dunbareac7c532009-12-18 18:42:37 +00001818 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1819 return llvm::StringSwitch<const char*>(Name)
1820 .Cases("arm8", "arm810", "4")
1821 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1822 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1823 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1824 .Case("ep9312", "4T")
1825 .Cases("arm10tdmi", "arm1020t", "5T")
1826 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1827 .Case("arm926ej-s", "5TEJ")
1828 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1829 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001830 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001831 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001832 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001833 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1834 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00001835 .Case("cortex-m3", "7M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001836 .Default(0);
1837 }
1838 virtual bool setCPU(const std::string &Name) {
1839 if (!getCPUDefineSuffix(Name))
1840 return false;
1841
1842 CPU = Name;
1843 return true;
1844 }
Chris Lattner33328642009-03-20 15:52:06 +00001845 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001846 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001847 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00001848 Builder.defineMacro("__arm");
1849 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001850
Chris Lattnerc0f59212009-03-02 22:27:17 +00001851 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001852 Builder.defineMacro("__ARMEL__");
1853 Builder.defineMacro("__LITTLE_ENDIAN__");
1854 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001855
1856 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00001857 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001858
Mike Stump437bb4b2009-04-08 02:07:04 +00001859 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001860
Daniel Dunbareac7c532009-12-18 18:42:37 +00001861 // FIXME: It's more complicated than this and we don't really support
1862 // interworking.
1863 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00001864 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001865
Daniel Dunbareac7c532009-12-18 18:42:37 +00001866 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00001867 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001868
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001869 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00001870 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001871
1872 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00001873 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001874
Daniel Dunbara91320b2009-12-21 23:28:17 +00001875 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001876 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001877 Builder.defineMacro("__THUMBEL__");
1878 Builder.defineMacro("__thumb__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001879 if (IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00001880 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001881 }
1882
1883 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00001884 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001885
1886 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00001887 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001888
1889 // This only gets set when Neon instructions are actually available, unlike
1890 // the VFP define, hence the soft float and arch check. This is subtly
1891 // different from gcc, we follow the intent which was that it should be set
1892 // when Neon instructions are actually available.
1893 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00001894 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00001895 }
1896 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1897 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00001898 Records = BuiltinInfo;
1899 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00001900 }
1901 virtual const char *getVAListDeclaration() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001902 return "typedef char* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00001903 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001904 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001905 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001906 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001907 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001908 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001909 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001910 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001911 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00001912 default:
Nate Begemanad487f42008-04-22 05:03:19 +00001913 case 'l': // r0-r7
1914 case 'h': // r8-r15
1915 case 'w': // VFP Floating point register single precision
1916 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00001917 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00001918 return true;
1919 }
Chris Lattner393ff042008-04-21 18:56:49 +00001920 return false;
1921 }
1922 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001923 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00001924 return "";
1925 }
1926};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001927
1928const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001929 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001930 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001931 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
1932
1933 // Float registers
1934 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1935 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1936 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001937 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001938
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001939 // Double registers
1940 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
1941 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00001942 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
1943 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001944
1945 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00001946 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1947 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001948};
1949
1950void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00001951 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001952 Names = GCCRegNames;
1953 NumNames = llvm::array_lengthof(GCCRegNames);
1954}
1955
1956const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001957 { { "a1" }, "r0" },
1958 { { "a2" }, "r1" },
1959 { { "a3" }, "r2" },
1960 { { "a4" }, "r3" },
1961 { { "v1" }, "r4" },
1962 { { "v2" }, "r5" },
1963 { { "v3" }, "r6" },
1964 { { "v4" }, "r7" },
1965 { { "v5" }, "r8" },
1966 { { "v6", "rfp" }, "r9" },
1967 { { "sl" }, "r10" },
1968 { { "fp" }, "r11" },
1969 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00001970 { { "r13" }, "sp" },
1971 { { "r14" }, "lr" },
1972 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001973 // The S, D and Q registers overlap, but aren't really aliases; we
1974 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001975};
1976
1977void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1978 unsigned &NumAliases) const {
1979 Aliases = GCCRegAliases;
1980 NumAliases = llvm::array_lengthof(GCCRegAliases);
1981}
Chris Lattner2752c012010-03-03 19:03:45 +00001982
1983const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001984#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
1985#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1986 ALL_LANGUAGES, false },
Chris Lattner2752c012010-03-03 19:03:45 +00001987#include "clang/Basic/BuiltinsARM.def"
1988};
Chris Lattner393ff042008-04-21 18:56:49 +00001989} // end anonymous namespace.
1990
Eli Friedmana9f54962008-08-20 07:44:10 +00001991
1992namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00001993class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00001994 public DarwinTargetInfo<ARMTargetInfo> {
1995protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00001996 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00001997 MacroBuilder &Builder) const {
Daniel Dunbar21ae3192010-01-26 01:44:04 +00001998 getDarwinDefines(Builder, Opts, Triple);
Eli Friedmanb030f022009-04-19 21:38:35 +00001999 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002000
Torok Edwin5f6c1942009-06-30 17:10:35 +00002001public:
Mike Stump1eb44332009-09-09 15:08:12 +00002002 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002003 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2004 HasAlignMac68kSupport = true;
2005 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002006};
2007} // end anonymous namespace.
2008
Reid Spencer5f016e22007-07-11 17:01:13 +00002009namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00002010class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00002011 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2012 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002013 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00002014public:
Eli Friedman01b86682008-08-20 07:28:14 +00002015 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2016 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00002017 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 +00002018 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00002019 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002020 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2021 const std::string &Name,
2022 bool Enabled) const {
2023 if (Name == "soft-float")
2024 Features[Name] = Enabled;
2025 else
2026 return false;
2027
2028 return true;
2029 }
2030 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2031 SoftFloat = false;
2032 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2033 if (Features[i] == "+soft-float")
2034 SoftFloat = true;
2035 }
Chris Lattner33328642009-03-20 15:52:06 +00002036 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002037 MacroBuilder &Builder) const {
2038 DefineStd(Builder, "sparc", Opts);
2039 Builder.defineMacro("__sparcv8");
2040 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002041
2042 if (SoftFloat)
2043 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00002044 }
2045 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2046 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002047 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00002048 }
2049 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002050 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00002051 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002052 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002053 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002054 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002055 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002056 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00002057 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002058 // FIXME: Implement!
2059 return false;
Gabor Greif26658672008-02-21 16:29:08 +00002060 }
2061 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002062 // FIXME: Implement!
2063 return "";
Gabor Greif26658672008-02-21 16:29:08 +00002064 }
2065};
2066
Chris Lattnere957f532009-01-27 01:58:38 +00002067const char * const SparcV8TargetInfo::GCCRegNames[] = {
2068 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2069 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2070 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2071 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2072};
2073
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002074void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002075 unsigned &NumNames) const {
2076 Names = GCCRegNames;
2077 NumNames = llvm::array_lengthof(GCCRegNames);
2078}
2079
2080const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002081 { { "g0" }, "r0" },
2082 { { "g1" }, "r1" },
2083 { { "g2" }, "r2" },
2084 { { "g3" }, "r3" },
2085 { { "g4" }, "r4" },
2086 { { "g5" }, "r5" },
2087 { { "g6" }, "r6" },
2088 { { "g7" }, "r7" },
2089 { { "o0" }, "r8" },
2090 { { "o1" }, "r9" },
2091 { { "o2" }, "r10" },
2092 { { "o3" }, "r11" },
2093 { { "o4" }, "r12" },
2094 { { "o5" }, "r13" },
2095 { { "o6", "sp" }, "r14" },
2096 { { "o7" }, "r15" },
2097 { { "l0" }, "r16" },
2098 { { "l1" }, "r17" },
2099 { { "l2" }, "r18" },
2100 { { "l3" }, "r19" },
2101 { { "l4" }, "r20" },
2102 { { "l5" }, "r21" },
2103 { { "l6" }, "r22" },
2104 { { "l7" }, "r23" },
2105 { { "i0" }, "r24" },
2106 { { "i1" }, "r25" },
2107 { { "i2" }, "r26" },
2108 { { "i3" }, "r27" },
2109 { { "i4" }, "r28" },
2110 { { "i5" }, "r29" },
2111 { { "i6", "fp" }, "r30" },
2112 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00002113};
2114
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002115void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002116 unsigned &NumAliases) const {
2117 Aliases = GCCRegAliases;
2118 NumAliases = llvm::array_lengthof(GCCRegAliases);
2119}
Gabor Greif26658672008-02-21 16:29:08 +00002120} // end anonymous namespace.
2121
Eli Friedman01b86682008-08-20 07:28:14 +00002122namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002123class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2124public:
2125 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2126 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2127 SizeType = UnsignedInt;
2128 PtrDiffType = SignedInt;
2129 }
2130};
Torok Edwin5f6c1942009-06-30 17:10:35 +00002131class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00002132public:
2133 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002134 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00002135 SizeType = UnsignedInt;
2136 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00002137 }
2138};
2139} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00002140
Chris Lattner2621fd12008-05-08 05:58:21 +00002141namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002142 class MSP430TargetInfo : public TargetInfo {
2143 static const char * const GCCRegNames[];
2144 public:
2145 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2146 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00002147 IntWidth = 16; IntAlign = 16;
2148 LongWidth = 32; LongLongWidth = 64;
2149 LongAlign = LongLongAlign = 16;
2150 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002151 SizeType = UnsignedInt;
2152 IntMaxType = SignedLong;
2153 UIntMaxType = UnsignedLong;
2154 IntPtrType = SignedShort;
2155 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00002156 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00002157 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002158 }
2159 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002160 MacroBuilder &Builder) const {
2161 Builder.defineMacro("MSP430");
2162 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002163 // FIXME: defines for different 'flavours' of MCU
2164 }
2165 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2166 unsigned &NumRecords) const {
2167 // FIXME: Implement.
2168 Records = 0;
2169 NumRecords = 0;
2170 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002171 virtual void getGCCRegNames(const char * const *&Names,
2172 unsigned &NumNames) const;
2173 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2174 unsigned &NumAliases) const {
2175 // No aliases.
2176 Aliases = 0;
2177 NumAliases = 0;
2178 }
2179 virtual bool validateAsmConstraint(const char *&Name,
2180 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00002181 // No target constraints for now.
2182 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002183 }
2184 virtual const char *getClobbers() const {
2185 // FIXME: Is this really right?
2186 return "";
2187 }
2188 virtual const char *getVAListDeclaration() const {
2189 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00002190 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002191 }
2192 };
2193
2194 const char * const MSP430TargetInfo::GCCRegNames[] = {
2195 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2196 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2197 };
2198
2199 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2200 unsigned &NumNames) const {
2201 Names = GCCRegNames;
2202 NumNames = llvm::array_lengthof(GCCRegNames);
2203 }
2204}
2205
2206
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002207namespace {
2208 class SystemZTargetInfo : public TargetInfo {
2209 static const char * const GCCRegNames[];
2210 public:
2211 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2212 TLSSupported = false;
2213 IntWidth = IntAlign = 32;
2214 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2215 PointerWidth = PointerAlign = 64;
Chris Lattner1932e122009-11-07 18:59:41 +00002216 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2217 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002218 }
2219 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002220 MacroBuilder &Builder) const {
2221 Builder.defineMacro("__s390__");
2222 Builder.defineMacro("__s390x__");
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002223 }
2224 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2225 unsigned &NumRecords) const {
2226 // FIXME: Implement.
2227 Records = 0;
2228 NumRecords = 0;
2229 }
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002230
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002231 virtual void getGCCRegNames(const char * const *&Names,
2232 unsigned &NumNames) const;
2233 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2234 unsigned &NumAliases) const {
2235 // No aliases.
2236 Aliases = 0;
2237 NumAliases = 0;
2238 }
2239 virtual bool validateAsmConstraint(const char *&Name,
2240 TargetInfo::ConstraintInfo &info) const {
2241 // FIXME: implement
2242 return true;
2243 }
2244 virtual const char *getClobbers() const {
2245 // FIXME: Is this really right?
2246 return "";
2247 }
2248 virtual const char *getVAListDeclaration() const {
2249 // FIXME: implement
2250 return "typedef char* __builtin_va_list;";
2251 }
2252 };
2253
2254 const char * const SystemZTargetInfo::GCCRegNames[] = {
2255 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2256 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2257 };
2258
2259 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2260 unsigned &NumNames) const {
2261 Names = GCCRegNames;
2262 NumNames = llvm::array_lengthof(GCCRegNames);
2263 }
2264}
2265
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002266namespace {
2267 class BlackfinTargetInfo : public TargetInfo {
2268 static const char * const GCCRegNames[];
2269 public:
2270 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2271 TLSSupported = false;
2272 DoubleAlign = 32;
2273 LongLongAlign = 32;
2274 LongDoubleAlign = 32;
Chris Lattner1932e122009-11-07 18:59:41 +00002275 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002276 }
2277
2278 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002279 MacroBuilder &Builder) const {
2280 DefineStd(Builder, "bfin", Opts);
2281 DefineStd(Builder, "BFIN", Opts);
2282 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002283 // FIXME: This one is really dependent on -mcpu
Benjamin Kramera9992772010-01-09 17:55:51 +00002284 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002285 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2286 }
2287
2288 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2289 unsigned &NumRecords) const {
2290 // FIXME: Implement.
2291 Records = 0;
2292 NumRecords = 0;
2293 }
2294
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002295 virtual void getGCCRegNames(const char * const *&Names,
2296 unsigned &NumNames) const;
2297
2298 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2299 unsigned &NumAliases) const {
2300 // No aliases.
2301 Aliases = 0;
2302 NumAliases = 0;
2303 }
2304
2305 virtual bool validateAsmConstraint(const char *&Name,
2306 TargetInfo::ConstraintInfo &Info) const {
2307 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2308 Info.setAllowsRegister();
2309 return true;
2310 }
2311 return false;
2312 }
2313
2314 virtual const char *getClobbers() const {
2315 return "";
2316 }
2317
2318 virtual const char *getVAListDeclaration() const {
2319 return "typedef char* __builtin_va_list;";
2320 }
2321 };
2322
2323 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2324 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2325 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2326 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2327 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2328 "a0", "a1", "cc",
2329 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2330 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2331 };
2332
2333 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2334 unsigned &NumNames) const {
2335 Names = GCCRegNames;
2336 NumNames = llvm::array_lengthof(GCCRegNames);
2337 }
2338}
2339
Eli Friedmanb63decf2009-08-19 20:47:07 +00002340namespace {
2341
Mike Stump1eb44332009-09-09 15:08:12 +00002342 // LLVM and Clang cannot be used directly to output native binaries for
2343 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00002344 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00002345 //
2346 // TCE uses the llvm bitcode as input and uses it for generating customized
2347 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00002348 // publicly available in http://tce.cs.tut.fi
2349
2350 class TCETargetInfo : public TargetInfo{
2351 public:
2352 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2353 TLSSupported = false;
2354 IntWidth = 32;
2355 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00002356 PointerWidth = 32;
2357 IntAlign = 32;
2358 LongAlign = LongLongAlign = 32;
2359 PointerAlign = 32;
2360 SizeType = UnsignedInt;
2361 IntMaxType = SignedLong;
2362 UIntMaxType = UnsignedLong;
2363 IntPtrType = SignedInt;
2364 PtrDiffType = SignedInt;
2365 FloatWidth = 32;
2366 FloatAlign = 32;
2367 DoubleWidth = 32;
2368 DoubleAlign = 32;
2369 LongDoubleWidth = 32;
2370 LongDoubleAlign = 32;
2371 FloatFormat = &llvm::APFloat::IEEEsingle;
2372 DoubleFormat = &llvm::APFloat::IEEEsingle;
2373 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00002374 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2375 "i16:16:32-i32:32:32-i64:32:32-"
2376 "f32:32:32-f64:64:64-v64:64:64-"
2377 "v128:128:128-a0:0:64-n32";
Eli Friedmanb63decf2009-08-19 20:47:07 +00002378 }
2379
2380 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002381 MacroBuilder &Builder) const {
2382 DefineStd(Builder, "tce", Opts);
2383 Builder.defineMacro("__TCE__");
2384 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00002385 }
2386 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2387 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00002388 virtual const char *getClobbers() const {
2389 return "";
2390 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002391 virtual const char *getVAListDeclaration() const {
2392 return "typedef void* __builtin_va_list;";
2393 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002394 virtual void getGCCRegNames(const char * const *&Names,
2395 unsigned &NumNames) const {}
2396 virtual bool validateAsmConstraint(const char *&Name,
2397 TargetInfo::ConstraintInfo &info) const {
2398 return true;
2399 }
2400 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2401 unsigned &NumAliases) const {}
2402 };
2403}
2404
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002405namespace {
2406class MipsTargetInfo : public TargetInfo {
Eric Christophered734732010-03-02 02:41:08 +00002407 std::string ABI, CPU;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002408 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2409 static const char * const GCCRegNames[];
2410public:
Eric Christophered734732010-03-02 02:41:08 +00002411 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002412 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2413 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2414 }
Eric Christophered734732010-03-02 02:41:08 +00002415 virtual const char *getABI() const { return ABI.c_str(); }
2416 virtual bool setABI(const std::string &Name) {
2417
2418 if ((Name == "o32") || (Name == "eabi")) {
2419 ABI = Name;
2420 return true;
2421 } else
2422 return false;
2423 }
2424 virtual bool setCPU(const std::string &Name) {
2425 CPU = Name;
2426 return true;
2427 }
2428 void getDefaultFeatures(const std::string &CPU,
2429 llvm::StringMap<bool> &Features) const {
2430 Features[ABI] = true;
2431 Features[CPU] = true;
2432 }
2433 virtual void getArchDefines(const LangOptions &Opts,
2434 MacroBuilder &Builder) const {
2435 if (ABI == "o32")
2436 Builder.defineMacro("__mips_o32");
2437 else if (ABI == "eabi")
2438 Builder.defineMacro("__mips_eabi");
2439 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002440 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002441 MacroBuilder &Builder) const {
2442 DefineStd(Builder, "mips", Opts);
2443 Builder.defineMacro("_mips");
2444 DefineStd(Builder, "MIPSEB", Opts);
2445 Builder.defineMacro("_MIPSEB");
2446 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002447 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002448 }
2449 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2450 unsigned &NumRecords) const {
2451 // FIXME: Implement!
2452 }
2453 virtual const char *getVAListDeclaration() const {
2454 return "typedef void* __builtin_va_list;";
2455 }
2456 virtual void getGCCRegNames(const char * const *&Names,
2457 unsigned &NumNames) const;
2458 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2459 unsigned &NumAliases) const;
2460 virtual bool validateAsmConstraint(const char *&Name,
2461 TargetInfo::ConstraintInfo &Info) const {
2462 switch (*Name) {
2463 default:
2464 case 'r': // CPU registers.
2465 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2466 case 'y': // Equivalent to "r", backwards compatibility only.
2467 case 'f': // floating-point registers.
2468 Info.setAllowsRegister();
2469 return true;
2470 }
2471 return false;
2472 }
2473
2474 virtual const char *getClobbers() const {
2475 // FIXME: Implement!
2476 return "";
2477 }
2478};
2479
2480const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer20249a12010-10-21 03:16:25 +00002481 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002482 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2483 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2484 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2485 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2486 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2487 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2488 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2489 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2490 "$fcc5","$fcc6","$fcc7"
2491};
2492
2493void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2494 unsigned &NumNames) const {
2495 Names = GCCRegNames;
2496 NumNames = llvm::array_lengthof(GCCRegNames);
2497}
2498
2499const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2500 { { "at" }, "$1" },
2501 { { "v0" }, "$2" },
2502 { { "v1" }, "$3" },
2503 { { "a0" }, "$4" },
2504 { { "a1" }, "$5" },
2505 { { "a2" }, "$6" },
2506 { { "a3" }, "$7" },
2507 { { "t0" }, "$8" },
2508 { { "t1" }, "$9" },
2509 { { "t2" }, "$10" },
2510 { { "t3" }, "$11" },
2511 { { "t4" }, "$12" },
2512 { { "t5" }, "$13" },
2513 { { "t6" }, "$14" },
2514 { { "t7" }, "$15" },
2515 { { "s0" }, "$16" },
2516 { { "s1" }, "$17" },
2517 { { "s2" }, "$18" },
2518 { { "s3" }, "$19" },
2519 { { "s4" }, "$20" },
2520 { { "s5" }, "$21" },
2521 { { "s6" }, "$22" },
2522 { { "s7" }, "$23" },
2523 { { "t8" }, "$24" },
2524 { { "t9" }, "$25" },
2525 { { "k0" }, "$26" },
2526 { { "k1" }, "$27" },
2527 { { "gp" }, "$28" },
2528 { { "sp" }, "$29" },
2529 { { "fp" }, "$30" },
2530 { { "ra" }, "$31" }
2531};
2532
2533void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2534 unsigned &NumAliases) const {
2535 Aliases = GCCRegAliases;
2536 NumAliases = llvm::array_lengthof(GCCRegAliases);
2537}
2538} // end anonymous namespace.
2539
2540namespace {
2541class MipselTargetInfo : public MipsTargetInfo {
2542public:
2543 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2544 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2545 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2546 }
2547
2548 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002549 MacroBuilder &Builder) const;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002550};
2551
2552void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002553 MacroBuilder &Builder) const {
2554 DefineStd(Builder, "mips", Opts);
2555 Builder.defineMacro("_mips");
2556 DefineStd(Builder, "MIPSEL", Opts);
2557 Builder.defineMacro("_MIPSEL");
2558 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002559 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002560}
2561} // end anonymous namespace.
2562
Reid Spencer5f016e22007-07-11 17:01:13 +00002563//===----------------------------------------------------------------------===//
2564// Driver code
2565//===----------------------------------------------------------------------===//
2566
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002567static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002568 llvm::Triple Triple(T);
2569 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00002570
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002571 switch (Triple.getArch()) {
2572 default:
2573 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00002574
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002575 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00002576 case llvm::Triple::thumb:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002577 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00002578 case llvm::Triple::Linux:
2579 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002580 case llvm::Triple::Darwin:
Eli Friedmaned855cb2008-08-21 00:13:15 +00002581 return new DarwinARMTargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002582 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002583 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002584 default:
2585 return new ARMTargetInfo(T);
2586 }
Eli Friedman61538a72008-05-20 14:21:01 +00002587
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002588 case llvm::Triple::bfin:
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002589 return new BlackfinTargetInfo(T);
2590
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002591 case llvm::Triple::msp430:
2592 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00002593
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002594 case llvm::Triple::mips:
2595 if (os == llvm::Triple::Psp)
2596 return new PSPTargetInfo<MipsTargetInfo>(T);
2597 if (os == llvm::Triple::Linux)
2598 return new LinuxTargetInfo<MipsTargetInfo>(T);
2599 return new MipsTargetInfo(T);
2600
2601 case llvm::Triple::mipsel:
2602 if (os == llvm::Triple::Psp)
2603 return new PSPTargetInfo<MipselTargetInfo>(T);
2604 if (os == llvm::Triple::Linux)
2605 return new LinuxTargetInfo<MipselTargetInfo>(T);
2606 return new MipselTargetInfo(T);
2607
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002608 case llvm::Triple::ppc:
2609 if (os == llvm::Triple::Darwin)
Roman Divackyc81f2a22011-01-06 08:27:10 +00002610 return new DarwinPPC32TargetInfo(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002611 else if (os == llvm::Triple::FreeBSD)
2612 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002613 return new PPC32TargetInfo(T);
2614
2615 case llvm::Triple::ppc64:
2616 if (os == llvm::Triple::Darwin)
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00002617 return new DarwinPPC64TargetInfo(T);
John Thompson3f6918a2009-11-19 17:18:50 +00002618 else if (os == llvm::Triple::Lv2)
2619 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002620 else if (os == llvm::Triple::FreeBSD)
2621 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002622 return new PPC64TargetInfo(T);
2623
Chris Lattner9cbeb632010-03-06 21:21:27 +00002624 case llvm::Triple::mblaze:
2625 return new MBlazeTargetInfo(T);
2626
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002627 case llvm::Triple::sparc:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002628 if (os == llvm::Triple::AuroraUX)
2629 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002630 if (os == llvm::Triple::Solaris)
2631 return new SolarisSparcV8TargetInfo(T);
2632 return new SparcV8TargetInfo(T);
2633
John Thompson3f6918a2009-11-19 17:18:50 +00002634 // FIXME: Need a real SPU target.
2635 case llvm::Triple::cellspu:
2636 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2637
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002638 case llvm::Triple::systemz:
2639 return new SystemZTargetInfo(T);
2640
Eli Friedmanb63decf2009-08-19 20:47:07 +00002641 case llvm::Triple::tce:
2642 return new TCETargetInfo(T);
2643
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002644 case llvm::Triple::x86:
2645 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002646 case llvm::Triple::AuroraUX:
2647 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002648 case llvm::Triple::Darwin:
2649 return new DarwinI386TargetInfo(T);
2650 case llvm::Triple::Linux:
2651 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2652 case llvm::Triple::DragonFly:
2653 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2654 case llvm::Triple::NetBSD:
2655 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2656 case llvm::Triple::OpenBSD:
2657 return new OpenBSDI386TargetInfo(T);
2658 case llvm::Triple::FreeBSD:
2659 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00002660 case llvm::Triple::Minix:
2661 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002662 case llvm::Triple::Solaris:
2663 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2664 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002665 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002666 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002667 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002668 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00002669 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00002670 case llvm::Triple::Haiku:
2671 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002672 default:
2673 return new X86_32TargetInfo(T);
2674 }
2675
2676 case llvm::Triple::x86_64:
2677 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002678 case llvm::Triple::AuroraUX:
2679 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002680 case llvm::Triple::Darwin:
2681 return new DarwinX86_64TargetInfo(T);
2682 case llvm::Triple::Linux:
2683 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00002684 case llvm::Triple::DragonFly:
2685 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002686 case llvm::Triple::NetBSD:
2687 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2688 case llvm::Triple::OpenBSD:
2689 return new OpenBSDX86_64TargetInfo(T);
2690 case llvm::Triple::FreeBSD:
2691 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2692 case llvm::Triple::Solaris:
2693 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00002694 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002695 return new MinGWX86_64TargetInfo(T);
2696 case llvm::Triple::Win32: // This is what Triple.h supports now.
Douglas Gregorfb7049a2011-02-01 15:06:18 +00002697 if (Triple.getEnvironment() == llvm::Triple::MachO)
2698 return new DarwinX86_64TargetInfo(T);
2699 else
2700 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002701 default:
2702 return new X86_64TargetInfo(T);
2703 }
2704 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002705}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002706
2707/// CreateTargetInfo - Return the target info object for the specified target
2708/// triple.
2709TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002710 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002711 llvm::Triple Triple(Opts.Triple);
2712
2713 // Construct the target
2714 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2715 if (!Target) {
2716 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2717 return 0;
2718 }
2719
Daniel Dunbareac7c532009-12-18 18:42:37 +00002720 // Set the target CPU if specified.
2721 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2722 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2723 return 0;
2724 }
2725
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002726 // Set the target ABI if specified.
2727 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2728 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2729 return 0;
2730 }
2731
Charles Davis98b7c5c2010-06-11 01:06:47 +00002732 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00002733 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00002734 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2735 return 0;
2736 }
2737
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002738 // Compute the default target features, we need the target to handle this
2739 // because features may have dependencies on one another.
2740 llvm::StringMap<bool> Features;
2741 Target->getDefaultFeatures(Opts.CPU, Features);
2742
2743 // Apply the user specified deltas.
2744 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2745 ie = Opts.Features.end(); it != ie; ++it) {
2746 const char *Name = it->c_str();
2747
2748 // Apply the feature via the target.
2749 if ((Name[0] != '-' && Name[0] != '+') ||
2750 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2751 Diags.Report(diag::err_target_invalid_feature) << Name;
2752 return 0;
2753 }
2754 }
2755
2756 // Add the features to the compile options.
2757 //
2758 // FIXME: If we are completely confident that we have the right set, we only
2759 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002760 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002761 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2762 ie = Features.end(); it != ie; ++it)
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002763 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2764 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002765
2766 return Target.take();
2767}