blob: 8f36725598dfe493227bed6d42bf56d3744985ea [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"
Benjamin Kramer48725082010-01-09 18:20:57 +000029#include <algorithm>
Reid Spencer5f016e22007-07-11 17:01:13 +000030using namespace clang;
31
Reid Spencer5f016e22007-07-11 17:01:13 +000032//===----------------------------------------------------------------------===//
33// Common code shared among targets.
34//===----------------------------------------------------------------------===//
35
Chris Lattnerca45cff2009-03-20 16:06:38 +000036/// DefineStd - Define a macro name and standard variants. For example if
37/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
38/// when in GNU mode.
Benjamin Kramera9992772010-01-09 17:55:51 +000039static void DefineStd(MacroBuilder &Builder, llvm::StringRef MacroName,
Chris Lattnerca45cff2009-03-20 16:06:38 +000040 const LangOptions &Opts) {
41 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000042
Chris Lattnerca45cff2009-03-20 16:06:38 +000043 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
44 // in the user's namespace.
45 if (Opts.GNUMode)
Benjamin Kramera9992772010-01-09 17:55:51 +000046 Builder.defineMacro(MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000047
Chris Lattnerca45cff2009-03-20 16:06:38 +000048 // Define __unix.
Benjamin Kramera9992772010-01-09 17:55:51 +000049 Builder.defineMacro("__" + MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000050
Chris Lattnerca45cff2009-03-20 16:06:38 +000051 // Define __unix__.
Benjamin Kramera9992772010-01-09 17:55:51 +000052 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerca45cff2009-03-20 16:06:38 +000053}
54
Chris Lattnerd29b6302008-10-05 21:50:58 +000055//===----------------------------------------------------------------------===//
56// Defines specific to certain operating systems.
57//===----------------------------------------------------------------------===//
Chris Lattner797c3c42009-08-10 19:03:04 +000058
Torok Edwin5f6c1942009-06-30 17:10:35 +000059namespace {
Douglas Gregora3844922009-07-01 15:12:53 +000060template<typename TgtInfo>
61class OSTargetInfo : public TgtInfo {
Torok Edwin5f6c1942009-06-30 17:10:35 +000062protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +000063 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +000064 MacroBuilder &Builder) const=0;
Torok Edwin5f6c1942009-06-30 17:10:35 +000065public:
Douglas Gregora3844922009-07-01 15:12:53 +000066 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwin5f6c1942009-06-30 17:10:35 +000067 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +000068 MacroBuilder &Builder) const {
69 TgtInfo::getTargetDefines(Opts, Builder);
70 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwinb0a5b242009-06-30 17:00:25 +000071 }
Torok Edwin5f6c1942009-06-30 17:10:35 +000072
73};
Chris Lattner4c28b1c2009-08-12 06:24:27 +000074} // end anonymous namespace
Torok Edwinb0a5b242009-06-30 17:00:25 +000075
Chris Lattner797c3c42009-08-10 19:03:04 +000076
Daniel Dunbar21ae3192010-01-26 01:44:04 +000077static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
78 const llvm::Triple &Triple) {
Benjamin Kramera9992772010-01-09 17:55:51 +000079 Builder.defineMacro("__APPLE_CC__", "5621");
80 Builder.defineMacro("__APPLE__");
81 Builder.defineMacro("__MACH__");
82 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000083
Chris Lattner10d24272009-04-07 16:50:40 +000084 // __weak is always defined, for use in blocks and with objc pointers.
Benjamin Kramera9992772010-01-09 17:55:51 +000085 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000086
Chris Lattner10d24272009-04-07 16:50:40 +000087 // Darwin defines __strong even in C mode (just to nothing).
88 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
Benjamin Kramera9992772010-01-09 17:55:51 +000089 Builder.defineMacro("__strong", "");
Chris Lattner10d24272009-04-07 16:50:40 +000090 else
Benjamin Kramera9992772010-01-09 17:55:51 +000091 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
Eli Friedman2de4fee2009-06-04 23:00:29 +000092
93 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +000094 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +000095 else
Benjamin Kramera9992772010-01-09 17:55:51 +000096 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +000097
98 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +000099 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000100
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000101 // Get the OS version number from the triple.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000102 unsigned Maj, Min, Rev;
Mike Stump1eb44332009-09-09 15:08:12 +0000103
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000104 // If no version was given, default to to 10.4.0, for simplifying tests.
105 if (Triple.getOSName() == "darwin") {
106 Min = Rev = 0;
107 Maj = 8;
108 } else
109 Triple.getDarwinNumber(Maj, Min, Rev);
110
111 // Set the appropriate OS version define.
112 if (Triple.getEnvironmentName() == "iphoneos") {
113 assert(Maj < 10 && Min < 99 && Rev < 99 && "Invalid version!");
114 char Str[6];
115 Str[0] = '0' + Maj;
116 Str[1] = '0' + (Min / 10);
117 Str[2] = '0' + (Min % 10);
118 Str[3] = '0' + (Rev / 10);
119 Str[4] = '0' + (Rev % 10);
120 Str[5] = '\0';
121 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
122 } else {
123 // For historical reasons that make little sense, the version passed here is
124 // the "darwin" version, which drops the 10 and offsets by 4.
125 Rev = Min;
126 Min = Maj - 4;
127 Maj = 10;
128
129 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
130 assert(Maj < 99 && Min < 10 && Rev < 10 && "Invalid version!");
131 char Str[5];
132 Str[0] = '0' + (Maj / 10);
133 Str[1] = '0' + (Maj % 10);
134 Str[2] = '0' + Min;
135 Str[3] = '0' + Rev;
136 Str[4] = '\0';
137 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000138 }
Eli Friedman618234a2008-08-20 02:34:37 +0000139}
Reid Spencer5f016e22007-07-11 17:01:13 +0000140
Chris Lattner797c3c42009-08-10 19:03:04 +0000141namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000142template<typename Target>
143class DarwinTargetInfo : public OSTargetInfo<Target> {
144protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000145 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000146 MacroBuilder &Builder) const {
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000147 getDarwinDefines(Builder, Opts, Triple);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000148 }
Mike Stump1eb44332009-09-09 15:08:12 +0000149
Torok Edwin5f6c1942009-06-30 17:10:35 +0000150public:
151 DarwinTargetInfo(const std::string& triple) :
152 OSTargetInfo<Target>(triple) {
Eric Christopherdd53ec92010-06-25 19:04:52 +0000153 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000154 }
155
Anders Carlssonf959fb52010-01-30 18:33:31 +0000156 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000157 // Let MCSectionMachO validate this.
158 llvm::StringRef Segment, Section;
159 unsigned TAA, StubSize;
160 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
161 TAA, StubSize);
162 }
Anders Carlsson18af3682010-06-08 22:47:50 +0000163
164 virtual const char *getStaticInitSectionSpecifier() const {
165 // FIXME: We should return 0 when building kexts.
166 return "__TEXT,__StaticInit,regular,pure_instructions";
167 }
168
Torok Edwin5f6c1942009-06-30 17:10:35 +0000169};
170
Chris Lattner797c3c42009-08-10 19:03:04 +0000171
Torok Edwin5f6c1942009-06-30 17:10:35 +0000172// DragonFlyBSD Target
173template<typename Target>
174class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
175protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000176 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000177 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000178 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000179 Builder.defineMacro("__DragonFly__");
180 Builder.defineMacro("__DragonFly_cc_version", "100001");
181 Builder.defineMacro("__ELF__");
182 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
183 Builder.defineMacro("__tune_i386__");
184 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000185 }
186public:
Mike Stump1eb44332009-09-09 15:08:12 +0000187 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000188 : OSTargetInfo<Target>(triple) {}
189};
190
191// FreeBSD Target
192template<typename Target>
193class FreeBSDTargetInfo : public OSTargetInfo<Target> {
194protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000195 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000196 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000197 // FreeBSD defines; list based off of gcc output
198
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000199 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000200 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000201
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000202 Builder.defineMacro("__FreeBSD__", Release);
203 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramera9992772010-01-09 17:55:51 +0000204 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
205 DefineStd(Builder, "unix", Opts);
206 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000207 }
208public:
Mike Stump1eb44332009-09-09 15:08:12 +0000209 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000210 : OSTargetInfo<Target>(triple) {
211 this->UserLabelPrefix = "";
212 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000213};
214
215// Linux target
216template<typename Target>
217class LinuxTargetInfo : public OSTargetInfo<Target> {
218protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000219 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000220 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000221 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000222 DefineStd(Builder, "unix", Opts);
223 DefineStd(Builder, "linux", Opts);
224 Builder.defineMacro("__gnu_linux__");
225 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000226 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000227 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000228 if (Opts.CPlusPlus)
229 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000230 }
231public:
Mike Stump1eb44332009-09-09 15:08:12 +0000232 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000233 : OSTargetInfo<Target>(triple) {
234 this->UserLabelPrefix = "";
235 }
236};
237
Chris Lattnerb62bb282009-07-13 20:29:08 +0000238// NetBSD Target
239template<typename Target>
240class NetBSDTargetInfo : public OSTargetInfo<Target> {
241protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000242 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000243 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000244 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000245 Builder.defineMacro("__NetBSD__");
246 Builder.defineMacro("__unix__");
247 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000248 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000249 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000250 }
251public:
Mike Stump1eb44332009-09-09 15:08:12 +0000252 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000253 : OSTargetInfo<Target>(triple) {
254 this->UserLabelPrefix = "";
255 }
256};
257
Torok Edwin5f6c1942009-06-30 17:10:35 +0000258// OpenBSD Target
259template<typename Target>
260class OpenBSDTargetInfo : public OSTargetInfo<Target> {
261protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000262 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000263 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000264 // OpenBSD defines; list based off of gcc output
265
Benjamin Kramera9992772010-01-09 17:55:51 +0000266 Builder.defineMacro("__OpenBSD__");
267 DefineStd(Builder, "unix", Opts);
268 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000269 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000270 Builder.defineMacro("_POSIX_THREADS");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000271 }
272public:
Mike Stump1eb44332009-09-09 15:08:12 +0000273 OpenBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000274 : OSTargetInfo<Target>(triple) {}
275};
276
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000277// PSP Target
278template<typename Target>
279class PSPTargetInfo : public OSTargetInfo<Target> {
280protected:
281 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000282 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000283 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000284 Builder.defineMacro("PSP");
285 Builder.defineMacro("_PSP");
286 Builder.defineMacro("__psp__");
287 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000288 }
289public:
290 PSPTargetInfo(const std::string& triple)
291 : OSTargetInfo<Target>(triple) {
292 this->UserLabelPrefix = "";
293 }
294};
295
John Thompson3f6918a2009-11-19 17:18:50 +0000296// PS3 PPU Target
297template<typename Target>
298class PS3PPUTargetInfo : public OSTargetInfo<Target> {
299protected:
300 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000301 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000302 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000303 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000304 Builder.defineMacro("__PPU__");
305 Builder.defineMacro("__CELLOS_LV2__");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000308 Builder.defineMacro("_ARCH_PPC64");
309 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000310 }
311public:
312 PS3PPUTargetInfo(const std::string& triple)
313 : OSTargetInfo<Target>(triple) {
314 this->UserLabelPrefix = "";
John Thompsonec387af2009-12-18 14:21:08 +0000315 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000316 this->IntMaxType = TargetInfo::SignedLongLong;
317 this->UIntMaxType = TargetInfo::UnsignedLongLong;
318 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000319 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000320 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
321 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000322 }
323};
324
325// FIXME: Need a real SPU target.
326// PS3 SPU Target
327template<typename Target>
328class PS3SPUTargetInfo : public OSTargetInfo<Target> {
329protected:
330 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000331 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000332 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000333 Builder.defineMacro("__SPU__");
334 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000335 }
336public:
337 PS3SPUTargetInfo(const std::string& triple)
338 : OSTargetInfo<Target>(triple) {
339 this->UserLabelPrefix = "";
340 }
341};
342
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000343// AuroraUX target
344template<typename Target>
345class AuroraUXTargetInfo : public OSTargetInfo<Target> {
346protected:
347 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000348 MacroBuilder &Builder) const {
349 DefineStd(Builder, "sun", Opts);
350 DefineStd(Builder, "unix", Opts);
351 Builder.defineMacro("__ELF__");
352 Builder.defineMacro("__svr4__");
353 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000354 }
355public:
356 AuroraUXTargetInfo(const std::string& triple)
357 : OSTargetInfo<Target>(triple) {
358 this->UserLabelPrefix = "";
359 this->WCharType = this->SignedLong;
360 // FIXME: WIntType should be SignedLong
361 }
362};
363
Torok Edwin5f6c1942009-06-30 17:10:35 +0000364// Solaris target
365template<typename Target>
366class SolarisTargetInfo : public OSTargetInfo<Target> {
367protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000368 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000369 MacroBuilder &Builder) const {
370 DefineStd(Builder, "sun", Opts);
371 DefineStd(Builder, "unix", Opts);
372 Builder.defineMacro("__ELF__");
373 Builder.defineMacro("__svr4__");
374 Builder.defineMacro("__SVR4");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000375 }
376public:
Mike Stump1eb44332009-09-09 15:08:12 +0000377 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000378 : OSTargetInfo<Target>(triple) {
379 this->UserLabelPrefix = "";
380 this->WCharType = this->SignedLong;
381 // FIXME: WIntType should be SignedLong
382 }
383};
Mike Stump1eb44332009-09-09 15:08:12 +0000384} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000385
Chris Lattnerd29b6302008-10-05 21:50:58 +0000386//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000387// Specific target implementations.
388//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000389
Eli Friedmane4277982008-08-20 23:11:40 +0000390namespace {
391// PPC abstract base class
392class PPCTargetInfo : public TargetInfo {
393 static const Builtin::Info BuiltinInfo[];
394 static const char * const GCCRegNames[];
395 static const TargetInfo::GCCRegAlias GCCRegAliases[];
396
397public:
Eli Friedman15b91762009-06-05 07:05:05 +0000398 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
399
Eli Friedmane4277982008-08-20 23:11:40 +0000400 virtual void getTargetBuiltins(const Builtin::Info *&Records,
401 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000402 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000403 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000404 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000405
Chris Lattner33328642009-03-20 15:52:06 +0000406 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000407 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000408
Eli Friedmane4277982008-08-20 23:11:40 +0000409 virtual const char *getVAListDeclaration() const {
Chris Lattnerd5998502008-10-27 01:11:29 +0000410 return "typedef char* __builtin_va_list;";
411 // This is the right definition for ABI/V4: System V.4/eabi.
412 /*return "typedef struct __va_list_tag {"
Eli Friedmane4277982008-08-20 23:11:40 +0000413 " unsigned char gpr;"
414 " unsigned char fpr;"
415 " unsigned short reserved;"
416 " void* overflow_arg_area;"
417 " void* reg_save_area;"
Chris Lattnerd5998502008-10-27 01:11:29 +0000418 "} __builtin_va_list[1];";*/
Anders Carlsson3346ae62007-11-24 23:38:12 +0000419 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000420 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000421 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000422 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000423 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000424 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000425 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000426 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000427 default: return false;
428 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000429 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000430 case 'b': // Base register
431 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000432 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000433 break;
434 // FIXME: The following are added to allow parsing.
435 // I just took a guess at what the actions should be.
436 // Also, is more specific checking needed? I.e. specific registers?
437 case 'd': // Floating point register (containing 64-bit value)
438 case 'v': // Altivec vector register
439 Info.setAllowsRegister();
440 break;
441 case 'w':
442 switch (Name[1]) {
443 case 'd':// VSX vector register to hold vector double data
444 case 'f':// VSX vector register to hold vector float data
445 case 's':// VSX vector register to hold scalar float data
446 case 'a':// Any VSX register
447 break;
448 default:
449 return false;
450 }
451 Info.setAllowsRegister();
452 Name++; // Skip over 'w'.
453 break;
454 case 'h': // `MQ', `CTR', or `LINK' register
455 case 'q': // `MQ' register
456 case 'c': // `CTR' register
457 case 'l': // `LINK' register
458 case 'x': // `CR' register (condition register) number 0
459 case 'y': // `CR' register (condition register)
460 case 'z': // `XER[CA]' carry bit (part of the XER register)
461 Info.setAllowsRegister();
462 break;
463 case 'I': // Signed 16-bit constant
464 case 'J': // Unsigned 16-bit constant shifted left 16 bits
465 // (use `L' instead for SImode constants)
466 case 'K': // Unsigned 16-bit constant
467 case 'L': // Signed 16-bit constant shifted left 16 bits
468 case 'M': // Constant larger than 31
469 case 'N': // Exact power of 2
470 case 'P': // Constant whose negation is a signed 16-bit constant
471 case 'G': // Floating point constant that can be loaded into a
472 // register with one instruction per word
473 case 'H': // Integer/Floating point constant that can be loaded
474 // into a register using three instructions
475 break;
476 case 'm': // Memory operand. Note that on PowerPC targets, m can
477 // include addresses that update the base register. It
478 // is therefore only safe to use `m' in an asm statement
479 // if that asm statement accesses the operand exactly once.
480 // The asm statement must also use `%U<opno>' as a
481 // placeholder for the “update” flag in the corresponding
482 // load or store instruction. For example:
483 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
484 // is correct but:
485 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
486 // is not. Use es rather than m if you don't want the base
487 // register to be updated.
John Thompson56b6eca2010-06-25 00:02:05 +0000488 case 'e':
489 if (Name[1] != 's')
490 return false;
491 // es: A “stable” memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000492 // include any automodification of the base register. Unlike
493 // `m', this constraint can be used in asm statements that
494 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000495 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000496 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000497 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000498 break;
499 case 'Q': // Memory operand that is an offset from a register (it is
500 // usually better to use `m' or `es' in asm statements)
501 case 'Z': // Memory operand that is an indexed or indirect from a
502 // register (it is usually better to use `m' or `es' in
503 // asm statements)
504 Info.setAllowsMemory();
505 Info.setAllowsRegister();
506 break;
507 case 'R': // AIX TOC entry
508 case 'a': // Address operand that is an indexed or indirect from a
509 // register (`p' is preferable for asm statements)
510 case 'S': // Constant suitable as a 64-bit mask operand
511 case 'T': // Constant suitable as a 32-bit mask operand
512 case 'U': // System V Release 4 small data area reference
513 case 't': // AND masks that can be performed by two rldic{l, r}
514 // instructions
515 case 'W': // Vector constant that does not require memory
516 case 'j': // Vector constant that is all zeros.
517 break;
518 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000519 }
John Thompson8e6065a2010-06-24 22:44:13 +0000520 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000521 }
Eli Friedmane4277982008-08-20 23:11:40 +0000522 virtual const char *getClobbers() const {
523 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000524 }
Eli Friedmane4277982008-08-20 23:11:40 +0000525};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000526
Eli Friedmane4277982008-08-20 23:11:40 +0000527const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Douglas Gregorb1152d82009-02-16 21:58:21 +0000528#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
529#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000530#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000531};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000532
533
Chris Lattnerc0f59212009-03-02 22:27:17 +0000534/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
535/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000536void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000537 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000538 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000539 Builder.defineMacro("__ppc__");
540 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000541 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000542 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000543 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000544 Builder.defineMacro("_ARCH_PPC64");
545 Builder.defineMacro("_LP64");
546 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000547 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000548 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000549 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000550 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000551 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000552
Chris Lattnerc0f59212009-03-02 22:27:17 +0000553 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +0000554 Builder.defineMacro("_BIG_ENDIAN");
555 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000556
Chris Lattnerc0f59212009-03-02 22:27:17 +0000557 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000558 Builder.defineMacro("__NATURAL_ALIGNMENT__");
559 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000560
Chris Lattnerc0f59212009-03-02 22:27:17 +0000561 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000562 Builder.defineMacro("__LONG_DOUBLE_128__");
John Thompson3f6918a2009-11-19 17:18:50 +0000563
564 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000565 Builder.defineMacro("__VEC__", "10206");
566 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000567 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000568}
569
Chris Lattner393ff042008-04-21 18:56:49 +0000570
Eli Friedmane4277982008-08-20 23:11:40 +0000571const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000572 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
573 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
574 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
575 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
576 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
577 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
578 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
579 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000580 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000581 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000582 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000583 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
584 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
585 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
586 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000587 "vrsave", "vscr",
588 "spe_acc", "spefscr",
589 "sfp"
590};
Reid Spencer5f016e22007-07-11 17:01:13 +0000591
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000592void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000593 unsigned &NumNames) const {
594 Names = GCCRegNames;
595 NumNames = llvm::array_lengthof(GCCRegNames);
596}
Reid Spencer5f016e22007-07-11 17:01:13 +0000597
Eli Friedmane4277982008-08-20 23:11:40 +0000598const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
599 // While some of these aliases do map to different registers
600 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000601 { { "0" }, "r0" },
602 { { "1"}, "r1" },
603 { { "2" }, "r2" },
604 { { "3" }, "r3" },
605 { { "4" }, "r4" },
606 { { "5" }, "r5" },
607 { { "6" }, "r6" },
608 { { "7" }, "r7" },
609 { { "8" }, "r8" },
610 { { "9" }, "r9" },
611 { { "10" }, "r10" },
612 { { "11" }, "r11" },
613 { { "12" }, "r12" },
614 { { "13" }, "r13" },
615 { { "14" }, "r14" },
616 { { "15" }, "r15" },
617 { { "16" }, "r16" },
618 { { "17" }, "r17" },
619 { { "18" }, "r18" },
620 { { "19" }, "r19" },
621 { { "20" }, "r20" },
622 { { "21" }, "r21" },
623 { { "22" }, "r22" },
624 { { "23" }, "r23" },
625 { { "24" }, "r24" },
626 { { "25" }, "r25" },
627 { { "26" }, "r26" },
628 { { "27" }, "r27" },
629 { { "28" }, "r28" },
630 { { "29" }, "r29" },
631 { { "30" }, "r30" },
632 { { "31" }, "r31" },
633 { { "fr0" }, "f0" },
634 { { "fr1" }, "f1" },
635 { { "fr2" }, "f2" },
636 { { "fr3" }, "f3" },
637 { { "fr4" }, "f4" },
638 { { "fr5" }, "f5" },
639 { { "fr6" }, "f6" },
640 { { "fr7" }, "f7" },
641 { { "fr8" }, "f8" },
642 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000643 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000644 { { "fr11" }, "f11" },
645 { { "fr12" }, "f12" },
646 { { "fr13" }, "f13" },
647 { { "fr14" }, "f14" },
648 { { "fr15" }, "f15" },
649 { { "fr16" }, "f16" },
650 { { "fr17" }, "f17" },
651 { { "fr18" }, "f18" },
652 { { "fr19" }, "f19" },
653 { { "fr20" }, "f20" },
654 { { "fr21" }, "f21" },
655 { { "fr22" }, "f22" },
656 { { "fr23" }, "f23" },
657 { { "fr24" }, "f24" },
658 { { "fr25" }, "f25" },
659 { { "fr26" }, "f26" },
660 { { "fr27" }, "f27" },
661 { { "fr28" }, "f28" },
662 { { "fr29" }, "f29" },
663 { { "fr30" }, "f30" },
664 { { "fr31" }, "f31" },
665 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000666};
667
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000668void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000669 unsigned &NumAliases) const {
670 Aliases = GCCRegAliases;
671 NumAliases = llvm::array_lengthof(GCCRegAliases);
672}
673} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000674
675namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000676class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000677public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000678 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000679 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 +0000680 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000681
682 if (getTriple().getOS() == llvm::Triple::FreeBSD)
683 this->SizeType = TargetInfo::UnsignedInt;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000684 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000685};
686} // end anonymous namespace.
687
688namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000689class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000690public:
Eli Friedmane4277982008-08-20 23:11:40 +0000691 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000692 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000693 IntMaxType = SignedLong;
694 UIntMaxType = UnsignedLong;
695 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000696 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 +0000697 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerf291b102008-05-09 06:17:04 +0000698 }
Eli Friedmane4277982008-08-20 23:11:40 +0000699};
700} // end anonymous namespace.
701
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000702
703namespace {
704class DarwinPPCTargetInfo :
705 public DarwinTargetInfo<PPCTargetInfo> {
706public:
707 DarwinPPCTargetInfo(const std::string& triple)
708 : DarwinTargetInfo<PPCTargetInfo>(triple) {
709 HasAlignMac68kSupport = true;
710 }
711};
712
713class DarwinPPC64TargetInfo :
714 public DarwinTargetInfo<PPC64TargetInfo> {
715public:
716 DarwinPPC64TargetInfo(const std::string& triple)
717 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
718 HasAlignMac68kSupport = true;
719 }
720};
721} // end anonymous namespace.
722
Reid Spencer5f016e22007-07-11 17:01:13 +0000723namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +0000724// MBlaze abstract base class
725class MBlazeTargetInfo : public TargetInfo {
726 static const char * const GCCRegNames[];
727 static const TargetInfo::GCCRegAlias GCCRegAliases[];
728
729public:
730 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
731 DescriptionString = "E-p:32:32-i8:8:8-i16:16:16-i64:32:32-f64:32:32-"
732 "v64:32:32-v128:32:32-n32";
733 }
734
735 virtual void getTargetBuiltins(const Builtin::Info *&Records,
736 unsigned &NumRecords) const {
737 // FIXME: Implement.
738 Records = 0;
739 NumRecords = 0;
740 }
741
742 virtual void getTargetDefines(const LangOptions &Opts,
743 MacroBuilder &Builder) const;
744
745 virtual const char *getVAListDeclaration() const {
746 return "typedef char* __builtin_va_list;";
747 }
748 virtual const char *getTargetPrefix() const {
749 return "mblaze";
750 }
751 virtual void getGCCRegNames(const char * const *&Names,
752 unsigned &NumNames) const;
753 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
754 unsigned &NumAliases) const;
755 virtual bool validateAsmConstraint(const char *&Name,
756 TargetInfo::ConstraintInfo &Info) const {
757 switch (*Name) {
758 default: return false;
759 case 'O': // Zero
760 return true;
761 case 'b': // Base register
762 case 'f': // Floating point register
763 Info.setAllowsRegister();
764 return true;
765 }
766 }
767 virtual const char *getClobbers() const {
768 return "";
769 }
770};
771
772/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
773/// #defines that are not tied to a specific subtarget.
774void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
775 MacroBuilder &Builder) const {
776 // Target identification.
777 Builder.defineMacro("__microblaze__");
778 Builder.defineMacro("_ARCH_MICROBLAZE");
779 Builder.defineMacro("__MICROBLAZE__");
780
781 // Target properties.
782 Builder.defineMacro("_BIG_ENDIAN");
783 Builder.defineMacro("__BIG_ENDIAN__");
784
785 // Subtarget options.
786 Builder.defineMacro("__REGISTER_PREFIX__", "");
787}
788
789
790const char * const MBlazeTargetInfo::GCCRegNames[] = {
791 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
792 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
793 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
794 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
795 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
796 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
797 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
798 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
799 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
800 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
801};
802
803void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
804 unsigned &NumNames) const {
805 Names = GCCRegNames;
806 NumNames = llvm::array_lengthof(GCCRegNames);
807}
808
809const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
810 { {"f0"}, "r0" },
811 { {"f1"}, "r1" },
812 { {"f2"}, "r2" },
813 { {"f3"}, "r3" },
814 { {"f4"}, "r4" },
815 { {"f5"}, "r5" },
816 { {"f6"}, "r6" },
817 { {"f7"}, "r7" },
818 { {"f8"}, "r8" },
819 { {"f9"}, "r9" },
820 { {"f10"}, "r10" },
821 { {"f11"}, "r11" },
822 { {"f12"}, "r12" },
823 { {"f13"}, "r13" },
824 { {"f14"}, "r14" },
825 { {"f15"}, "r15" },
826 { {"f16"}, "r16" },
827 { {"f17"}, "r17" },
828 { {"f18"}, "r18" },
829 { {"f19"}, "r19" },
830 { {"f20"}, "r20" },
831 { {"f21"}, "r21" },
832 { {"f22"}, "r22" },
833 { {"f23"}, "r23" },
834 { {"f24"}, "r24" },
835 { {"f25"}, "r25" },
836 { {"f26"}, "r26" },
837 { {"f27"}, "r27" },
838 { {"f28"}, "r28" },
839 { {"f29"}, "r29" },
840 { {"f30"}, "r30" },
841 { {"f31"}, "r31" },
842};
843
844void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
845 unsigned &NumAliases) const {
846 Aliases = GCCRegAliases;
847 NumAliases = llvm::array_lengthof(GCCRegAliases);
848}
849} // end anonymous namespace.
850
851namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000852// Namespace for x86 abstract base class
853const Builtin::Info BuiltinInfo[] = {
Douglas Gregorb1152d82009-02-16 21:58:21 +0000854#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
855#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000856#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +0000857};
Eli Friedman61538a72008-05-20 14:21:01 +0000858
Nuno Lopes2550d702009-12-23 17:49:57 +0000859static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +0000860 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
861 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
862 "argp", "flags", "fspr", "dirflag", "frame",
863 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
864 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
865 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
866 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
867};
868
869const TargetInfo::GCCRegAlias GCCRegAliases[] = {
870 { { "al", "ah", "eax", "rax" }, "ax" },
871 { { "bl", "bh", "ebx", "rbx" }, "bx" },
872 { { "cl", "ch", "ecx", "rcx" }, "cx" },
873 { { "dl", "dh", "edx", "rdx" }, "dx" },
874 { { "esi", "rsi" }, "si" },
875 { { "edi", "rdi" }, "di" },
876 { { "esp", "rsp" }, "sp" },
877 { { "ebp", "rbp" }, "bp" },
878};
879
880// X86 target abstract base class; x86-32 and x86-64 are very close, so
881// most of the implementation can be shared.
882class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +0000883 enum X86SSEEnum {
884 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
885 } SSELevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +0000886 enum AMD3DNowEnum {
887 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
888 } AMD3DNowLevel;
889
Eric Christophereea12d12010-04-02 23:50:19 +0000890 bool HasAES;
891
Eli Friedman618234a2008-08-20 02:34:37 +0000892public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000893 X86TargetInfo(const std::string& triple)
Eric Christophereea12d12010-04-02 23:50:19 +0000894 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
895 HasAES(false) {
Eli Friedman618234a2008-08-20 02:34:37 +0000896 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +0000897 }
898 virtual void getTargetBuiltins(const Builtin::Info *&Records,
899 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +0000900 Records = BuiltinInfo;
901 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000902 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000903 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +0000904 unsigned &NumNames) const {
905 Names = GCCRegNames;
906 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +0000907 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000908 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +0000909 unsigned &NumAliases) const {
Eli Friedman618234a2008-08-20 02:34:37 +0000910 Aliases = GCCRegAliases;
911 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000912 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000913 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +0000914 TargetInfo::ConstraintInfo &info) const;
915 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000916 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +0000917 return "~{dirflag},~{fpsr},~{flags}";
918 }
Chris Lattner33328642009-03-20 15:52:06 +0000919 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000920 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +0000921 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
922 const std::string &Name,
923 bool Enabled) const;
Mike Stump1eb44332009-09-09 15:08:12 +0000924 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +0000925 llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +0000926 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Reid Spencer5f016e22007-07-11 17:01:13 +0000927};
Chris Lattner3daed522009-03-02 22:20:04 +0000928
Mike Stump1eb44332009-09-09 15:08:12 +0000929void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +0000930 llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +0000931 // FIXME: This should not be here.
932 Features["3dnow"] = false;
933 Features["3dnowa"] = false;
934 Features["mmx"] = false;
935 Features["sse"] = false;
936 Features["sse2"] = false;
937 Features["sse3"] = false;
938 Features["ssse3"] = false;
939 Features["sse41"] = false;
940 Features["sse42"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +0000941 Features["aes"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000942
Daniel Dunbar868bd0a2009-05-06 03:16:41 +0000943 // LLVM does not currently recognize this.
944 // Features["sse4a"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000945
Daniel Dunbar868bd0a2009-05-06 03:16:41 +0000946 // FIXME: This *really* should not be here.
947
948 // X86_64 always has SSE2.
949 if (PointerWidth == 64)
950 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
951
Daniel Dunbar3ac79042009-05-06 21:56:32 +0000952 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
953 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
954 ;
955 else if (CPU == "pentium-mmx" || CPU == "pentium2")
956 setFeatureEnabled(Features, "mmx", true);
957 else if (CPU == "pentium3")
958 setFeatureEnabled(Features, "sse", true);
959 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
960 setFeatureEnabled(Features, "sse2", true);
961 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
962 setFeatureEnabled(Features, "sse3", true);
963 else if (CPU == "core2")
964 setFeatureEnabled(Features, "ssse3", true);
965 else if (CPU == "penryn") {
966 setFeatureEnabled(Features, "sse4", true);
967 Features["sse42"] = false;
968 } else if (CPU == "atom")
969 setFeatureEnabled(Features, "sse3", true);
Eric Christophereea12d12010-04-02 23:50:19 +0000970 else if (CPU == "corei7") {
Daniel Dunbar3ac79042009-05-06 21:56:32 +0000971 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +0000972 setFeatureEnabled(Features, "aes", true);
973 }
Daniel Dunbar3ac79042009-05-06 21:56:32 +0000974 else if (CPU == "k6" || CPU == "winchip-c6")
975 setFeatureEnabled(Features, "mmx", true);
Mike Stump1eb44332009-09-09 15:08:12 +0000976 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbar3ac79042009-05-06 21:56:32 +0000977 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
978 setFeatureEnabled(Features, "mmx", true);
979 setFeatureEnabled(Features, "3dnow", true);
980 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
981 setFeatureEnabled(Features, "sse", true);
982 setFeatureEnabled(Features, "3dnowa", true);
983 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
984 CPU == "athlon-fx") {
Mike Stump1eb44332009-09-09 15:08:12 +0000985 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +0000986 setFeatureEnabled(Features, "3dnowa", true);
987 } else if (CPU == "c3-2")
988 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +0000989}
990
Daniel Dunbar17ca3632009-05-06 21:07:50 +0000991bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +0000992 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +0000993 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +0000994 // FIXME: This *really* should not be here. We need some way of translating
995 // options into llvm subtarget features.
996 if (!Features.count(Name) &&
997 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +0000998 return false;
999
1000 if (Enabled) {
1001 if (Name == "mmx")
1002 Features["mmx"] = true;
1003 else if (Name == "sse")
1004 Features["mmx"] = Features["sse"] = true;
1005 else if (Name == "sse2")
1006 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1007 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001008 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001009 Features["sse3"] = true;
1010 else if (Name == "ssse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001011 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001012 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001013 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump1eb44332009-09-09 15:08:12 +00001014 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001015 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001016 else if (Name == "sse4.1")
1017 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1018 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001019 else if (Name == "3dnow")
1020 Features["3dnowa"] = true;
1021 else if (Name == "3dnowa")
1022 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001023 else if (Name == "aes")
1024 Features["aes"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001025 } else {
1026 if (Name == "mmx")
Mike Stump1eb44332009-09-09 15:08:12 +00001027 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001028 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1029 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001030 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001031 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1032 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001033 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001034 Features["sse41"] = Features["sse42"] = false;
1035 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001036 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001037 Features["sse42"] = false;
1038 else if (Name == "ssse3")
1039 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1040 else if (Name == "sse4")
1041 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001042 else if (Name == "sse4.2")
1043 Features["sse42"] = false;
1044 else if (Name == "sse4.1")
1045 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001046 else if (Name == "3dnow")
1047 Features["3dnow"] = Features["3dnowa"] = false;
1048 else if (Name == "3dnowa")
1049 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001050 else if (Name == "aes")
1051 Features["aes"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001052 }
1053
1054 return true;
1055}
1056
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001057/// HandleTargetOptions - Perform initialization based on the user
1058/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001059void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001060 // Remember the maximum enabled sselevel.
1061 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1062 // Ignore disabled features.
1063 if (Features[i][0] == '-')
1064 continue;
1065
Eric Christophereea12d12010-04-02 23:50:19 +00001066 if (Features[i].substr(1) == "aes") {
1067 HasAES = true;
1068 continue;
1069 }
1070
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001071 assert(Features[i][0] == '+' && "Invalid target feature!");
1072 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1073 .Case("sse42", SSE42)
1074 .Case("sse41", SSE41)
1075 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001076 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001077 .Case("sse2", SSE2)
1078 .Case("sse", SSE1)
1079 .Case("mmx", MMX)
1080 .Default(NoMMXSSE);
1081 SSELevel = std::max(SSELevel, Level);
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001082
1083 AMD3DNowEnum ThreeDNowLevel =
1084 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1085 .Case("3dnowa", AMD3DNowAthlon)
1086 .Case("3dnow", AMD3DNow)
1087 .Default(NoAMD3DNow);
1088
1089 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001090 }
Chris Lattner3daed522009-03-02 22:20:04 +00001091}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001092
1093/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1094/// that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001095void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001096 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001097 // Target identification.
1098 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001099 Builder.defineMacro("_LP64");
1100 Builder.defineMacro("__LP64__");
1101 Builder.defineMacro("__amd64__");
1102 Builder.defineMacro("__amd64");
1103 Builder.defineMacro("__x86_64");
1104 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001105 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001106 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001107 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001108
Eric Christophereea12d12010-04-02 23:50:19 +00001109 if (HasAES)
1110 Builder.defineMacro("__AES__");
1111
Chris Lattnerc0f59212009-03-02 22:27:17 +00001112 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001113 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001114
Chris Lattnerc0f59212009-03-02 22:27:17 +00001115 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +00001116 Builder.defineMacro("__nocona");
1117 Builder.defineMacro("__nocona__");
1118 Builder.defineMacro("__tune_nocona__");
1119 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001120
Chris Lattner54175442009-04-19 17:32:33 +00001121 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1122 // functions in glibc header files that use FP Stack inline asm which the
1123 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001124 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001125
Chris Lattner84f0ea82009-03-02 22:40:39 +00001126 // Each case falls through to the previous one here.
1127 switch (SSELevel) {
1128 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00001129 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001130 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00001131 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001132 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001133 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001134 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001135 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001136 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00001137 Builder.defineMacro("__SSE2__");
1138 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001139 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00001140 Builder.defineMacro("__SSE__");
1141 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001142 case MMX:
Benjamin Kramera9992772010-01-09 17:55:51 +00001143 Builder.defineMacro("__MMX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001144 case NoMMXSSE:
1145 break;
1146 }
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001147
1148 // Each case falls through to the previous one here.
1149 switch (AMD3DNowLevel) {
1150 case AMD3DNowAthlon:
1151 Builder.defineMacro("__3dNOW_A__");
1152 case AMD3DNow:
1153 Builder.defineMacro("__3dNOW__");
1154 case NoAMD3DNow:
1155 break;
1156 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00001157}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001158
1159
Eli Friedman618234a2008-08-20 02:34:37 +00001160bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001161X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001162 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001163 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00001164 default: return false;
1165 case 'a': // eax.
1166 case 'b': // ebx.
1167 case 'c': // ecx.
1168 case 'd': // edx.
1169 case 'S': // esi.
1170 case 'D': // edi.
1171 case 'A': // edx:eax.
1172 case 't': // top of floating point stack.
1173 case 'u': // second from top of floating point stack.
1174 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00001175 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00001176 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00001177 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001178 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001179 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001180 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001181 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00001182 case 'N': // unsigned 8-bit integer constant for use with in and out
1183 // instructions.
Eli Friedman12b2da02009-06-08 20:45:44 +00001184 case 'R': // "legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
Chris Lattner44def072009-04-26 07:16:29 +00001185 Info.setAllowsRegister();
Eli Friedman618234a2008-08-20 02:34:37 +00001186 return true;
1187 }
1188}
1189
1190std::string
1191X86TargetInfo::convertConstraint(const char Constraint) const {
1192 switch (Constraint) {
1193 case 'a': return std::string("{ax}");
1194 case 'b': return std::string("{bx}");
1195 case 'c': return std::string("{cx}");
1196 case 'd': return std::string("{dx}");
1197 case 'S': return std::string("{si}");
1198 case 'D': return std::string("{di}");
1199 case 't': // top of floating point stack.
1200 return std::string("{st}");
1201 case 'u': // second from top of floating point stack.
1202 return std::string("{st(1)}"); // second from top of floating point stack.
1203 default:
1204 return std::string(1, Constraint);
1205 }
1206}
Eli Friedman618234a2008-08-20 02:34:37 +00001207} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00001208
1209namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001210// X86-32 generic target
1211class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001212public:
Eli Friedman618234a2008-08-20 02:34:37 +00001213 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1214 DoubleAlign = LongLongAlign = 32;
1215 LongDoubleWidth = 96;
1216 LongDoubleAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001217 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1218 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001219 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman1afabd92009-03-29 20:31:09 +00001220 SizeType = UnsignedInt;
1221 PtrDiffType = SignedInt;
1222 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001223 RegParmMax = 3;
Eli Friedman618234a2008-08-20 02:34:37 +00001224 }
1225 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001226 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00001227 }
Chris Lattner21fb98e2009-09-23 06:06:36 +00001228
1229 int getEHDataRegisterNumber(unsigned RegNo) const {
1230 if (RegNo == 0) return 0;
1231 if (RegNo == 1) return 2;
1232 return -1;
1233 }
Eli Friedman618234a2008-08-20 02:34:37 +00001234};
1235} // end anonymous namespace
1236
1237namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00001238class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1239public:
1240 OpenBSDI386TargetInfo(const std::string& triple) :
1241 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1242 SizeType = UnsignedLong;
1243 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00001244 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00001245 }
1246};
1247} // end anonymous namespace
1248
1249namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00001250class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00001251public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00001252 DarwinI386TargetInfo(const std::string& triple) :
1253 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00001254 LongDoubleWidth = 128;
1255 LongDoubleAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00001256 SizeType = UnsignedLong;
1257 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001258 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1259 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001260 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbar613fd672010-05-27 00:35:16 +00001261 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00001262 }
1263
Eli Friedman618234a2008-08-20 02:34:37 +00001264};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001265} // end anonymous namespace
1266
1267namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00001268// x86-32 Windows target
1269class WindowsX86_32TargetInfo : public X86_32TargetInfo {
1270public:
1271 WindowsX86_32TargetInfo(const std::string& triple)
1272 : X86_32TargetInfo(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00001273 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00001274 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00001275 DoubleAlign = LongLongAlign = 64;
1276 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 +00001277 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1278 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedman29a30502008-08-21 01:40:19 +00001279 }
Chris Lattner33328642009-03-20 15:52:06 +00001280 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001281 MacroBuilder &Builder) const {
1282 X86_32TargetInfo::getTargetDefines(Opts, Builder);
Eli Friedman29a30502008-08-21 01:40:19 +00001283 // This list is based off of the the list of things MingW defines
Benjamin Kramera9992772010-01-09 17:55:51 +00001284 Builder.defineMacro("_WIN32");
1285 DefineStd(Builder, "WIN32", Opts);
1286 DefineStd(Builder, "WINNT", Opts);
1287 Builder.defineMacro("_X86_");
Eli Friedman29a30502008-08-21 01:40:19 +00001288 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001289};
1290} // end anonymous namespace
Eli Friedmanabc4e322009-06-08 06:11:14 +00001291
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001292namespace {
1293
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001294// x86-32 Windows Visual Studio target
1295class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1296public:
1297 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1298 : WindowsX86_32TargetInfo(triple) {
1299 }
1300 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001301 MacroBuilder &Builder) const {
1302 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001303 // The value of the following reflects processor type.
1304 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1305 // We lost the original triple, so we use the default.
Benjamin Kramera9992772010-01-09 17:55:51 +00001306 Builder.defineMacro("_M_IX86", "600");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001307 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001308};
1309} // end anonymous namespace
1310
1311namespace {
1312// x86-32 MinGW target
1313class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1314public:
1315 MinGWX86_32TargetInfo(const std::string& triple)
1316 : WindowsX86_32TargetInfo(triple) {
1317 }
1318 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001319 MacroBuilder &Builder) const {
1320 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1321 Builder.defineMacro("__MSVCRT__");
1322 Builder.defineMacro("__MINGW32__");
1323 Builder.defineMacro("__declspec", "__declspec");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001324 }
1325};
1326} // end anonymous namespace
1327
1328namespace {
1329// x86-32 Cygwin target
1330class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1331public:
1332 CygwinX86_32TargetInfo(const std::string& triple)
1333 : X86_32TargetInfo(triple) {
1334 TLSSupported = false;
1335 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001336 DoubleAlign = LongLongAlign = 64;
1337 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1338 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001339 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001340 }
1341 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001342 MacroBuilder &Builder) const {
1343 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1344 Builder.defineMacro("__CYGWIN__");
1345 Builder.defineMacro("__CYGWIN32__");
1346 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00001347 if (Opts.CPlusPlus)
1348 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00001349 }
Eli Friedman29a30502008-08-21 01:40:19 +00001350};
1351} // end anonymous namespace
1352
1353namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00001354// x86-32 Haiku target
1355class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1356public:
1357 HaikuX86_32TargetInfo(const std::string& triple)
1358 : X86_32TargetInfo(triple) {
1359 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00001360 IntPtrType = SignedLong;
1361 PtrDiffType = SignedLong;
Chris Lattner86ed3a32010-04-11 19:29:39 +00001362 }
1363 virtual void getTargetDefines(const LangOptions &Opts,
1364 MacroBuilder &Builder) const {
1365 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1366 Builder.defineMacro("__INTEL__");
1367 Builder.defineMacro("__HAIKU__");
1368 }
1369};
1370} // end anonymous namespace
1371
1372namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001373// x86-64 generic target
1374class X86_64TargetInfo : public X86TargetInfo {
1375public:
Chris Lattner33328642009-03-20 15:52:06 +00001376 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001377 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00001378 LongDoubleWidth = 128;
1379 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00001380 LargeArrayMinWidth = 128;
1381 LargeArrayAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00001382 IntMaxType = SignedLong;
1383 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001384 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001385 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00001386
Eli Friedmaned855cb2008-08-21 00:13:15 +00001387 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1388 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001389 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Reid Spencer5f016e22007-07-11 17:01:13 +00001390 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001391 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001392 return "typedef struct __va_list_tag {"
1393 " unsigned gp_offset;"
1394 " unsigned fp_offset;"
1395 " void* overflow_arg_area;"
1396 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00001397 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00001398 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00001399 }
Chris Lattner21fb98e2009-09-23 06:06:36 +00001400
1401 int getEHDataRegisterNumber(unsigned RegNo) const {
1402 if (RegNo == 0) return 0;
1403 if (RegNo == 1) return 1;
1404 return -1;
1405 }
Eli Friedman618234a2008-08-20 02:34:37 +00001406};
1407} // end anonymous namespace
1408
1409namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001410// x86-64 Windows target
1411class WindowsX86_64TargetInfo : public X86_64TargetInfo {
1412public:
1413 WindowsX86_64TargetInfo(const std::string& triple)
1414 : X86_64TargetInfo(triple) {
1415 TLSSupported = false;
1416 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00001417 LongWidth = LongAlign = 32;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001418 DoubleAlign = LongLongAlign = 64;
1419 }
1420 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001421 MacroBuilder &Builder) const {
1422 X86_64TargetInfo::getTargetDefines(Opts, Builder);
1423 Builder.defineMacro("_WIN64");
1424 DefineStd(Builder, "WIN64", Opts);
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001425 }
1426};
1427} // end anonymous namespace
1428
1429namespace {
1430// x86-64 Windows Visual Studio target
1431class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1432public:
1433 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1434 : WindowsX86_64TargetInfo(triple) {
1435 }
1436 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001437 MacroBuilder &Builder) const {
1438 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1439 Builder.defineMacro("_M_X64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001440 }
1441 virtual const char *getVAListDeclaration() const {
1442 return "typedef char* va_list;";
1443 }
1444};
1445} // end anonymous namespace
1446
1447namespace {
1448// x86-64 MinGW target
1449class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1450public:
1451 MinGWX86_64TargetInfo(const std::string& triple)
1452 : WindowsX86_64TargetInfo(triple) {
1453 }
1454 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001455 MacroBuilder &Builder) const {
1456 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1457 Builder.defineMacro("__MSVCRT__");
1458 Builder.defineMacro("__MINGW64__");
1459 Builder.defineMacro("__declspec");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001460 }
1461};
1462} // end anonymous namespace
1463
1464namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001465class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1466public:
Mike Stump1eb44332009-09-09 15:08:12 +00001467 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001468 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1469 Int64Type = SignedLongLong;
1470 }
1471};
1472} // end anonymous namespace
1473
1474namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00001475class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1476public:
Mike Stump1eb44332009-09-09 15:08:12 +00001477 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00001478 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1479 IntMaxType = SignedLongLong;
1480 UIntMaxType = UnsignedLongLong;
1481 Int64Type = SignedLongLong;
1482 }
1483};
1484} // end anonymous namespace
1485
1486namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00001487class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001488 // Possible FPU choices.
1489 enum FPUMode {
1490 NoFPU,
1491 VFP2FPU,
1492 VFP3FPU,
1493 NeonFPU
1494 };
1495
1496 static bool FPUModeIsVFP(FPUMode Mode) {
1497 return Mode >= VFP2FPU && Mode <= NeonFPU;
1498 }
1499
1500 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1501 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001502
Daniel Dunbareac7c532009-12-18 18:42:37 +00001503 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001504
1505 unsigned FPU : 3;
1506
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001507 unsigned IsThumb : 1;
1508
1509 // Initialized via features.
1510 unsigned SoftFloat : 1;
1511 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001512
Chris Lattner2752c012010-03-03 19:03:45 +00001513 static const Builtin::Info BuiltinInfo[];
1514
Chris Lattner393ff042008-04-21 18:56:49 +00001515public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001516 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00001517 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001518 {
Daniel Dunbara2a41612009-09-14 00:02:24 +00001519 SizeType = UnsignedInt;
1520 PtrDiffType = SignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001521
Chris Lattner9bffb072010-04-23 16:29:58 +00001522 // {} in inline assembly are neon specifiers, not assembly variant
1523 // specifiers.
1524 NoAsmVariants = true;
1525
Daniel Dunbareac7c532009-12-18 18:42:37 +00001526 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00001527 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001528 if (IsThumb) {
1529 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1530 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner1932e122009-11-07 18:59:41 +00001531 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001532 } else {
1533 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1534 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner1932e122009-11-07 18:59:41 +00001535 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001536 }
Eli Friedman61538a72008-05-20 14:21:01 +00001537 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001538 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00001539 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001540 ABI = Name;
1541
Daniel Dunbara2a41612009-09-14 00:02:24 +00001542 // The defaults (above) are for AAPCS, check if we need to change them.
1543 //
1544 // FIXME: We need support for -meabi... we could just mangle it into the
1545 // name.
1546 if (Name == "apcs-gnu") {
Daniel Dunbard410fa22010-01-27 20:23:08 +00001547 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00001548 SizeType = UnsignedLong;
1549
Daniel Dunbar684de632010-04-22 16:14:54 +00001550 // Do not respect the alignment of bit-field types when laying out
1551 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1552 UseBitFieldTypeAlignment = false;
1553
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001554 if (IsThumb) {
1555 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1556 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001557 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001558 } else {
1559 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1560 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001561 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001562 }
1563
Daniel Dunbara2a41612009-09-14 00:02:24 +00001564 // FIXME: Override "preferred align" for double and long long.
1565 } else if (Name == "aapcs") {
1566 // FIXME: Enumerated types are variable width in straight AAPCS.
1567 } else if (Name == "aapcs-linux") {
1568 ;
1569 } else
1570 return false;
1571
1572 return true;
1573 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001574
Daniel Dunbara91320b2009-12-21 23:28:17 +00001575 void getDefaultFeatures(const std::string &CPU,
1576 llvm::StringMap<bool> &Features) const {
1577 // FIXME: This should not be here.
1578 Features["vfp2"] = false;
1579 Features["vfp3"] = false;
1580 Features["neon"] = false;
1581
1582 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1583 Features["vfp2"] = true;
1584 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1585 Features["neon"] = true;
1586 }
1587
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001588 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1589 const std::string &Name,
1590 bool Enabled) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001591 if (Name == "soft-float" || Name == "soft-float-abi") {
1592 Features[Name] = Enabled;
1593 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1594 // These effectively are a single option, reset them when any is enabled.
1595 if (Enabled)
1596 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1597 Features[Name] = Enabled;
1598 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001599 return false;
1600
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001601 return true;
1602 }
1603
1604 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001605 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001606 SoftFloat = SoftFloatABI = false;
1607 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1608 if (Features[i] == "+soft-float")
1609 SoftFloat = true;
1610 else if (Features[i] == "+soft-float-abi")
1611 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001612 else if (Features[i] == "+vfp2")
1613 FPU = VFP2FPU;
1614 else if (Features[i] == "+vfp3")
1615 FPU = VFP3FPU;
1616 else if (Features[i] == "+neon")
1617 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001618 }
1619
1620 // Remove front-end specific options which the backend handles differently.
1621 std::vector<std::string>::iterator it;
1622 it = std::find(Features.begin(), Features.end(), "+soft-float");
1623 if (it != Features.end())
1624 Features.erase(it);
1625 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1626 if (it != Features.end())
1627 Features.erase(it);
1628 }
1629
Daniel Dunbareac7c532009-12-18 18:42:37 +00001630 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1631 return llvm::StringSwitch<const char*>(Name)
1632 .Cases("arm8", "arm810", "4")
1633 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1634 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1635 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1636 .Case("ep9312", "4T")
1637 .Cases("arm10tdmi", "arm1020t", "5T")
1638 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1639 .Case("arm926ej-s", "5TEJ")
1640 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1641 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001642 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001643 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001644 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001645 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1646 .Cases("cortex-a8", "cortex-a9", "7A")
1647 .Default(0);
1648 }
1649 virtual bool setCPU(const std::string &Name) {
1650 if (!getCPUDefineSuffix(Name))
1651 return false;
1652
1653 CPU = Name;
1654 return true;
1655 }
Chris Lattner33328642009-03-20 15:52:06 +00001656 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001657 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001658 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00001659 Builder.defineMacro("__arm");
1660 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001661
Chris Lattnerc0f59212009-03-02 22:27:17 +00001662 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001663 Builder.defineMacro("__ARMEL__");
1664 Builder.defineMacro("__LITTLE_ENDIAN__");
1665 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001666
1667 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00001668 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001669
Mike Stump437bb4b2009-04-08 02:07:04 +00001670 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001671
Daniel Dunbareac7c532009-12-18 18:42:37 +00001672 // FIXME: It's more complicated than this and we don't really support
1673 // interworking.
1674 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00001675 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001676
Daniel Dunbareac7c532009-12-18 18:42:37 +00001677 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00001678 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001679
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001680 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00001681 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001682
1683 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00001684 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001685
Daniel Dunbara91320b2009-12-21 23:28:17 +00001686 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001687 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001688 Builder.defineMacro("__THUMBEL__");
1689 Builder.defineMacro("__thumb__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001690 if (IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00001691 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001692 }
1693
1694 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00001695 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001696
1697 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00001698 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001699
1700 // This only gets set when Neon instructions are actually available, unlike
1701 // the VFP define, hence the soft float and arch check. This is subtly
1702 // different from gcc, we follow the intent which was that it should be set
1703 // when Neon instructions are actually available.
1704 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00001705 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00001706 }
1707 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1708 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00001709 Records = BuiltinInfo;
1710 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00001711 }
1712 virtual const char *getVAListDeclaration() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001713 return "typedef char* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00001714 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001715 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001716 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001717 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001718 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001719 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001720 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001721 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001722 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00001723 default:
Nate Begemanad487f42008-04-22 05:03:19 +00001724 case 'l': // r0-r7
1725 case 'h': // r8-r15
1726 case 'w': // VFP Floating point register single precision
1727 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00001728 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00001729 return true;
1730 }
Chris Lattner393ff042008-04-21 18:56:49 +00001731 return false;
1732 }
1733 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001734 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00001735 return "";
1736 }
1737};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001738
1739const char * const ARMTargetInfo::GCCRegNames[] = {
1740 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1741 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1742};
1743
1744void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
1745 unsigned &NumNames) const {
1746 Names = GCCRegNames;
1747 NumNames = llvm::array_lengthof(GCCRegNames);
1748}
1749
1750const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
1751
1752 { { "a1" }, "r0" },
1753 { { "a2" }, "r1" },
1754 { { "a3" }, "r2" },
1755 { { "a4" }, "r3" },
1756 { { "v1" }, "r4" },
1757 { { "v2" }, "r5" },
1758 { { "v3" }, "r6" },
1759 { { "v4" }, "r7" },
1760 { { "v5" }, "r8" },
1761 { { "v6", "rfp" }, "r9" },
1762 { { "sl" }, "r10" },
1763 { { "fp" }, "r11" },
1764 { { "ip" }, "r12" },
1765 { { "sp" }, "r13" },
1766 { { "lr" }, "r14" },
1767 { { "pc" }, "r15" },
1768};
1769
1770void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1771 unsigned &NumAliases) const {
1772 Aliases = GCCRegAliases;
1773 NumAliases = llvm::array_lengthof(GCCRegAliases);
1774}
Chris Lattner2752c012010-03-03 19:03:45 +00001775
1776const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
1777#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
1778#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
1779#include "clang/Basic/BuiltinsARM.def"
1780};
Chris Lattner393ff042008-04-21 18:56:49 +00001781} // end anonymous namespace.
1782
Eli Friedmana9f54962008-08-20 07:44:10 +00001783
1784namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00001785class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00001786 public DarwinTargetInfo<ARMTargetInfo> {
1787protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00001788 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00001789 MacroBuilder &Builder) const {
Daniel Dunbar21ae3192010-01-26 01:44:04 +00001790 getDarwinDefines(Builder, Opts, Triple);
Eli Friedmanb030f022009-04-19 21:38:35 +00001791 }
Eli Friedmana9f54962008-08-20 07:44:10 +00001792
Torok Edwin5f6c1942009-06-30 17:10:35 +00001793public:
Mike Stump1eb44332009-09-09 15:08:12 +00001794 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00001795 : DarwinTargetInfo<ARMTargetInfo>(triple) {
1796 HasAlignMac68kSupport = true;
1797 }
Eli Friedmana9f54962008-08-20 07:44:10 +00001798};
1799} // end anonymous namespace.
1800
Reid Spencer5f016e22007-07-11 17:01:13 +00001801namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00001802class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00001803 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1804 static const char * const GCCRegNames[];
Gabor Greif26658672008-02-21 16:29:08 +00001805public:
Eli Friedman01b86682008-08-20 07:28:14 +00001806 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
1807 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00001808 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 +00001809 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00001810 }
Chris Lattner33328642009-03-20 15:52:06 +00001811 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001812 MacroBuilder &Builder) const {
1813 DefineStd(Builder, "sparc", Opts);
1814 Builder.defineMacro("__sparcv8");
1815 Builder.defineMacro("__REGISTER_PREFIX__", "");
Gabor Greif26658672008-02-21 16:29:08 +00001816 }
1817 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1818 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00001819 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00001820 }
1821 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001822 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00001823 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001824 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00001825 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001826 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00001827 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001828 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00001829 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00001830 // FIXME: Implement!
1831 return false;
Gabor Greif26658672008-02-21 16:29:08 +00001832 }
1833 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001834 // FIXME: Implement!
1835 return "";
Gabor Greif26658672008-02-21 16:29:08 +00001836 }
1837};
1838
Chris Lattnere957f532009-01-27 01:58:38 +00001839const char * const SparcV8TargetInfo::GCCRegNames[] = {
1840 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1841 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1842 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1843 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
1844};
1845
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001846void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00001847 unsigned &NumNames) const {
1848 Names = GCCRegNames;
1849 NumNames = llvm::array_lengthof(GCCRegNames);
1850}
1851
1852const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001853 { { "g0" }, "r0" },
1854 { { "g1" }, "r1" },
1855 { { "g2" }, "r2" },
1856 { { "g3" }, "r3" },
1857 { { "g4" }, "r4" },
1858 { { "g5" }, "r5" },
1859 { { "g6" }, "r6" },
1860 { { "g7" }, "r7" },
1861 { { "o0" }, "r8" },
1862 { { "o1" }, "r9" },
1863 { { "o2" }, "r10" },
1864 { { "o3" }, "r11" },
1865 { { "o4" }, "r12" },
1866 { { "o5" }, "r13" },
1867 { { "o6", "sp" }, "r14" },
1868 { { "o7" }, "r15" },
1869 { { "l0" }, "r16" },
1870 { { "l1" }, "r17" },
1871 { { "l2" }, "r18" },
1872 { { "l3" }, "r19" },
1873 { { "l4" }, "r20" },
1874 { { "l5" }, "r21" },
1875 { { "l6" }, "r22" },
1876 { { "l7" }, "r23" },
1877 { { "i0" }, "r24" },
1878 { { "i1" }, "r25" },
1879 { { "i2" }, "r26" },
1880 { { "i3" }, "r27" },
1881 { { "i4" }, "r28" },
1882 { { "i5" }, "r29" },
1883 { { "i6", "fp" }, "r30" },
1884 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00001885};
1886
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001887void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00001888 unsigned &NumAliases) const {
1889 Aliases = GCCRegAliases;
1890 NumAliases = llvm::array_lengthof(GCCRegAliases);
1891}
Gabor Greif26658672008-02-21 16:29:08 +00001892} // end anonymous namespace.
1893
Eli Friedman01b86682008-08-20 07:28:14 +00001894namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00001895class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
1896public:
1897 AuroraUXSparcV8TargetInfo(const std::string& triple) :
1898 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
1899 SizeType = UnsignedInt;
1900 PtrDiffType = SignedInt;
1901 }
1902};
Torok Edwin5f6c1942009-06-30 17:10:35 +00001903class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00001904public:
1905 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00001906 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00001907 SizeType = UnsignedInt;
1908 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00001909 }
1910};
1911} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00001912
Chris Lattner2621fd12008-05-08 05:58:21 +00001913namespace {
1914 class PIC16TargetInfo : public TargetInfo{
1915 public:
1916 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00001917 TLSSupported = false;
Sanjiv Gupta31fc07d2008-10-31 09:52:39 +00001918 IntWidth = 16;
1919 LongWidth = LongLongWidth = 32;
1920 PointerWidth = 16;
1921 IntAlign = 8;
1922 LongAlign = LongLongAlign = 8;
Eli Friedman61538a72008-05-20 14:21:01 +00001923 PointerAlign = 8;
Sanjiv Gupta31fc07d2008-10-31 09:52:39 +00001924 SizeType = UnsignedInt;
1925 IntMaxType = SignedLong;
1926 UIntMaxType = UnsignedLong;
Chris Lattner6ad474f2009-02-13 22:28:55 +00001927 IntPtrType = SignedShort;
Eli Friedmanf509d732008-11-02 02:43:55 +00001928 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00001929 SigAtomicType = SignedLong;
Sanjiv Gupta9eb4cef2009-06-02 04:43:46 +00001930 FloatWidth = 32;
1931 FloatAlign = 32;
1932 DoubleWidth = 32;
1933 DoubleAlign = 32;
1934 LongDoubleWidth = 32;
1935 LongDoubleAlign = 32;
1936 FloatFormat = &llvm::APFloat::IEEEsingle;
1937 DoubleFormat = &llvm::APFloat::IEEEsingle;
1938 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner1932e122009-11-07 18:59:41 +00001939 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8-f32:32:32-n8";
Sanjiv Gupta9eb4cef2009-06-02 04:43:46 +00001940
Chris Lattner2621fd12008-05-08 05:58:21 +00001941 }
Chris Lattner927686f2008-05-09 06:08:39 +00001942 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
1943 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner33328642009-03-20 15:52:06 +00001944 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001945 MacroBuilder &Builder) const {
1946 Builder.defineMacro("__pic16");
Sanjiv Guptafcd302b2010-02-16 03:37:11 +00001947 Builder.defineMacro("__PIC16");
Benjamin Kramera9992772010-01-09 17:55:51 +00001948 Builder.defineMacro("rom", "__attribute__((address_space(1)))");
1949 Builder.defineMacro("ram", "__attribute__((address_space(0)))");
Sanjiv Guptafcd302b2010-02-16 03:37:11 +00001950 Builder.defineMacro("__section(SectName)",
Sanjiv Guptada3e03e2009-08-20 17:48:52 +00001951 "__attribute__((section(SectName)))");
Benjamin Kramera9992772010-01-09 17:55:51 +00001952 Builder.defineMacro("near",
Sanjiv Gupta7de70092009-10-24 18:08:20 +00001953 "__attribute__((section(\"Address=NEAR\")))");
Sanjiv Guptafcd302b2010-02-16 03:37:11 +00001954 Builder.defineMacro("__address(Addr)",
Sanjiv Guptada3e03e2009-08-20 17:48:52 +00001955 "__attribute__((section(\"Address=\"#Addr)))");
Sanjiv Guptafcd302b2010-02-16 03:37:11 +00001956 Builder.defineMacro("__config(conf)", "asm(\"CONFIG \"#conf)");
1957 Builder.defineMacro("__idlocs(value)", "asm(\"__IDLOCS \"#value)");
1958 Builder.defineMacro("interrupt",
Sanjiv Guptada3e03e2009-08-20 17:48:52 +00001959 "__attribute__((section(\"interrupt=0x4\"))) \
1960 __attribute__((used))");
Chris Lattner2621fd12008-05-08 05:58:21 +00001961 }
1962 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1963 unsigned &NumRecords) const {}
Mike Stump1eb44332009-09-09 15:08:12 +00001964 virtual const char *getVAListDeclaration() const {
Sanjiv Guptafcd302b2010-02-16 03:37:11 +00001965 return "typedef char* __builtin_va_list;";
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00001966 }
1967 virtual const char *getClobbers() const {
1968 return "";
1969 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001970 virtual void getGCCRegNames(const char * const *&Names,
1971 unsigned &NumNames) const {}
1972 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner2621fd12008-05-08 05:58:21 +00001973 TargetInfo::ConstraintInfo &info) const {
1974 return true;
1975 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001976 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner2621fd12008-05-08 05:58:21 +00001977 unsigned &NumAliases) const {}
1978 virtual bool useGlobalsForAutomaticVariables() const {return true;}
1979 };
1980}
1981
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00001982namespace {
1983 class MSP430TargetInfo : public TargetInfo {
1984 static const char * const GCCRegNames[];
1985 public:
1986 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
1987 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00001988 IntWidth = 16; IntAlign = 16;
1989 LongWidth = 32; LongLongWidth = 64;
1990 LongAlign = LongLongAlign = 16;
1991 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00001992 SizeType = UnsignedInt;
1993 IntMaxType = SignedLong;
1994 UIntMaxType = UnsignedLong;
1995 IntPtrType = SignedShort;
1996 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00001997 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00001998 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00001999 }
2000 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002001 MacroBuilder &Builder) const {
2002 Builder.defineMacro("MSP430");
2003 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002004 // FIXME: defines for different 'flavours' of MCU
2005 }
2006 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2007 unsigned &NumRecords) const {
2008 // FIXME: Implement.
2009 Records = 0;
2010 NumRecords = 0;
2011 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002012 virtual void getGCCRegNames(const char * const *&Names,
2013 unsigned &NumNames) const;
2014 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2015 unsigned &NumAliases) const {
2016 // No aliases.
2017 Aliases = 0;
2018 NumAliases = 0;
2019 }
2020 virtual bool validateAsmConstraint(const char *&Name,
2021 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00002022 // No target constraints for now.
2023 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002024 }
2025 virtual const char *getClobbers() const {
2026 // FIXME: Is this really right?
2027 return "";
2028 }
2029 virtual const char *getVAListDeclaration() const {
2030 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00002031 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002032 }
2033 };
2034
2035 const char * const MSP430TargetInfo::GCCRegNames[] = {
2036 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2037 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2038 };
2039
2040 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2041 unsigned &NumNames) const {
2042 Names = GCCRegNames;
2043 NumNames = llvm::array_lengthof(GCCRegNames);
2044 }
2045}
2046
2047
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002048namespace {
2049 class SystemZTargetInfo : public TargetInfo {
2050 static const char * const GCCRegNames[];
2051 public:
2052 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2053 TLSSupported = false;
2054 IntWidth = IntAlign = 32;
2055 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2056 PointerWidth = PointerAlign = 64;
Chris Lattner1932e122009-11-07 18:59:41 +00002057 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2058 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002059 }
2060 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002061 MacroBuilder &Builder) const {
2062 Builder.defineMacro("__s390__");
2063 Builder.defineMacro("__s390x__");
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002064 }
2065 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2066 unsigned &NumRecords) const {
2067 // FIXME: Implement.
2068 Records = 0;
2069 NumRecords = 0;
2070 }
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002071
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002072 virtual void getGCCRegNames(const char * const *&Names,
2073 unsigned &NumNames) const;
2074 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2075 unsigned &NumAliases) const {
2076 // No aliases.
2077 Aliases = 0;
2078 NumAliases = 0;
2079 }
2080 virtual bool validateAsmConstraint(const char *&Name,
2081 TargetInfo::ConstraintInfo &info) const {
2082 // FIXME: implement
2083 return true;
2084 }
2085 virtual const char *getClobbers() const {
2086 // FIXME: Is this really right?
2087 return "";
2088 }
2089 virtual const char *getVAListDeclaration() const {
2090 // FIXME: implement
2091 return "typedef char* __builtin_va_list;";
2092 }
2093 };
2094
2095 const char * const SystemZTargetInfo::GCCRegNames[] = {
2096 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2097 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2098 };
2099
2100 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2101 unsigned &NumNames) const {
2102 Names = GCCRegNames;
2103 NumNames = llvm::array_lengthof(GCCRegNames);
2104 }
2105}
2106
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002107namespace {
2108 class BlackfinTargetInfo : public TargetInfo {
2109 static const char * const GCCRegNames[];
2110 public:
2111 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2112 TLSSupported = false;
2113 DoubleAlign = 32;
2114 LongLongAlign = 32;
2115 LongDoubleAlign = 32;
Chris Lattner1932e122009-11-07 18:59:41 +00002116 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002117 }
2118
2119 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002120 MacroBuilder &Builder) const {
2121 DefineStd(Builder, "bfin", Opts);
2122 DefineStd(Builder, "BFIN", Opts);
2123 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002124 // FIXME: This one is really dependent on -mcpu
Benjamin Kramera9992772010-01-09 17:55:51 +00002125 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002126 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2127 }
2128
2129 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2130 unsigned &NumRecords) const {
2131 // FIXME: Implement.
2132 Records = 0;
2133 NumRecords = 0;
2134 }
2135
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002136 virtual void getGCCRegNames(const char * const *&Names,
2137 unsigned &NumNames) const;
2138
2139 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2140 unsigned &NumAliases) const {
2141 // No aliases.
2142 Aliases = 0;
2143 NumAliases = 0;
2144 }
2145
2146 virtual bool validateAsmConstraint(const char *&Name,
2147 TargetInfo::ConstraintInfo &Info) const {
2148 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2149 Info.setAllowsRegister();
2150 return true;
2151 }
2152 return false;
2153 }
2154
2155 virtual const char *getClobbers() const {
2156 return "";
2157 }
2158
2159 virtual const char *getVAListDeclaration() const {
2160 return "typedef char* __builtin_va_list;";
2161 }
2162 };
2163
2164 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2165 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2166 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2167 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2168 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2169 "a0", "a1", "cc",
2170 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2171 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2172 };
2173
2174 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2175 unsigned &NumNames) const {
2176 Names = GCCRegNames;
2177 NumNames = llvm::array_lengthof(GCCRegNames);
2178 }
2179}
2180
Eli Friedmanb63decf2009-08-19 20:47:07 +00002181namespace {
2182
Mike Stump1eb44332009-09-09 15:08:12 +00002183 // LLVM and Clang cannot be used directly to output native binaries for
2184 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00002185 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00002186 //
2187 // TCE uses the llvm bitcode as input and uses it for generating customized
2188 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00002189 // publicly available in http://tce.cs.tut.fi
2190
2191 class TCETargetInfo : public TargetInfo{
2192 public:
2193 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2194 TLSSupported = false;
2195 IntWidth = 32;
2196 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00002197 PointerWidth = 32;
2198 IntAlign = 32;
2199 LongAlign = LongLongAlign = 32;
2200 PointerAlign = 32;
2201 SizeType = UnsignedInt;
2202 IntMaxType = SignedLong;
2203 UIntMaxType = UnsignedLong;
2204 IntPtrType = SignedInt;
2205 PtrDiffType = SignedInt;
2206 FloatWidth = 32;
2207 FloatAlign = 32;
2208 DoubleWidth = 32;
2209 DoubleAlign = 32;
2210 LongDoubleWidth = 32;
2211 LongDoubleAlign = 32;
2212 FloatFormat = &llvm::APFloat::IEEEsingle;
2213 DoubleFormat = &llvm::APFloat::IEEEsingle;
2214 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00002215 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2216 "i16:16:32-i32:32:32-i64:32:32-"
2217 "f32:32:32-f64:64:64-v64:64:64-"
2218 "v128:128:128-a0:0:64-n32";
Eli Friedmanb63decf2009-08-19 20:47:07 +00002219 }
2220
2221 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002222 MacroBuilder &Builder) const {
2223 DefineStd(Builder, "tce", Opts);
2224 Builder.defineMacro("__TCE__");
2225 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00002226 }
2227 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2228 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00002229 virtual const char *getClobbers() const {
2230 return "";
2231 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002232 virtual const char *getVAListDeclaration() const {
2233 return "typedef void* __builtin_va_list;";
2234 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002235 virtual void getGCCRegNames(const char * const *&Names,
2236 unsigned &NumNames) const {}
2237 virtual bool validateAsmConstraint(const char *&Name,
2238 TargetInfo::ConstraintInfo &info) const {
2239 return true;
2240 }
2241 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2242 unsigned &NumAliases) const {}
2243 };
2244}
2245
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002246namespace {
2247class MipsTargetInfo : public TargetInfo {
Eric Christophered734732010-03-02 02:41:08 +00002248 std::string ABI, CPU;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002249 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2250 static const char * const GCCRegNames[];
2251public:
Eric Christophered734732010-03-02 02:41:08 +00002252 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002253 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2254 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2255 }
Eric Christophered734732010-03-02 02:41:08 +00002256 virtual const char *getABI() const { return ABI.c_str(); }
2257 virtual bool setABI(const std::string &Name) {
2258
2259 if ((Name == "o32") || (Name == "eabi")) {
2260 ABI = Name;
2261 return true;
2262 } else
2263 return false;
2264 }
2265 virtual bool setCPU(const std::string &Name) {
2266 CPU = Name;
2267 return true;
2268 }
2269 void getDefaultFeatures(const std::string &CPU,
2270 llvm::StringMap<bool> &Features) const {
2271 Features[ABI] = true;
2272 Features[CPU] = true;
2273 }
2274 virtual void getArchDefines(const LangOptions &Opts,
2275 MacroBuilder &Builder) const {
2276 if (ABI == "o32")
2277 Builder.defineMacro("__mips_o32");
2278 else if (ABI == "eabi")
2279 Builder.defineMacro("__mips_eabi");
2280 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002281 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002282 MacroBuilder &Builder) const {
2283 DefineStd(Builder, "mips", Opts);
2284 Builder.defineMacro("_mips");
2285 DefineStd(Builder, "MIPSEB", Opts);
2286 Builder.defineMacro("_MIPSEB");
2287 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002288 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002289 }
2290 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2291 unsigned &NumRecords) const {
2292 // FIXME: Implement!
2293 }
2294 virtual const char *getVAListDeclaration() const {
2295 return "typedef void* __builtin_va_list;";
2296 }
2297 virtual void getGCCRegNames(const char * const *&Names,
2298 unsigned &NumNames) const;
2299 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2300 unsigned &NumAliases) const;
2301 virtual bool validateAsmConstraint(const char *&Name,
2302 TargetInfo::ConstraintInfo &Info) const {
2303 switch (*Name) {
2304 default:
2305 case 'r': // CPU registers.
2306 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2307 case 'y': // Equivalent to "r", backwards compatibility only.
2308 case 'f': // floating-point registers.
2309 Info.setAllowsRegister();
2310 return true;
2311 }
2312 return false;
2313 }
2314
2315 virtual const char *getClobbers() const {
2316 // FIXME: Implement!
2317 return "";
2318 }
2319};
2320
2321const char * const MipsTargetInfo::GCCRegNames[] = {
2322 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
2323 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2324 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2325 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2326 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2327 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2328 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2329 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2330 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2331 "$fcc5","$fcc6","$fcc7"
2332};
2333
2334void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2335 unsigned &NumNames) const {
2336 Names = GCCRegNames;
2337 NumNames = llvm::array_lengthof(GCCRegNames);
2338}
2339
2340const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2341 { { "at" }, "$1" },
2342 { { "v0" }, "$2" },
2343 { { "v1" }, "$3" },
2344 { { "a0" }, "$4" },
2345 { { "a1" }, "$5" },
2346 { { "a2" }, "$6" },
2347 { { "a3" }, "$7" },
2348 { { "t0" }, "$8" },
2349 { { "t1" }, "$9" },
2350 { { "t2" }, "$10" },
2351 { { "t3" }, "$11" },
2352 { { "t4" }, "$12" },
2353 { { "t5" }, "$13" },
2354 { { "t6" }, "$14" },
2355 { { "t7" }, "$15" },
2356 { { "s0" }, "$16" },
2357 { { "s1" }, "$17" },
2358 { { "s2" }, "$18" },
2359 { { "s3" }, "$19" },
2360 { { "s4" }, "$20" },
2361 { { "s5" }, "$21" },
2362 { { "s6" }, "$22" },
2363 { { "s7" }, "$23" },
2364 { { "t8" }, "$24" },
2365 { { "t9" }, "$25" },
2366 { { "k0" }, "$26" },
2367 { { "k1" }, "$27" },
2368 { { "gp" }, "$28" },
2369 { { "sp" }, "$29" },
2370 { { "fp" }, "$30" },
2371 { { "ra" }, "$31" }
2372};
2373
2374void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2375 unsigned &NumAliases) const {
2376 Aliases = GCCRegAliases;
2377 NumAliases = llvm::array_lengthof(GCCRegAliases);
2378}
2379} // end anonymous namespace.
2380
2381namespace {
2382class MipselTargetInfo : public MipsTargetInfo {
2383public:
2384 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2385 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2386 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2387 }
2388
2389 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002390 MacroBuilder &Builder) const;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002391};
2392
2393void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002394 MacroBuilder &Builder) const {
2395 DefineStd(Builder, "mips", Opts);
2396 Builder.defineMacro("_mips");
2397 DefineStd(Builder, "MIPSEL", Opts);
2398 Builder.defineMacro("_MIPSEL");
2399 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002400 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002401}
2402} // end anonymous namespace.
2403
Reid Spencer5f016e22007-07-11 17:01:13 +00002404//===----------------------------------------------------------------------===//
2405// Driver code
2406//===----------------------------------------------------------------------===//
2407
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002408static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002409 llvm::Triple Triple(T);
2410 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00002411
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002412 switch (Triple.getArch()) {
2413 default:
2414 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00002415
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002416 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00002417 case llvm::Triple::thumb:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002418 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00002419 case llvm::Triple::Linux:
2420 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002421 case llvm::Triple::Darwin:
Eli Friedmaned855cb2008-08-21 00:13:15 +00002422 return new DarwinARMTargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002423 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002424 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002425 default:
2426 return new ARMTargetInfo(T);
2427 }
Eli Friedman61538a72008-05-20 14:21:01 +00002428
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002429 case llvm::Triple::bfin:
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002430 return new BlackfinTargetInfo(T);
2431
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002432 case llvm::Triple::msp430:
2433 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00002434
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002435 case llvm::Triple::mips:
2436 if (os == llvm::Triple::Psp)
2437 return new PSPTargetInfo<MipsTargetInfo>(T);
2438 if (os == llvm::Triple::Linux)
2439 return new LinuxTargetInfo<MipsTargetInfo>(T);
2440 return new MipsTargetInfo(T);
2441
2442 case llvm::Triple::mipsel:
2443 if (os == llvm::Triple::Psp)
2444 return new PSPTargetInfo<MipselTargetInfo>(T);
2445 if (os == llvm::Triple::Linux)
2446 return new LinuxTargetInfo<MipselTargetInfo>(T);
2447 return new MipselTargetInfo(T);
2448
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002449 case llvm::Triple::pic16:
2450 return new PIC16TargetInfo(T);
2451
2452 case llvm::Triple::ppc:
2453 if (os == llvm::Triple::Darwin)
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00002454 return new DarwinPPCTargetInfo(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002455 else if (os == llvm::Triple::FreeBSD)
2456 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002457 return new PPC32TargetInfo(T);
2458
2459 case llvm::Triple::ppc64:
2460 if (os == llvm::Triple::Darwin)
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00002461 return new DarwinPPC64TargetInfo(T);
John Thompson3f6918a2009-11-19 17:18:50 +00002462 else if (os == llvm::Triple::Lv2)
2463 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002464 else if (os == llvm::Triple::FreeBSD)
2465 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002466 return new PPC64TargetInfo(T);
2467
Chris Lattner9cbeb632010-03-06 21:21:27 +00002468 case llvm::Triple::mblaze:
2469 return new MBlazeTargetInfo(T);
2470
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002471 case llvm::Triple::sparc:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002472 if (os == llvm::Triple::AuroraUX)
2473 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002474 if (os == llvm::Triple::Solaris)
2475 return new SolarisSparcV8TargetInfo(T);
2476 return new SparcV8TargetInfo(T);
2477
John Thompson3f6918a2009-11-19 17:18:50 +00002478 // FIXME: Need a real SPU target.
2479 case llvm::Triple::cellspu:
2480 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2481
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002482 case llvm::Triple::systemz:
2483 return new SystemZTargetInfo(T);
2484
Eli Friedmanb63decf2009-08-19 20:47:07 +00002485 case llvm::Triple::tce:
2486 return new TCETargetInfo(T);
2487
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002488 case llvm::Triple::x86:
2489 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002490 case llvm::Triple::AuroraUX:
2491 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002492 case llvm::Triple::Darwin:
2493 return new DarwinI386TargetInfo(T);
2494 case llvm::Triple::Linux:
2495 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2496 case llvm::Triple::DragonFly:
2497 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2498 case llvm::Triple::NetBSD:
2499 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2500 case llvm::Triple::OpenBSD:
2501 return new OpenBSDI386TargetInfo(T);
2502 case llvm::Triple::FreeBSD:
2503 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
2504 case llvm::Triple::Solaris:
2505 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2506 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002507 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002508 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002509 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002510 case llvm::Triple::Win32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002511 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00002512 case llvm::Triple::Haiku:
2513 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002514 default:
2515 return new X86_32TargetInfo(T);
2516 }
2517
2518 case llvm::Triple::x86_64:
2519 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002520 case llvm::Triple::AuroraUX:
2521 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002522 case llvm::Triple::Darwin:
2523 return new DarwinX86_64TargetInfo(T);
2524 case llvm::Triple::Linux:
2525 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00002526 case llvm::Triple::DragonFly:
2527 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002528 case llvm::Triple::NetBSD:
2529 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2530 case llvm::Triple::OpenBSD:
2531 return new OpenBSDX86_64TargetInfo(T);
2532 case llvm::Triple::FreeBSD:
2533 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2534 case llvm::Triple::Solaris:
2535 return new SolarisTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002536 case llvm::Triple::MinGW64:
2537 return new MinGWX86_64TargetInfo(T);
2538 case llvm::Triple::Win32: // This is what Triple.h supports now.
2539 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002540 default:
2541 return new X86_64TargetInfo(T);
2542 }
2543 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002544}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002545
2546/// CreateTargetInfo - Return the target info object for the specified target
2547/// triple.
2548TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002549 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002550 llvm::Triple Triple(Opts.Triple);
2551
2552 // Construct the target
2553 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2554 if (!Target) {
2555 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2556 return 0;
2557 }
2558
Daniel Dunbareac7c532009-12-18 18:42:37 +00002559 // Set the target CPU if specified.
2560 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2561 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2562 return 0;
2563 }
2564
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002565 // Set the target ABI if specified.
2566 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2567 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2568 return 0;
2569 }
2570
Charles Davis98b7c5c2010-06-11 01:06:47 +00002571 // Set the target C++ ABI.
2572 if (!Target->setCXXABI(Opts.CXXABI)) {
2573 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2574 return 0;
2575 }
2576
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002577 // Compute the default target features, we need the target to handle this
2578 // because features may have dependencies on one another.
2579 llvm::StringMap<bool> Features;
2580 Target->getDefaultFeatures(Opts.CPU, Features);
2581
2582 // Apply the user specified deltas.
2583 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2584 ie = Opts.Features.end(); it != ie; ++it) {
2585 const char *Name = it->c_str();
2586
2587 // Apply the feature via the target.
2588 if ((Name[0] != '-' && Name[0] != '+') ||
2589 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2590 Diags.Report(diag::err_target_invalid_feature) << Name;
2591 return 0;
2592 }
2593 }
2594
2595 // Add the features to the compile options.
2596 //
2597 // FIXME: If we are completely confident that we have the right set, we only
2598 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002599 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002600 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2601 ie = Features.end(); it != ie; ++it)
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002602 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2603 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002604
2605 return Target.take();
2606}