blob: 02b1610b0e3ec7727a55d314ccd842dd65606648 [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikova7c47172009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenekbbced582007-12-12 18:05:32 +000011// target triple.
Reid Spencer5f016e22007-07-11 17:01:13 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer5f016e22007-07-11 17:01:13 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattner8fc4dfb2008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth103b71c2010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman25531262008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar29a790b2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar77659342009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar29a790b2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner4c28b1c2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner797c3c42009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
Dale Johannesen1e592cb2010-10-29 23:24:33 +000029#include "llvm/Type.h"
Benjamin Kramer48725082010-01-09 18:20:57 +000030#include <algorithm>
Reid Spencer5f016e22007-07-11 17:01:13 +000031using namespace clang;
32
Reid Spencer5f016e22007-07-11 17:01:13 +000033//===----------------------------------------------------------------------===//
34// Common code shared among targets.
35//===----------------------------------------------------------------------===//
36
Chris Lattnerca45cff2009-03-20 16:06:38 +000037/// DefineStd - Define a macro name and standard variants. For example if
38/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
39/// when in GNU mode.
Benjamin Kramera9992772010-01-09 17:55:51 +000040static void DefineStd(MacroBuilder &Builder, llvm::StringRef MacroName,
Chris Lattnerca45cff2009-03-20 16:06:38 +000041 const LangOptions &Opts) {
42 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000043
Chris Lattnerca45cff2009-03-20 16:06:38 +000044 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
45 // in the user's namespace.
46 if (Opts.GNUMode)
Benjamin Kramera9992772010-01-09 17:55:51 +000047 Builder.defineMacro(MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000048
Chris Lattnerca45cff2009-03-20 16:06:38 +000049 // Define __unix.
Benjamin Kramera9992772010-01-09 17:55:51 +000050 Builder.defineMacro("__" + MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000051
Chris Lattnerca45cff2009-03-20 16:06:38 +000052 // Define __unix__.
Benjamin Kramera9992772010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerca45cff2009-03-20 16:06:38 +000054}
55
Chris Lattnerd29b6302008-10-05 21:50:58 +000056//===----------------------------------------------------------------------===//
57// Defines specific to certain operating systems.
58//===----------------------------------------------------------------------===//
Chris Lattner797c3c42009-08-10 19:03:04 +000059
Torok Edwin5f6c1942009-06-30 17:10:35 +000060namespace {
Douglas Gregora3844922009-07-01 15:12:53 +000061template<typename TgtInfo>
62class OSTargetInfo : public TgtInfo {
Torok Edwin5f6c1942009-06-30 17:10:35 +000063protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +000064 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +000065 MacroBuilder &Builder) const=0;
Torok Edwin5f6c1942009-06-30 17:10:35 +000066public:
Douglas Gregora3844922009-07-01 15:12:53 +000067 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwin5f6c1942009-06-30 17:10:35 +000068 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +000069 MacroBuilder &Builder) const {
70 TgtInfo::getTargetDefines(Opts, Builder);
71 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwinb0a5b242009-06-30 17:00:25 +000072 }
Torok Edwin5f6c1942009-06-30 17:10:35 +000073
74};
Chris Lattner4c28b1c2009-08-12 06:24:27 +000075} // end anonymous namespace
Torok Edwinb0a5b242009-06-30 17:00:25 +000076
Chris Lattner797c3c42009-08-10 19:03:04 +000077
Daniel Dunbar21ae3192010-01-26 01:44:04 +000078static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
79 const llvm::Triple &Triple) {
Benjamin Kramera9992772010-01-09 17:55:51 +000080 Builder.defineMacro("__APPLE_CC__", "5621");
81 Builder.defineMacro("__APPLE__");
82 Builder.defineMacro("__MACH__");
83 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000084
Chris Lattner10d24272009-04-07 16:50:40 +000085 // __weak is always defined, for use in blocks and with objc pointers.
Benjamin Kramera9992772010-01-09 17:55:51 +000086 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000087
Chris Lattner10d24272009-04-07 16:50:40 +000088 // Darwin defines __strong even in C mode (just to nothing).
89 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
Benjamin Kramera9992772010-01-09 17:55:51 +000090 Builder.defineMacro("__strong", "");
Chris Lattner10d24272009-04-07 16:50:40 +000091 else
Benjamin Kramera9992772010-01-09 17:55:51 +000092 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
Eli Friedman2de4fee2009-06-04 23:00:29 +000093
94 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +000095 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +000096 else
Benjamin Kramera9992772010-01-09 17:55:51 +000097 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +000098
99 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000100 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000101
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000102 // Get the OS version number from the triple.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000103 unsigned Maj, Min, Rev;
Mike Stump1eb44332009-09-09 15:08:12 +0000104
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000105 // If no version was given, default to to 10.4.0, for simplifying tests.
106 if (Triple.getOSName() == "darwin") {
107 Min = Rev = 0;
108 Maj = 8;
109 } else
110 Triple.getDarwinNumber(Maj, Min, Rev);
111
112 // Set the appropriate OS version define.
113 if (Triple.getEnvironmentName() == "iphoneos") {
114 assert(Maj < 10 && Min < 99 && Rev < 99 && "Invalid version!");
115 char Str[6];
116 Str[0] = '0' + Maj;
117 Str[1] = '0' + (Min / 10);
118 Str[2] = '0' + (Min % 10);
119 Str[3] = '0' + (Rev / 10);
120 Str[4] = '0' + (Rev % 10);
121 Str[5] = '\0';
122 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
123 } else {
124 // For historical reasons that make little sense, the version passed here is
125 // the "darwin" version, which drops the 10 and offsets by 4.
126 Rev = Min;
127 Min = Maj - 4;
128 Maj = 10;
129
130 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
131 assert(Maj < 99 && Min < 10 && Rev < 10 && "Invalid version!");
132 char Str[5];
133 Str[0] = '0' + (Maj / 10);
134 Str[1] = '0' + (Maj % 10);
135 Str[2] = '0' + Min;
136 Str[3] = '0' + Rev;
137 Str[4] = '\0';
138 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000139 }
Eli Friedman618234a2008-08-20 02:34:37 +0000140}
Reid Spencer5f016e22007-07-11 17:01:13 +0000141
Chris Lattner797c3c42009-08-10 19:03:04 +0000142namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000143template<typename Target>
144class DarwinTargetInfo : public OSTargetInfo<Target> {
145protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000146 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000147 MacroBuilder &Builder) const {
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000148 getDarwinDefines(Builder, Opts, Triple);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000149 }
Mike Stump1eb44332009-09-09 15:08:12 +0000150
Torok Edwin5f6c1942009-06-30 17:10:35 +0000151public:
152 DarwinTargetInfo(const std::string& triple) :
153 OSTargetInfo<Target>(triple) {
Eric Christopherdd53ec92010-06-25 19:04:52 +0000154 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000155 this->MCountName = "\01mcount";
Torok Edwin5f6c1942009-06-30 17:10:35 +0000156 }
157
Anders Carlssonf959fb52010-01-30 18:33:31 +0000158 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000159 // Let MCSectionMachO validate this.
160 llvm::StringRef Segment, Section;
161 unsigned TAA, StubSize;
162 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
163 TAA, StubSize);
164 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000165
Anders Carlsson18af3682010-06-08 22:47:50 +0000166 virtual const char *getStaticInitSectionSpecifier() const {
167 // FIXME: We should return 0 when building kexts.
168 return "__TEXT,__StaticInit,regular,pure_instructions";
169 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000170
Torok Edwin5f6c1942009-06-30 17:10:35 +0000171};
172
Chris Lattner797c3c42009-08-10 19:03:04 +0000173
Torok Edwin5f6c1942009-06-30 17:10:35 +0000174// DragonFlyBSD Target
175template<typename Target>
176class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
177protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000178 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000179 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000180 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000181 Builder.defineMacro("__DragonFly__");
182 Builder.defineMacro("__DragonFly_cc_version", "100001");
183 Builder.defineMacro("__ELF__");
184 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
185 Builder.defineMacro("__tune_i386__");
186 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000187 }
188public:
Mike Stump1eb44332009-09-09 15:08:12 +0000189 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000190 : OSTargetInfo<Target>(triple) {}
191};
192
193// FreeBSD Target
194template<typename Target>
195class FreeBSDTargetInfo : public OSTargetInfo<Target> {
196protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000197 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000198 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000199 // FreeBSD defines; list based off of gcc output
200
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000201 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000202 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000203
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000204 Builder.defineMacro("__FreeBSD__", Release);
205 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramera9992772010-01-09 17:55:51 +0000206 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
207 DefineStd(Builder, "unix", Opts);
208 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000209 }
210public:
Mike Stump1eb44332009-09-09 15:08:12 +0000211 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000212 : OSTargetInfo<Target>(triple) {
213 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000214
215 llvm::Triple Triple(triple);
216 switch (Triple.getArch()) {
217 default:
218 case llvm::Triple::x86:
219 case llvm::Triple::x86_64:
220 this->MCountName = ".mcount";
221 break;
222 case llvm::Triple::mips:
223 case llvm::Triple::mipsel:
224 case llvm::Triple::ppc:
225 case llvm::Triple::ppc64:
226 this->MCountName = "_mcount";
227 break;
228 case llvm::Triple::arm:
229 this->MCountName = "__mcount";
230 break;
231 }
232
Duncan Sands1e90faf2009-07-08 13:55:08 +0000233 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000234};
235
Chris Lattner38e317d2010-07-07 16:01:42 +0000236// Minix Target
237template<typename Target>
238class MinixTargetInfo : public OSTargetInfo<Target> {
239protected:
240 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
241 MacroBuilder &Builder) const {
242 // Minix defines
243
244 Builder.defineMacro("__minix", "3");
245 Builder.defineMacro("_EM_WSIZE", "4");
246 Builder.defineMacro("_EM_PSIZE", "4");
247 Builder.defineMacro("_EM_SSIZE", "2");
248 Builder.defineMacro("_EM_LSIZE", "4");
249 Builder.defineMacro("_EM_FSIZE", "4");
250 Builder.defineMacro("_EM_DSIZE", "8");
251 DefineStd(Builder, "unix", Opts);
252 }
253public:
254 MinixTargetInfo(const std::string &triple)
255 : OSTargetInfo<Target>(triple) {
256 this->UserLabelPrefix = "";
257 }
258};
259
Torok Edwin5f6c1942009-06-30 17:10:35 +0000260// Linux target
261template<typename Target>
262class LinuxTargetInfo : public OSTargetInfo<Target> {
263protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000264 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000265 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000266 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000267 DefineStd(Builder, "unix", Opts);
268 DefineStd(Builder, "linux", Opts);
269 Builder.defineMacro("__gnu_linux__");
270 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000271 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000272 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000273 if (Opts.CPlusPlus)
274 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000275 }
276public:
Mike Stump1eb44332009-09-09 15:08:12 +0000277 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000278 : OSTargetInfo<Target>(triple) {
279 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000280 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000281 }
282};
283
Chris Lattnerb62bb282009-07-13 20:29:08 +0000284// NetBSD Target
285template<typename Target>
286class NetBSDTargetInfo : public OSTargetInfo<Target> {
287protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000288 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000289 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000290 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000291 Builder.defineMacro("__NetBSD__");
292 Builder.defineMacro("__unix__");
293 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000294 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000295 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000296 }
297public:
Mike Stump1eb44332009-09-09 15:08:12 +0000298 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000299 : OSTargetInfo<Target>(triple) {
300 this->UserLabelPrefix = "";
301 }
302};
303
Torok Edwin5f6c1942009-06-30 17:10:35 +0000304// OpenBSD Target
305template<typename Target>
306class OpenBSDTargetInfo : public OSTargetInfo<Target> {
307protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000308 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000309 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000310 // OpenBSD defines; list based off of gcc output
311
Benjamin Kramera9992772010-01-09 17:55:51 +0000312 Builder.defineMacro("__OpenBSD__");
313 DefineStd(Builder, "unix", Opts);
314 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000315 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000316 Builder.defineMacro("_POSIX_THREADS");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000317 }
318public:
Mike Stump1eb44332009-09-09 15:08:12 +0000319 OpenBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000320 : OSTargetInfo<Target>(triple) {}
321};
322
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000323// PSP Target
324template<typename Target>
325class PSPTargetInfo : public OSTargetInfo<Target> {
326protected:
327 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000328 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000329 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000330 Builder.defineMacro("PSP");
331 Builder.defineMacro("_PSP");
332 Builder.defineMacro("__psp__");
333 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000334 }
335public:
336 PSPTargetInfo(const std::string& triple)
337 : OSTargetInfo<Target>(triple) {
338 this->UserLabelPrefix = "";
339 }
340};
341
John Thompson3f6918a2009-11-19 17:18:50 +0000342// PS3 PPU Target
343template<typename Target>
344class PS3PPUTargetInfo : public OSTargetInfo<Target> {
345protected:
346 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000347 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000348 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000349 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000350 Builder.defineMacro("__PPU__");
351 Builder.defineMacro("__CELLOS_LV2__");
352 Builder.defineMacro("__ELF__");
353 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000354 Builder.defineMacro("_ARCH_PPC64");
355 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000356 }
357public:
358 PS3PPUTargetInfo(const std::string& triple)
359 : OSTargetInfo<Target>(triple) {
360 this->UserLabelPrefix = "";
John Thompsonec387af2009-12-18 14:21:08 +0000361 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000362 this->IntMaxType = TargetInfo::SignedLongLong;
363 this->UIntMaxType = TargetInfo::UnsignedLongLong;
364 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000365 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000366 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
367 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000368 }
369};
370
371// FIXME: Need a real SPU target.
372// PS3 SPU Target
373template<typename Target>
374class PS3SPUTargetInfo : public OSTargetInfo<Target> {
375protected:
376 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000377 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000378 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000379 Builder.defineMacro("__SPU__");
380 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000381 }
382public:
383 PS3SPUTargetInfo(const std::string& triple)
384 : OSTargetInfo<Target>(triple) {
385 this->UserLabelPrefix = "";
386 }
387};
388
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000389// AuroraUX target
390template<typename Target>
391class AuroraUXTargetInfo : public OSTargetInfo<Target> {
392protected:
393 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000394 MacroBuilder &Builder) const {
395 DefineStd(Builder, "sun", Opts);
396 DefineStd(Builder, "unix", Opts);
397 Builder.defineMacro("__ELF__");
398 Builder.defineMacro("__svr4__");
399 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000400 }
401public:
402 AuroraUXTargetInfo(const std::string& triple)
403 : OSTargetInfo<Target>(triple) {
404 this->UserLabelPrefix = "";
405 this->WCharType = this->SignedLong;
406 // FIXME: WIntType should be SignedLong
407 }
408};
409
Torok Edwin5f6c1942009-06-30 17:10:35 +0000410// Solaris target
411template<typename Target>
412class SolarisTargetInfo : public OSTargetInfo<Target> {
413protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000414 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000415 MacroBuilder &Builder) const {
416 DefineStd(Builder, "sun", Opts);
417 DefineStd(Builder, "unix", Opts);
418 Builder.defineMacro("__ELF__");
419 Builder.defineMacro("__svr4__");
420 Builder.defineMacro("__SVR4");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000421 }
422public:
Mike Stump1eb44332009-09-09 15:08:12 +0000423 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000424 : OSTargetInfo<Target>(triple) {
425 this->UserLabelPrefix = "";
426 this->WCharType = this->SignedLong;
427 // FIXME: WIntType should be SignedLong
428 }
429};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000430
431// Windows target
432template<typename Target>
433class WindowsTargetInfo : public OSTargetInfo<Target> {
434protected:
435 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
436 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000437 Builder.defineMacro("_WIN32");
438 }
439 void getVisualStudioDefines(const LangOptions &Opts,
440 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000441 if (Opts.CPlusPlus) {
442 if (Opts.RTTI)
443 Builder.defineMacro("_CPPRTTI");
444
445 if (Opts.Exceptions)
446 Builder.defineMacro("_CPPUNWIND");
447 }
448
449 if (!Opts.CharIsSigned)
450 Builder.defineMacro("_CHAR_UNSIGNED");
451
452 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
453 // but it works for now.
454 if (Opts.POSIXThreads)
455 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000456
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000457 if (Opts.MSCVersion != 0)
458 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
459
460 if (Opts.Microsoft) {
461 Builder.defineMacro("_MSC_EXTENSIONS");
462
463 if (Opts.CPlusPlus0x) {
464 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
465 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
466 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
467 }
468 }
469
470 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000471 }
472
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000473public:
474 WindowsTargetInfo(const std::string &triple)
475 : OSTargetInfo<Target>(triple) {}
476};
477
Mike Stump1eb44332009-09-09 15:08:12 +0000478} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000479
Chris Lattnerd29b6302008-10-05 21:50:58 +0000480//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000481// Specific target implementations.
482//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000483
Eli Friedmane4277982008-08-20 23:11:40 +0000484namespace {
485// PPC abstract base class
486class PPCTargetInfo : public TargetInfo {
487 static const Builtin::Info BuiltinInfo[];
488 static const char * const GCCRegNames[];
489 static const TargetInfo::GCCRegAlias GCCRegAliases[];
490
491public:
Eli Friedman15b91762009-06-05 07:05:05 +0000492 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
493
Eli Friedmane4277982008-08-20 23:11:40 +0000494 virtual void getTargetBuiltins(const Builtin::Info *&Records,
495 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000496 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000497 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000498 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000499
Chris Lattner33328642009-03-20 15:52:06 +0000500 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000501 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000502
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000503 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000504 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000505 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000506 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000507 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000508 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000509 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000510 default: return false;
511 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000512 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000513 case 'b': // Base register
514 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000515 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000516 break;
517 // FIXME: The following are added to allow parsing.
518 // I just took a guess at what the actions should be.
519 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000520 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000521 case 'v': // Altivec vector register
522 Info.setAllowsRegister();
523 break;
524 case 'w':
525 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000526 case 'd':// VSX vector register to hold vector double data
527 case 'f':// VSX vector register to hold vector float data
528 case 's':// VSX vector register to hold scalar float data
529 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000530 break;
531 default:
532 return false;
533 }
534 Info.setAllowsRegister();
535 Name++; // Skip over 'w'.
536 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000537 case 'h': // `MQ', `CTR', or `LINK' register
538 case 'q': // `MQ' register
539 case 'c': // `CTR' register
540 case 'l': // `LINK' register
541 case 'x': // `CR' register (condition register) number 0
542 case 'y': // `CR' register (condition register)
543 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000544 Info.setAllowsRegister();
545 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000546 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000547 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000548 // (use `L' instead for SImode constants)
549 case 'K': // Unsigned 16-bit constant
550 case 'L': // Signed 16-bit constant shifted left 16 bits
551 case 'M': // Constant larger than 31
552 case 'N': // Exact power of 2
553 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000554 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000555 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000556 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000557 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000558 break;
559 case 'm': // Memory operand. Note that on PowerPC targets, m can
560 // include addresses that update the base register. It
561 // is therefore only safe to use `m' in an asm statement
562 // if that asm statement accesses the operand exactly once.
563 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000564 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000565 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000566 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000567 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000568 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
569 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000570 // register to be updated.
571 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000572 if (Name[1] != 's')
573 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000574 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000575 // include any automodification of the base register. Unlike
576 // `m', this constraint can be used in asm statements that
577 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000578 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000579 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000580 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000581 break;
582 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000583 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000584 case 'Z': // Memory operand that is an indexed or indirect from a
585 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000586 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000587 Info.setAllowsMemory();
588 Info.setAllowsRegister();
589 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000590 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000591 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000592 // register (`p' is preferable for asm statements)
593 case 'S': // Constant suitable as a 64-bit mask operand
594 case 'T': // Constant suitable as a 32-bit mask operand
595 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000596 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000597 // instructions
598 case 'W': // Vector constant that does not require memory
599 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000600 break;
601 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000602 }
John Thompson8e6065a2010-06-24 22:44:13 +0000603 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000604 }
Eli Friedmane4277982008-08-20 23:11:40 +0000605 virtual const char *getClobbers() const {
606 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000607 }
Eli Friedmane4277982008-08-20 23:11:40 +0000608};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000609
Eli Friedmane4277982008-08-20 23:11:40 +0000610const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000611#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
612#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
613 ALL_LANGUAGES, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000614#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000615};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000616
617
Chris Lattnerc0f59212009-03-02 22:27:17 +0000618/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
619/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000620void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000621 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000622 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000623 Builder.defineMacro("__ppc__");
624 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000625 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000626 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000627 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000628 Builder.defineMacro("_ARCH_PPC64");
629 Builder.defineMacro("_LP64");
630 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000631 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000632 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000633 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000634 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000635 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000636
Chris Lattnerc0f59212009-03-02 22:27:17 +0000637 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +0000638 Builder.defineMacro("_BIG_ENDIAN");
639 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000640
Chris Lattnerc0f59212009-03-02 22:27:17 +0000641 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000642 Builder.defineMacro("__NATURAL_ALIGNMENT__");
643 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000644
Chris Lattnerc0f59212009-03-02 22:27:17 +0000645 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000646 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000647
John Thompson3f6918a2009-11-19 17:18:50 +0000648 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000649 Builder.defineMacro("__VEC__", "10206");
650 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000651 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000652}
653
Chris Lattner393ff042008-04-21 18:56:49 +0000654
Eli Friedmane4277982008-08-20 23:11:40 +0000655const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000656 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
657 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
658 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
659 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
660 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
661 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
662 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
663 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000664 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000665 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000666 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000667 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
668 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
669 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
670 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000671 "vrsave", "vscr",
672 "spe_acc", "spefscr",
673 "sfp"
674};
Reid Spencer5f016e22007-07-11 17:01:13 +0000675
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000676void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000677 unsigned &NumNames) const {
678 Names = GCCRegNames;
679 NumNames = llvm::array_lengthof(GCCRegNames);
680}
Reid Spencer5f016e22007-07-11 17:01:13 +0000681
Eli Friedmane4277982008-08-20 23:11:40 +0000682const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
683 // While some of these aliases do map to different registers
684 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000685 { { "0" }, "r0" },
686 { { "1"}, "r1" },
687 { { "2" }, "r2" },
688 { { "3" }, "r3" },
689 { { "4" }, "r4" },
690 { { "5" }, "r5" },
691 { { "6" }, "r6" },
692 { { "7" }, "r7" },
693 { { "8" }, "r8" },
694 { { "9" }, "r9" },
695 { { "10" }, "r10" },
696 { { "11" }, "r11" },
697 { { "12" }, "r12" },
698 { { "13" }, "r13" },
699 { { "14" }, "r14" },
700 { { "15" }, "r15" },
701 { { "16" }, "r16" },
702 { { "17" }, "r17" },
703 { { "18" }, "r18" },
704 { { "19" }, "r19" },
705 { { "20" }, "r20" },
706 { { "21" }, "r21" },
707 { { "22" }, "r22" },
708 { { "23" }, "r23" },
709 { { "24" }, "r24" },
710 { { "25" }, "r25" },
711 { { "26" }, "r26" },
712 { { "27" }, "r27" },
713 { { "28" }, "r28" },
714 { { "29" }, "r29" },
715 { { "30" }, "r30" },
716 { { "31" }, "r31" },
717 { { "fr0" }, "f0" },
718 { { "fr1" }, "f1" },
719 { { "fr2" }, "f2" },
720 { { "fr3" }, "f3" },
721 { { "fr4" }, "f4" },
722 { { "fr5" }, "f5" },
723 { { "fr6" }, "f6" },
724 { { "fr7" }, "f7" },
725 { { "fr8" }, "f8" },
726 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000727 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000728 { { "fr11" }, "f11" },
729 { { "fr12" }, "f12" },
730 { { "fr13" }, "f13" },
731 { { "fr14" }, "f14" },
732 { { "fr15" }, "f15" },
733 { { "fr16" }, "f16" },
734 { { "fr17" }, "f17" },
735 { { "fr18" }, "f18" },
736 { { "fr19" }, "f19" },
737 { { "fr20" }, "f20" },
738 { { "fr21" }, "f21" },
739 { { "fr22" }, "f22" },
740 { { "fr23" }, "f23" },
741 { { "fr24" }, "f24" },
742 { { "fr25" }, "f25" },
743 { { "fr26" }, "f26" },
744 { { "fr27" }, "f27" },
745 { { "fr28" }, "f28" },
746 { { "fr29" }, "f29" },
747 { { "fr30" }, "f30" },
748 { { "fr31" }, "f31" },
749 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000750};
751
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000752void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000753 unsigned &NumAliases) const {
754 Aliases = GCCRegAliases;
755 NumAliases = llvm::array_lengthof(GCCRegAliases);
756}
757} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000758
759namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000760class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000761public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000762 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000763 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 +0000764 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000765
766 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divackyc81f2a22011-01-06 08:27:10 +0000767 SizeType = UnsignedInt;
768 }
769
770 virtual const char *getVAListDeclaration() const {
771 // This is the ELF definition, and is overridden by the Darwin sub-target
772 return "typedef struct __va_list_tag {"
773 " unsigned char gpr;"
774 " unsigned char fpr;"
775 " unsigned short reserved;"
776 " void* overflow_arg_area;"
777 " void* reg_save_area;"
778 "} __builtin_va_list[1];";
Eli Friedmaned855cb2008-08-21 00:13:15 +0000779 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000780};
781} // end anonymous namespace.
782
783namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000784class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000785public:
Eli Friedmane4277982008-08-20 23:11:40 +0000786 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000787 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000788 IntMaxType = SignedLong;
789 UIntMaxType = UnsignedLong;
790 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000791 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 +0000792 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerf291b102008-05-09 06:17:04 +0000793 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000794 virtual const char *getVAListDeclaration() const {
795 return "typedef char* __builtin_va_list;";
796 }
Eli Friedmane4277982008-08-20 23:11:40 +0000797};
798} // end anonymous namespace.
799
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000800
801namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000802class DarwinPPC32TargetInfo :
803 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000804public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000805 DarwinPPC32TargetInfo(const std::string& triple)
806 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000807 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000808 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
809 }
810 virtual const char *getVAListDeclaration() const {
811 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000812 }
813};
814
815class DarwinPPC64TargetInfo :
816 public DarwinTargetInfo<PPC64TargetInfo> {
817public:
818 DarwinPPC64TargetInfo(const std::string& triple)
819 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
820 HasAlignMac68kSupport = true;
821 }
822};
823} // end anonymous namespace.
824
Reid Spencer5f016e22007-07-11 17:01:13 +0000825namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +0000826// MBlaze abstract base class
827class MBlazeTargetInfo : public TargetInfo {
828 static const char * const GCCRegNames[];
829 static const TargetInfo::GCCRegAlias GCCRegAliases[];
830
831public:
832 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +0000833 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +0000834 }
835
836 virtual void getTargetBuiltins(const Builtin::Info *&Records,
837 unsigned &NumRecords) const {
838 // FIXME: Implement.
839 Records = 0;
840 NumRecords = 0;
841 }
842
843 virtual void getTargetDefines(const LangOptions &Opts,
844 MacroBuilder &Builder) const;
845
846 virtual const char *getVAListDeclaration() const {
847 return "typedef char* __builtin_va_list;";
848 }
849 virtual const char *getTargetPrefix() const {
850 return "mblaze";
851 }
852 virtual void getGCCRegNames(const char * const *&Names,
853 unsigned &NumNames) const;
854 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
855 unsigned &NumAliases) const;
856 virtual bool validateAsmConstraint(const char *&Name,
857 TargetInfo::ConstraintInfo &Info) const {
858 switch (*Name) {
859 default: return false;
860 case 'O': // Zero
861 return true;
862 case 'b': // Base register
863 case 'f': // Floating point register
864 Info.setAllowsRegister();
865 return true;
866 }
867 }
868 virtual const char *getClobbers() const {
869 return "";
870 }
871};
872
873/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
874/// #defines that are not tied to a specific subtarget.
875void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
876 MacroBuilder &Builder) const {
877 // Target identification.
878 Builder.defineMacro("__microblaze__");
879 Builder.defineMacro("_ARCH_MICROBLAZE");
880 Builder.defineMacro("__MICROBLAZE__");
881
882 // Target properties.
883 Builder.defineMacro("_BIG_ENDIAN");
884 Builder.defineMacro("__BIG_ENDIAN__");
885
886 // Subtarget options.
887 Builder.defineMacro("__REGISTER_PREFIX__", "");
888}
889
890
891const char * const MBlazeTargetInfo::GCCRegNames[] = {
892 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
893 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
894 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
895 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
896 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
897 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
898 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
899 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
900 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
901 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
902};
903
904void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
905 unsigned &NumNames) const {
906 Names = GCCRegNames;
907 NumNames = llvm::array_lengthof(GCCRegNames);
908}
909
910const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
911 { {"f0"}, "r0" },
912 { {"f1"}, "r1" },
913 { {"f2"}, "r2" },
914 { {"f3"}, "r3" },
915 { {"f4"}, "r4" },
916 { {"f5"}, "r5" },
917 { {"f6"}, "r6" },
918 { {"f7"}, "r7" },
919 { {"f8"}, "r8" },
920 { {"f9"}, "r9" },
921 { {"f10"}, "r10" },
922 { {"f11"}, "r11" },
923 { {"f12"}, "r12" },
924 { {"f13"}, "r13" },
925 { {"f14"}, "r14" },
926 { {"f15"}, "r15" },
927 { {"f16"}, "r16" },
928 { {"f17"}, "r17" },
929 { {"f18"}, "r18" },
930 { {"f19"}, "r19" },
931 { {"f20"}, "r20" },
932 { {"f21"}, "r21" },
933 { {"f22"}, "r22" },
934 { {"f23"}, "r23" },
935 { {"f24"}, "r24" },
936 { {"f25"}, "r25" },
937 { {"f26"}, "r26" },
938 { {"f27"}, "r27" },
939 { {"f28"}, "r28" },
940 { {"f29"}, "r29" },
941 { {"f30"}, "r30" },
942 { {"f31"}, "r31" },
943};
944
945void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
946 unsigned &NumAliases) const {
947 Aliases = GCCRegAliases;
948 NumAliases = llvm::array_lengthof(GCCRegAliases);
949}
950} // end anonymous namespace.
951
952namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000953// Namespace for x86 abstract base class
954const Builtin::Info BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000955#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
956#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
957 ALL_LANGUAGES, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000958#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +0000959};
Eli Friedman61538a72008-05-20 14:21:01 +0000960
Nuno Lopes2550d702009-12-23 17:49:57 +0000961static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +0000962 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
963 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
964 "argp", "flags", "fspr", "dirflag", "frame",
965 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
966 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
967 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
968 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
969};
970
971const TargetInfo::GCCRegAlias GCCRegAliases[] = {
972 { { "al", "ah", "eax", "rax" }, "ax" },
973 { { "bl", "bh", "ebx", "rbx" }, "bx" },
974 { { "cl", "ch", "ecx", "rcx" }, "cx" },
975 { { "dl", "dh", "edx", "rdx" }, "dx" },
976 { { "esi", "rsi" }, "si" },
977 { { "edi", "rdi" }, "di" },
978 { { "esp", "rsp" }, "sp" },
979 { { "ebp", "rbp" }, "bp" },
980};
981
982// X86 target abstract base class; x86-32 and x86-64 are very close, so
983// most of the implementation can be shared.
984class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +0000985 enum X86SSEEnum {
986 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
987 } SSELevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +0000988 enum AMD3DNowEnum {
989 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
990 } AMD3DNowLevel;
991
Eric Christophereea12d12010-04-02 23:50:19 +0000992 bool HasAES;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +0000993 bool HasAVX;
994
Eli Friedman618234a2008-08-20 02:34:37 +0000995public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000996 X86TargetInfo(const std::string& triple)
Eric Christophereea12d12010-04-02 23:50:19 +0000997 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +0000998 HasAES(false), HasAVX(false) {
Eli Friedman618234a2008-08-20 02:34:37 +0000999 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001000 }
1001 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1002 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001003 Records = BuiltinInfo;
1004 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001005 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001006 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001007 unsigned &NumNames) const {
1008 Names = GCCRegNames;
1009 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001010 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001011 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001012 unsigned &NumAliases) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001013 Aliases = GCCRegAliases;
1014 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001015 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001016 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001017 TargetInfo::ConstraintInfo &info) const;
1018 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001019 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001020 return "~{dirflag},~{fpsr},~{flags}";
1021 }
Chris Lattner33328642009-03-20 15:52:06 +00001022 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001023 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001024 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1025 const std::string &Name,
1026 bool Enabled) const;
Mike Stump1eb44332009-09-09 15:08:12 +00001027 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001028 llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001029 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Reid Spencer5f016e22007-07-11 17:01:13 +00001030};
Chris Lattner3daed522009-03-02 22:20:04 +00001031
Mike Stump1eb44332009-09-09 15:08:12 +00001032void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001033 llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001034 // FIXME: This should not be here.
1035 Features["3dnow"] = false;
1036 Features["3dnowa"] = false;
1037 Features["mmx"] = false;
1038 Features["sse"] = false;
1039 Features["sse2"] = false;
1040 Features["sse3"] = false;
1041 Features["ssse3"] = false;
1042 Features["sse41"] = false;
1043 Features["sse42"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001044 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001045 Features["avx"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001046
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001047 // LLVM does not currently recognize this.
1048 // Features["sse4a"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001049
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001050 // FIXME: This *really* should not be here.
1051
1052 // X86_64 always has SSE2.
1053 if (PointerWidth == 64)
1054 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1055
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001056 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1057 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1058 ;
1059 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1060 setFeatureEnabled(Features, "mmx", true);
1061 else if (CPU == "pentium3")
1062 setFeatureEnabled(Features, "sse", true);
1063 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1064 setFeatureEnabled(Features, "sse2", true);
1065 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1066 setFeatureEnabled(Features, "sse3", true);
1067 else if (CPU == "core2")
1068 setFeatureEnabled(Features, "ssse3", true);
1069 else if (CPU == "penryn") {
1070 setFeatureEnabled(Features, "sse4", true);
1071 Features["sse42"] = false;
1072 } else if (CPU == "atom")
1073 setFeatureEnabled(Features, "sse3", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001074 else if (CPU == "corei7") {
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001075 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001076 setFeatureEnabled(Features, "aes", true);
1077 }
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001078 else if (CPU == "k6" || CPU == "winchip-c6")
1079 setFeatureEnabled(Features, "mmx", true);
Mike Stump1eb44332009-09-09 15:08:12 +00001080 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001081 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1082 setFeatureEnabled(Features, "mmx", true);
1083 setFeatureEnabled(Features, "3dnow", true);
1084 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1085 setFeatureEnabled(Features, "sse", true);
1086 setFeatureEnabled(Features, "3dnowa", true);
1087 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1088 CPU == "athlon-fx") {
Mike Stump1eb44332009-09-09 15:08:12 +00001089 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001090 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001091 } else if (CPU == "k8-sse3") {
1092 setFeatureEnabled(Features, "sse3", true);
1093 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001094 } else if (CPU == "c3-2")
1095 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001096}
1097
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001098bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001099 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001100 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001101 // FIXME: This *really* should not be here. We need some way of translating
1102 // options into llvm subtarget features.
1103 if (!Features.count(Name) &&
1104 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001105 return false;
1106
1107 if (Enabled) {
1108 if (Name == "mmx")
1109 Features["mmx"] = true;
1110 else if (Name == "sse")
1111 Features["mmx"] = Features["sse"] = true;
1112 else if (Name == "sse2")
1113 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1114 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001115 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001116 Features["sse3"] = true;
1117 else if (Name == "ssse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001118 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001119 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001120 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump1eb44332009-09-09 15:08:12 +00001121 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001122 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001123 else if (Name == "sse4.1")
1124 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1125 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001126 else if (Name == "3dnow")
1127 Features["3dnowa"] = true;
1128 else if (Name == "3dnowa")
1129 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001130 else if (Name == "aes")
1131 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001132 else if (Name == "avx")
1133 Features["avx"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001134 } else {
1135 if (Name == "mmx")
Mike Stump1eb44332009-09-09 15:08:12 +00001136 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001137 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1138 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001139 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001140 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1141 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001142 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001143 Features["sse41"] = Features["sse42"] = false;
1144 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001145 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001146 Features["sse42"] = false;
1147 else if (Name == "ssse3")
1148 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1149 else if (Name == "sse4")
1150 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001151 else if (Name == "sse4.2")
1152 Features["sse42"] = false;
1153 else if (Name == "sse4.1")
1154 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001155 else if (Name == "3dnow")
1156 Features["3dnow"] = Features["3dnowa"] = false;
1157 else if (Name == "3dnowa")
1158 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001159 else if (Name == "aes")
1160 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001161 else if (Name == "avx")
1162 Features["avx"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001163 }
1164
1165 return true;
1166}
1167
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001168/// HandleTargetOptions - Perform initialization based on the user
1169/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001170void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001171 // Remember the maximum enabled sselevel.
1172 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1173 // Ignore disabled features.
1174 if (Features[i][0] == '-')
1175 continue;
1176
Eric Christophereea12d12010-04-02 23:50:19 +00001177 if (Features[i].substr(1) == "aes") {
1178 HasAES = true;
1179 continue;
1180 }
1181
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001182 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1183 // For now let it be enabled together with other SSE levels.
1184 if (Features[i].substr(1) == "avx") {
1185 HasAVX = true;
1186 continue;
1187 }
1188
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001189 assert(Features[i][0] == '+' && "Invalid target feature!");
1190 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1191 .Case("sse42", SSE42)
1192 .Case("sse41", SSE41)
1193 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001194 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001195 .Case("sse2", SSE2)
1196 .Case("sse", SSE1)
1197 .Case("mmx", MMX)
1198 .Default(NoMMXSSE);
1199 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001200
1201 AMD3DNowEnum ThreeDNowLevel =
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001202 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1203 .Case("3dnowa", AMD3DNowAthlon)
1204 .Case("3dnow", AMD3DNow)
1205 .Default(NoAMD3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001206
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001207 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001208 }
Chris Lattner3daed522009-03-02 22:20:04 +00001209}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001210
1211/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1212/// that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001213void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001214 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001215 // Target identification.
1216 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001217 Builder.defineMacro("_LP64");
1218 Builder.defineMacro("__LP64__");
1219 Builder.defineMacro("__amd64__");
1220 Builder.defineMacro("__amd64");
1221 Builder.defineMacro("__x86_64");
1222 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001223 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001224 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001225 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001226
Eric Christophereea12d12010-04-02 23:50:19 +00001227 if (HasAES)
1228 Builder.defineMacro("__AES__");
1229
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001230 if (HasAVX)
1231 Builder.defineMacro("__AVX__");
1232
Chris Lattnerc0f59212009-03-02 22:27:17 +00001233 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001234 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001235
Chris Lattnerc0f59212009-03-02 22:27:17 +00001236 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +00001237 Builder.defineMacro("__nocona");
1238 Builder.defineMacro("__nocona__");
1239 Builder.defineMacro("__tune_nocona__");
1240 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001241
Chris Lattner54175442009-04-19 17:32:33 +00001242 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1243 // functions in glibc header files that use FP Stack inline asm which the
1244 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001245 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001246
Chris Lattner84f0ea82009-03-02 22:40:39 +00001247 // Each case falls through to the previous one here.
1248 switch (SSELevel) {
1249 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00001250 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001251 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00001252 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001253 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001254 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001255 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001256 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001257 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00001258 Builder.defineMacro("__SSE2__");
1259 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001260 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00001261 Builder.defineMacro("__SSE__");
1262 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001263 case MMX:
Benjamin Kramera9992772010-01-09 17:55:51 +00001264 Builder.defineMacro("__MMX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001265 case NoMMXSSE:
1266 break;
1267 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001268
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001269 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001270 switch (SSELevel) {
Michael J. Spencera764e832010-10-21 08:22:51 +00001271 case SSE42:
1272 case SSE41:
1273 case SSSE3:
1274 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001275 case SSE2:
1276 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1277 break;
1278 case SSE1:
1279 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1280 break;
1281 default:
1282 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1283 }
1284 }
1285
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001286 // Each case falls through to the previous one here.
1287 switch (AMD3DNowLevel) {
1288 case AMD3DNowAthlon:
1289 Builder.defineMacro("__3dNOW_A__");
1290 case AMD3DNow:
1291 Builder.defineMacro("__3dNOW__");
1292 case NoAMD3DNow:
1293 break;
1294 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00001295}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001296
1297
Eli Friedman618234a2008-08-20 02:34:37 +00001298bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001299X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001300 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001301 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00001302 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00001303 case 'Y': // first letter of a pair:
1304 switch (*(Name+1)) {
1305 default: return false;
1306 case '0': // First SSE register.
1307 case 't': // Any SSE register, when SSE2 is enabled.
1308 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1309 case 'm': // any MMX register, when inter-unit moves enabled.
1310 break; // falls through to setAllowsRegister.
1311 }
Eli Friedman618234a2008-08-20 02:34:37 +00001312 case 'a': // eax.
1313 case 'b': // ebx.
1314 case 'c': // ecx.
1315 case 'd': // edx.
1316 case 'S': // esi.
1317 case 'D': // edi.
1318 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00001319 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00001320 case 't': // top of floating point stack.
1321 case 'u': // second from top of floating point stack.
1322 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00001323 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00001324 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00001325 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00001326 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1327 case 'l': // "Index" registers: any general register that can be used as an
1328 // index in a base+index memory access.
1329 Info.setAllowsRegister();
1330 return true;
1331 case 'C': // SSE floating point constant.
1332 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001333 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001334 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001335 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001336 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00001337 return true;
1338 }
Dale Johannesen545be512010-08-24 22:33:12 +00001339 return false;
Eli Friedman618234a2008-08-20 02:34:37 +00001340}
1341
Dale Johannesenf6e2c202010-10-29 23:12:32 +00001342
Eli Friedman618234a2008-08-20 02:34:37 +00001343std::string
1344X86TargetInfo::convertConstraint(const char Constraint) const {
1345 switch (Constraint) {
1346 case 'a': return std::string("{ax}");
1347 case 'b': return std::string("{bx}");
1348 case 'c': return std::string("{cx}");
1349 case 'd': return std::string("{dx}");
1350 case 'S': return std::string("{si}");
1351 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00001352 case 'p': // address
1353 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00001354 case 't': // top of floating point stack.
1355 return std::string("{st}");
1356 case 'u': // second from top of floating point stack.
1357 return std::string("{st(1)}"); // second from top of floating point stack.
1358 default:
1359 return std::string(1, Constraint);
1360 }
1361}
Eli Friedman618234a2008-08-20 02:34:37 +00001362} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00001363
1364namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001365// X86-32 generic target
1366class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001367public:
Eli Friedman618234a2008-08-20 02:34:37 +00001368 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1369 DoubleAlign = LongLongAlign = 32;
1370 LongDoubleWidth = 96;
1371 LongDoubleAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001372 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1373 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001374 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman1afabd92009-03-29 20:31:09 +00001375 SizeType = UnsignedInt;
1376 PtrDiffType = SignedInt;
1377 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001378 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001379
1380 // Use fpret for all types.
1381 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1382 (1 << TargetInfo::Double) |
1383 (1 << TargetInfo::LongDouble));
Eli Friedman618234a2008-08-20 02:34:37 +00001384 }
1385 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001386 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00001387 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001388
Chris Lattner21fb98e2009-09-23 06:06:36 +00001389 int getEHDataRegisterNumber(unsigned RegNo) const {
1390 if (RegNo == 0) return 0;
1391 if (RegNo == 1) return 2;
1392 return -1;
1393 }
Eli Friedman618234a2008-08-20 02:34:37 +00001394};
1395} // end anonymous namespace
1396
1397namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00001398class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1399public:
1400 OpenBSDI386TargetInfo(const std::string& triple) :
1401 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1402 SizeType = UnsignedLong;
1403 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00001404 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00001405 }
1406};
1407} // end anonymous namespace
1408
1409namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00001410class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00001411public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00001412 DarwinI386TargetInfo(const std::string& triple) :
1413 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00001414 LongDoubleWidth = 128;
1415 LongDoubleAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00001416 SizeType = UnsignedLong;
1417 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001418 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1419 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001420 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbar613fd672010-05-27 00:35:16 +00001421 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00001422 }
1423
Eli Friedman618234a2008-08-20 02:34:37 +00001424};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001425} // end anonymous namespace
1426
1427namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00001428// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001429class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00001430public:
1431 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001432 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00001433 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00001434 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00001435 DoubleAlign = LongLongAlign = 64;
1436 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 +00001437 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1438 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedman29a30502008-08-21 01:40:19 +00001439 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001440 virtual void getTargetDefines(const LangOptions &Opts,
1441 MacroBuilder &Builder) const {
1442 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1443 }
1444};
1445} // end anonymous namespace
1446
1447namespace {
1448
1449// x86-32 Windows Visual Studio target
1450class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1451public:
1452 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1453 : WindowsX86_32TargetInfo(triple) {
1454 LongDoubleWidth = 64;
1455 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1456 }
1457 virtual void getTargetDefines(const LangOptions &Opts,
1458 MacroBuilder &Builder) const {
1459 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1460 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1461 // The value of the following reflects processor type.
1462 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1463 // We lost the original triple, so we use the default.
1464 Builder.defineMacro("_M_IX86", "600");
1465 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001466};
1467} // end anonymous namespace
1468
1469namespace {
1470// x86-32 MinGW target
1471class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1472public:
1473 MinGWX86_32TargetInfo(const std::string& triple)
1474 : WindowsX86_32TargetInfo(triple) {
1475 }
1476 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001477 MacroBuilder &Builder) const {
1478 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001479 DefineStd(Builder, "WIN32", Opts);
1480 DefineStd(Builder, "WINNT", Opts);
1481 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00001482 Builder.defineMacro("__MSVCRT__");
1483 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001484
1485 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1486 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1487 if (Opts.Microsoft)
1488 // Provide "as-is" __declspec.
1489 Builder.defineMacro("__declspec", "__declspec");
1490 else
1491 // Provide alias of __attribute__ like mingw32-gcc.
1492 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001493 }
1494};
1495} // end anonymous namespace
1496
1497namespace {
1498// x86-32 Cygwin target
1499class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1500public:
1501 CygwinX86_32TargetInfo(const std::string& triple)
1502 : X86_32TargetInfo(triple) {
1503 TLSSupported = false;
1504 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001505 DoubleAlign = LongLongAlign = 64;
1506 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1507 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001508 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001509 }
1510 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001511 MacroBuilder &Builder) const {
1512 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1513 Builder.defineMacro("__CYGWIN__");
1514 Builder.defineMacro("__CYGWIN32__");
1515 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00001516 if (Opts.CPlusPlus)
1517 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00001518 }
Eli Friedman29a30502008-08-21 01:40:19 +00001519};
1520} // end anonymous namespace
1521
1522namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00001523// x86-32 Haiku target
1524class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1525public:
1526 HaikuX86_32TargetInfo(const std::string& triple)
1527 : X86_32TargetInfo(triple) {
1528 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00001529 IntPtrType = SignedLong;
1530 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00001531 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00001532 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00001533 virtual void getTargetDefines(const LangOptions &Opts,
1534 MacroBuilder &Builder) const {
1535 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1536 Builder.defineMacro("__INTEL__");
1537 Builder.defineMacro("__HAIKU__");
1538 }
1539};
1540} // end anonymous namespace
1541
1542namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001543// x86-64 generic target
1544class X86_64TargetInfo : public X86TargetInfo {
1545public:
Chris Lattner33328642009-03-20 15:52:06 +00001546 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001547 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00001548 LongDoubleWidth = 128;
1549 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00001550 LargeArrayMinWidth = 128;
1551 LargeArrayAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00001552 IntMaxType = SignedLong;
1553 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001554 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001555 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00001556
Eli Friedmaned855cb2008-08-21 00:13:15 +00001557 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1558 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001559 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001560
1561 // Use fpret only for long double.
1562 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Reid Spencer5f016e22007-07-11 17:01:13 +00001563 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001564 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001565 return "typedef struct __va_list_tag {"
1566 " unsigned gp_offset;"
1567 " unsigned fp_offset;"
1568 " void* overflow_arg_area;"
1569 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00001570 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00001571 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00001572 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001573
Chris Lattner21fb98e2009-09-23 06:06:36 +00001574 int getEHDataRegisterNumber(unsigned RegNo) const {
1575 if (RegNo == 0) return 0;
1576 if (RegNo == 1) return 1;
1577 return -1;
1578 }
Eli Friedman618234a2008-08-20 02:34:37 +00001579};
1580} // end anonymous namespace
1581
1582namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001583// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001584class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001585public:
1586 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001587 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001588 TLSSupported = false;
1589 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00001590 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00001591 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00001592 IntMaxType = SignedLongLong;
1593 UIntMaxType = UnsignedLongLong;
1594 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00001595 SizeType = UnsignedLongLong;
1596 PtrDiffType = SignedLongLong;
1597 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00001598 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001599 }
1600 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001601 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001602 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001603 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00001604 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00001605 virtual const char *getVAListDeclaration() const {
1606 return "typedef char* __builtin_va_list;";
1607 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001608};
1609} // end anonymous namespace
1610
1611namespace {
1612// x86-64 Windows Visual Studio target
1613class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1614public:
1615 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1616 : WindowsX86_64TargetInfo(triple) {
1617 }
1618 virtual void getTargetDefines(const LangOptions &Opts,
1619 MacroBuilder &Builder) const {
1620 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1621 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00001622 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001623 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001624 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001625};
1626} // end anonymous namespace
1627
1628namespace {
1629// x86-64 MinGW target
1630class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1631public:
1632 MinGWX86_64TargetInfo(const std::string& triple)
1633 : WindowsX86_64TargetInfo(triple) {
1634 }
1635 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001636 MacroBuilder &Builder) const {
1637 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001638 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00001639 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00001640 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00001641 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001642
1643 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1644 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1645 if (Opts.Microsoft)
1646 // Provide "as-is" __declspec.
1647 Builder.defineMacro("__declspec", "__declspec");
1648 else
1649 // Provide alias of __attribute__ like mingw32-gcc.
1650 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001651 }
1652};
1653} // end anonymous namespace
1654
1655namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001656class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1657public:
Mike Stump1eb44332009-09-09 15:08:12 +00001658 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001659 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1660 Int64Type = SignedLongLong;
1661 }
1662};
1663} // end anonymous namespace
1664
1665namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00001666class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1667public:
Mike Stump1eb44332009-09-09 15:08:12 +00001668 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00001669 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1670 IntMaxType = SignedLongLong;
1671 UIntMaxType = UnsignedLongLong;
1672 Int64Type = SignedLongLong;
1673 }
1674};
1675} // end anonymous namespace
1676
1677namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00001678class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001679 // Possible FPU choices.
1680 enum FPUMode {
1681 NoFPU,
1682 VFP2FPU,
1683 VFP3FPU,
1684 NeonFPU
1685 };
1686
1687 static bool FPUModeIsVFP(FPUMode Mode) {
1688 return Mode >= VFP2FPU && Mode <= NeonFPU;
1689 }
1690
1691 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1692 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001693
Daniel Dunbareac7c532009-12-18 18:42:37 +00001694 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001695
1696 unsigned FPU : 3;
1697
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001698 unsigned IsThumb : 1;
1699
1700 // Initialized via features.
1701 unsigned SoftFloat : 1;
1702 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001703
Chris Lattner2752c012010-03-03 19:03:45 +00001704 static const Builtin::Info BuiltinInfo[];
1705
Chris Lattner393ff042008-04-21 18:56:49 +00001706public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001707 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00001708 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001709 {
Daniel Dunbara2a41612009-09-14 00:02:24 +00001710 SizeType = UnsignedInt;
1711 PtrDiffType = SignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001712
Chris Lattner9bffb072010-04-23 16:29:58 +00001713 // {} in inline assembly are neon specifiers, not assembly variant
1714 // specifiers.
1715 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00001716
Daniel Dunbareac7c532009-12-18 18:42:37 +00001717 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00001718 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001719 if (IsThumb) {
1720 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1721 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner1932e122009-11-07 18:59:41 +00001722 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001723 } else {
1724 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1725 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner1932e122009-11-07 18:59:41 +00001726 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001727 }
John McCallee79a4c2010-08-21 22:46:04 +00001728
1729 // ARM targets default to using the ARM C++ ABI.
1730 CXXABI = CXXABI_ARM;
Eli Friedman61538a72008-05-20 14:21:01 +00001731 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001732 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00001733 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001734 ABI = Name;
1735
Daniel Dunbara2a41612009-09-14 00:02:24 +00001736 // The defaults (above) are for AAPCS, check if we need to change them.
1737 //
1738 // FIXME: We need support for -meabi... we could just mangle it into the
1739 // name.
1740 if (Name == "apcs-gnu") {
Daniel Dunbard410fa22010-01-27 20:23:08 +00001741 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00001742 SizeType = UnsignedLong;
1743
Daniel Dunbar684de632010-04-22 16:14:54 +00001744 // Do not respect the alignment of bit-field types when laying out
1745 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1746 UseBitFieldTypeAlignment = false;
1747
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001748 if (IsThumb) {
1749 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1750 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001751 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001752 } else {
1753 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1754 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001755 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001756 }
1757
Daniel Dunbara2a41612009-09-14 00:02:24 +00001758 // FIXME: Override "preferred align" for double and long long.
1759 } else if (Name == "aapcs") {
1760 // FIXME: Enumerated types are variable width in straight AAPCS.
1761 } else if (Name == "aapcs-linux") {
1762 ;
1763 } else
1764 return false;
1765
1766 return true;
1767 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001768
Daniel Dunbara91320b2009-12-21 23:28:17 +00001769 void getDefaultFeatures(const std::string &CPU,
1770 llvm::StringMap<bool> &Features) const {
1771 // FIXME: This should not be here.
1772 Features["vfp2"] = false;
1773 Features["vfp3"] = false;
1774 Features["neon"] = false;
1775
1776 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1777 Features["vfp2"] = true;
1778 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1779 Features["neon"] = true;
1780 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001781
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001782 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1783 const std::string &Name,
1784 bool Enabled) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001785 if (Name == "soft-float" || Name == "soft-float-abi") {
1786 Features[Name] = Enabled;
1787 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1788 // These effectively are a single option, reset them when any is enabled.
1789 if (Enabled)
1790 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1791 Features[Name] = Enabled;
1792 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001793 return false;
1794
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001795 return true;
1796 }
1797
1798 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001799 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001800 SoftFloat = SoftFloatABI = false;
1801 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1802 if (Features[i] == "+soft-float")
1803 SoftFloat = true;
1804 else if (Features[i] == "+soft-float-abi")
1805 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001806 else if (Features[i] == "+vfp2")
1807 FPU = VFP2FPU;
1808 else if (Features[i] == "+vfp3")
1809 FPU = VFP3FPU;
1810 else if (Features[i] == "+neon")
1811 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001812 }
1813
1814 // Remove front-end specific options which the backend handles differently.
1815 std::vector<std::string>::iterator it;
1816 it = std::find(Features.begin(), Features.end(), "+soft-float");
1817 if (it != Features.end())
1818 Features.erase(it);
1819 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1820 if (it != Features.end())
1821 Features.erase(it);
1822 }
1823
Daniel Dunbareac7c532009-12-18 18:42:37 +00001824 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1825 return llvm::StringSwitch<const char*>(Name)
1826 .Cases("arm8", "arm810", "4")
1827 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1828 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1829 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1830 .Case("ep9312", "4T")
1831 .Cases("arm10tdmi", "arm1020t", "5T")
1832 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1833 .Case("arm926ej-s", "5TEJ")
1834 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1835 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001836 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001837 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001838 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001839 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1840 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00001841 .Case("cortex-m3", "7M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001842 .Default(0);
1843 }
1844 virtual bool setCPU(const std::string &Name) {
1845 if (!getCPUDefineSuffix(Name))
1846 return false;
1847
1848 CPU = Name;
1849 return true;
1850 }
Chris Lattner33328642009-03-20 15:52:06 +00001851 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001852 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001853 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00001854 Builder.defineMacro("__arm");
1855 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001856
Chris Lattnerc0f59212009-03-02 22:27:17 +00001857 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001858 Builder.defineMacro("__ARMEL__");
1859 Builder.defineMacro("__LITTLE_ENDIAN__");
1860 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001861
1862 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00001863 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001864
Mike Stump437bb4b2009-04-08 02:07:04 +00001865 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001866
Daniel Dunbareac7c532009-12-18 18:42:37 +00001867 // FIXME: It's more complicated than this and we don't really support
1868 // interworking.
1869 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00001870 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001871
Daniel Dunbareac7c532009-12-18 18:42:37 +00001872 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00001873 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001874
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001875 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00001876 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001877
1878 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00001879 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001880
Daniel Dunbara91320b2009-12-21 23:28:17 +00001881 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001882 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001883 Builder.defineMacro("__THUMBEL__");
1884 Builder.defineMacro("__thumb__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001885 if (IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00001886 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001887 }
1888
1889 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00001890 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001891
1892 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00001893 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001894
1895 // This only gets set when Neon instructions are actually available, unlike
1896 // the VFP define, hence the soft float and arch check. This is subtly
1897 // different from gcc, we follow the intent which was that it should be set
1898 // when Neon instructions are actually available.
1899 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00001900 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00001901 }
1902 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1903 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00001904 Records = BuiltinInfo;
1905 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00001906 }
1907 virtual const char *getVAListDeclaration() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001908 return "typedef char* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00001909 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001910 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001911 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001912 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001913 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001914 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001915 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001916 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001917 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00001918 default:
Nate Begemanad487f42008-04-22 05:03:19 +00001919 case 'l': // r0-r7
1920 case 'h': // r8-r15
1921 case 'w': // VFP Floating point register single precision
1922 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00001923 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00001924 return true;
1925 }
Chris Lattner393ff042008-04-21 18:56:49 +00001926 return false;
1927 }
1928 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001929 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00001930 return "";
1931 }
1932};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001933
1934const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001935 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001936 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001937 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
1938
1939 // Float registers
1940 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1941 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1942 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001943 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001944
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001945 // Double registers
1946 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
1947 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00001948 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
1949 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001950
1951 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00001952 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1953 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001954};
1955
1956void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00001957 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001958 Names = GCCRegNames;
1959 NumNames = llvm::array_lengthof(GCCRegNames);
1960}
1961
1962const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001963 { { "a1" }, "r0" },
1964 { { "a2" }, "r1" },
1965 { { "a3" }, "r2" },
1966 { { "a4" }, "r3" },
1967 { { "v1" }, "r4" },
1968 { { "v2" }, "r5" },
1969 { { "v3" }, "r6" },
1970 { { "v4" }, "r7" },
1971 { { "v5" }, "r8" },
1972 { { "v6", "rfp" }, "r9" },
1973 { { "sl" }, "r10" },
1974 { { "fp" }, "r11" },
1975 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00001976 { { "r13" }, "sp" },
1977 { { "r14" }, "lr" },
1978 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001979 // The S, D and Q registers overlap, but aren't really aliases; we
1980 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001981};
1982
1983void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1984 unsigned &NumAliases) const {
1985 Aliases = GCCRegAliases;
1986 NumAliases = llvm::array_lengthof(GCCRegAliases);
1987}
Chris Lattner2752c012010-03-03 19:03:45 +00001988
1989const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001990#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
1991#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1992 ALL_LANGUAGES, false },
Chris Lattner2752c012010-03-03 19:03:45 +00001993#include "clang/Basic/BuiltinsARM.def"
1994};
Chris Lattner393ff042008-04-21 18:56:49 +00001995} // end anonymous namespace.
1996
Eli Friedmana9f54962008-08-20 07:44:10 +00001997
1998namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00001999class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002000 public DarwinTargetInfo<ARMTargetInfo> {
2001protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002002 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002003 MacroBuilder &Builder) const {
Daniel Dunbar21ae3192010-01-26 01:44:04 +00002004 getDarwinDefines(Builder, Opts, Triple);
Eli Friedmanb030f022009-04-19 21:38:35 +00002005 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002006
Torok Edwin5f6c1942009-06-30 17:10:35 +00002007public:
Mike Stump1eb44332009-09-09 15:08:12 +00002008 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002009 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2010 HasAlignMac68kSupport = true;
2011 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002012};
2013} // end anonymous namespace.
2014
Reid Spencer5f016e22007-07-11 17:01:13 +00002015namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00002016class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00002017 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2018 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002019 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00002020public:
Eli Friedman01b86682008-08-20 07:28:14 +00002021 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2022 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00002023 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 +00002024 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00002025 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002026 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2027 const std::string &Name,
2028 bool Enabled) const {
2029 if (Name == "soft-float")
2030 Features[Name] = Enabled;
2031 else
2032 return false;
2033
2034 return true;
2035 }
2036 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2037 SoftFloat = false;
2038 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2039 if (Features[i] == "+soft-float")
2040 SoftFloat = true;
2041 }
Chris Lattner33328642009-03-20 15:52:06 +00002042 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002043 MacroBuilder &Builder) const {
2044 DefineStd(Builder, "sparc", Opts);
2045 Builder.defineMacro("__sparcv8");
2046 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002047
2048 if (SoftFloat)
2049 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00002050 }
2051 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2052 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002053 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00002054 }
2055 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002056 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00002057 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002058 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002059 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002060 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002061 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002062 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00002063 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002064 // FIXME: Implement!
2065 return false;
Gabor Greif26658672008-02-21 16:29:08 +00002066 }
2067 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002068 // FIXME: Implement!
2069 return "";
Gabor Greif26658672008-02-21 16:29:08 +00002070 }
2071};
2072
Chris Lattnere957f532009-01-27 01:58:38 +00002073const char * const SparcV8TargetInfo::GCCRegNames[] = {
2074 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2075 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2076 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2077 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2078};
2079
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002080void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002081 unsigned &NumNames) const {
2082 Names = GCCRegNames;
2083 NumNames = llvm::array_lengthof(GCCRegNames);
2084}
2085
2086const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002087 { { "g0" }, "r0" },
2088 { { "g1" }, "r1" },
2089 { { "g2" }, "r2" },
2090 { { "g3" }, "r3" },
2091 { { "g4" }, "r4" },
2092 { { "g5" }, "r5" },
2093 { { "g6" }, "r6" },
2094 { { "g7" }, "r7" },
2095 { { "o0" }, "r8" },
2096 { { "o1" }, "r9" },
2097 { { "o2" }, "r10" },
2098 { { "o3" }, "r11" },
2099 { { "o4" }, "r12" },
2100 { { "o5" }, "r13" },
2101 { { "o6", "sp" }, "r14" },
2102 { { "o7" }, "r15" },
2103 { { "l0" }, "r16" },
2104 { { "l1" }, "r17" },
2105 { { "l2" }, "r18" },
2106 { { "l3" }, "r19" },
2107 { { "l4" }, "r20" },
2108 { { "l5" }, "r21" },
2109 { { "l6" }, "r22" },
2110 { { "l7" }, "r23" },
2111 { { "i0" }, "r24" },
2112 { { "i1" }, "r25" },
2113 { { "i2" }, "r26" },
2114 { { "i3" }, "r27" },
2115 { { "i4" }, "r28" },
2116 { { "i5" }, "r29" },
2117 { { "i6", "fp" }, "r30" },
2118 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00002119};
2120
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002121void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002122 unsigned &NumAliases) const {
2123 Aliases = GCCRegAliases;
2124 NumAliases = llvm::array_lengthof(GCCRegAliases);
2125}
Gabor Greif26658672008-02-21 16:29:08 +00002126} // end anonymous namespace.
2127
Eli Friedman01b86682008-08-20 07:28:14 +00002128namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002129class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2130public:
2131 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2132 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2133 SizeType = UnsignedInt;
2134 PtrDiffType = SignedInt;
2135 }
2136};
Torok Edwin5f6c1942009-06-30 17:10:35 +00002137class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00002138public:
2139 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002140 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00002141 SizeType = UnsignedInt;
2142 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00002143 }
2144};
2145} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00002146
Chris Lattner2621fd12008-05-08 05:58:21 +00002147namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002148 class MSP430TargetInfo : public TargetInfo {
2149 static const char * const GCCRegNames[];
2150 public:
2151 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2152 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00002153 IntWidth = 16; IntAlign = 16;
2154 LongWidth = 32; LongLongWidth = 64;
2155 LongAlign = LongLongAlign = 16;
2156 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002157 SizeType = UnsignedInt;
2158 IntMaxType = SignedLong;
2159 UIntMaxType = UnsignedLong;
2160 IntPtrType = SignedShort;
2161 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00002162 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00002163 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002164 }
2165 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002166 MacroBuilder &Builder) const {
2167 Builder.defineMacro("MSP430");
2168 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002169 // FIXME: defines for different 'flavours' of MCU
2170 }
2171 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2172 unsigned &NumRecords) const {
2173 // FIXME: Implement.
2174 Records = 0;
2175 NumRecords = 0;
2176 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002177 virtual void getGCCRegNames(const char * const *&Names,
2178 unsigned &NumNames) const;
2179 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2180 unsigned &NumAliases) const {
2181 // No aliases.
2182 Aliases = 0;
2183 NumAliases = 0;
2184 }
2185 virtual bool validateAsmConstraint(const char *&Name,
2186 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00002187 // No target constraints for now.
2188 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002189 }
2190 virtual const char *getClobbers() const {
2191 // FIXME: Is this really right?
2192 return "";
2193 }
2194 virtual const char *getVAListDeclaration() const {
2195 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00002196 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002197 }
2198 };
2199
2200 const char * const MSP430TargetInfo::GCCRegNames[] = {
2201 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2202 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2203 };
2204
2205 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2206 unsigned &NumNames) const {
2207 Names = GCCRegNames;
2208 NumNames = llvm::array_lengthof(GCCRegNames);
2209 }
2210}
2211
2212
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002213namespace {
2214 class SystemZTargetInfo : public TargetInfo {
2215 static const char * const GCCRegNames[];
2216 public:
2217 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2218 TLSSupported = false;
2219 IntWidth = IntAlign = 32;
2220 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2221 PointerWidth = PointerAlign = 64;
Chris Lattner1932e122009-11-07 18:59:41 +00002222 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2223 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002224 }
2225 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002226 MacroBuilder &Builder) const {
2227 Builder.defineMacro("__s390__");
2228 Builder.defineMacro("__s390x__");
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002229 }
2230 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2231 unsigned &NumRecords) const {
2232 // FIXME: Implement.
2233 Records = 0;
2234 NumRecords = 0;
2235 }
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002236
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002237 virtual void getGCCRegNames(const char * const *&Names,
2238 unsigned &NumNames) const;
2239 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2240 unsigned &NumAliases) const {
2241 // No aliases.
2242 Aliases = 0;
2243 NumAliases = 0;
2244 }
2245 virtual bool validateAsmConstraint(const char *&Name,
2246 TargetInfo::ConstraintInfo &info) const {
2247 // FIXME: implement
2248 return true;
2249 }
2250 virtual const char *getClobbers() const {
2251 // FIXME: Is this really right?
2252 return "";
2253 }
2254 virtual const char *getVAListDeclaration() const {
2255 // FIXME: implement
2256 return "typedef char* __builtin_va_list;";
2257 }
2258 };
2259
2260 const char * const SystemZTargetInfo::GCCRegNames[] = {
2261 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2262 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2263 };
2264
2265 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2266 unsigned &NumNames) const {
2267 Names = GCCRegNames;
2268 NumNames = llvm::array_lengthof(GCCRegNames);
2269 }
2270}
2271
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002272namespace {
2273 class BlackfinTargetInfo : public TargetInfo {
2274 static const char * const GCCRegNames[];
2275 public:
2276 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2277 TLSSupported = false;
2278 DoubleAlign = 32;
2279 LongLongAlign = 32;
2280 LongDoubleAlign = 32;
Chris Lattner1932e122009-11-07 18:59:41 +00002281 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002282 }
2283
2284 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002285 MacroBuilder &Builder) const {
2286 DefineStd(Builder, "bfin", Opts);
2287 DefineStd(Builder, "BFIN", Opts);
2288 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002289 // FIXME: This one is really dependent on -mcpu
Benjamin Kramera9992772010-01-09 17:55:51 +00002290 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002291 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2292 }
2293
2294 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2295 unsigned &NumRecords) const {
2296 // FIXME: Implement.
2297 Records = 0;
2298 NumRecords = 0;
2299 }
2300
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002301 virtual void getGCCRegNames(const char * const *&Names,
2302 unsigned &NumNames) const;
2303
2304 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2305 unsigned &NumAliases) const {
2306 // No aliases.
2307 Aliases = 0;
2308 NumAliases = 0;
2309 }
2310
2311 virtual bool validateAsmConstraint(const char *&Name,
2312 TargetInfo::ConstraintInfo &Info) const {
2313 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2314 Info.setAllowsRegister();
2315 return true;
2316 }
2317 return false;
2318 }
2319
2320 virtual const char *getClobbers() const {
2321 return "";
2322 }
2323
2324 virtual const char *getVAListDeclaration() const {
2325 return "typedef char* __builtin_va_list;";
2326 }
2327 };
2328
2329 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2330 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2331 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2332 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2333 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2334 "a0", "a1", "cc",
2335 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2336 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2337 };
2338
2339 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2340 unsigned &NumNames) const {
2341 Names = GCCRegNames;
2342 NumNames = llvm::array_lengthof(GCCRegNames);
2343 }
2344}
2345
Eli Friedmanb63decf2009-08-19 20:47:07 +00002346namespace {
2347
Mike Stump1eb44332009-09-09 15:08:12 +00002348 // LLVM and Clang cannot be used directly to output native binaries for
2349 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00002350 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00002351 //
2352 // TCE uses the llvm bitcode as input and uses it for generating customized
2353 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00002354 // publicly available in http://tce.cs.tut.fi
2355
2356 class TCETargetInfo : public TargetInfo{
2357 public:
2358 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2359 TLSSupported = false;
2360 IntWidth = 32;
2361 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00002362 PointerWidth = 32;
2363 IntAlign = 32;
2364 LongAlign = LongLongAlign = 32;
2365 PointerAlign = 32;
2366 SizeType = UnsignedInt;
2367 IntMaxType = SignedLong;
2368 UIntMaxType = UnsignedLong;
2369 IntPtrType = SignedInt;
2370 PtrDiffType = SignedInt;
2371 FloatWidth = 32;
2372 FloatAlign = 32;
2373 DoubleWidth = 32;
2374 DoubleAlign = 32;
2375 LongDoubleWidth = 32;
2376 LongDoubleAlign = 32;
2377 FloatFormat = &llvm::APFloat::IEEEsingle;
2378 DoubleFormat = &llvm::APFloat::IEEEsingle;
2379 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00002380 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2381 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00002382 "f32:32:32-f64:32:32-v64:32:32-"
2383 "v128:32:32-a0:0:32-n32";
Eli Friedmanb63decf2009-08-19 20:47:07 +00002384 }
2385
2386 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002387 MacroBuilder &Builder) const {
2388 DefineStd(Builder, "tce", Opts);
2389 Builder.defineMacro("__TCE__");
2390 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00002391 }
2392 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2393 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00002394 virtual const char *getClobbers() const {
2395 return "";
2396 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002397 virtual const char *getVAListDeclaration() const {
2398 return "typedef void* __builtin_va_list;";
2399 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002400 virtual void getGCCRegNames(const char * const *&Names,
2401 unsigned &NumNames) const {}
2402 virtual bool validateAsmConstraint(const char *&Name,
2403 TargetInfo::ConstraintInfo &info) const {
2404 return true;
2405 }
2406 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2407 unsigned &NumAliases) const {}
2408 };
2409}
2410
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002411namespace {
2412class MipsTargetInfo : public TargetInfo {
Eric Christophered734732010-03-02 02:41:08 +00002413 std::string ABI, CPU;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002414 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2415 static const char * const GCCRegNames[];
2416public:
Eric Christophered734732010-03-02 02:41:08 +00002417 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002418 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2419 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2420 }
Eric Christophered734732010-03-02 02:41:08 +00002421 virtual const char *getABI() const { return ABI.c_str(); }
2422 virtual bool setABI(const std::string &Name) {
2423
2424 if ((Name == "o32") || (Name == "eabi")) {
2425 ABI = Name;
2426 return true;
2427 } else
2428 return false;
2429 }
2430 virtual bool setCPU(const std::string &Name) {
2431 CPU = Name;
2432 return true;
2433 }
2434 void getDefaultFeatures(const std::string &CPU,
2435 llvm::StringMap<bool> &Features) const {
2436 Features[ABI] = true;
2437 Features[CPU] = true;
2438 }
2439 virtual void getArchDefines(const LangOptions &Opts,
2440 MacroBuilder &Builder) const {
2441 if (ABI == "o32")
2442 Builder.defineMacro("__mips_o32");
2443 else if (ABI == "eabi")
2444 Builder.defineMacro("__mips_eabi");
2445 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002446 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002447 MacroBuilder &Builder) const {
2448 DefineStd(Builder, "mips", Opts);
2449 Builder.defineMacro("_mips");
2450 DefineStd(Builder, "MIPSEB", Opts);
2451 Builder.defineMacro("_MIPSEB");
2452 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002453 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002454 }
2455 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2456 unsigned &NumRecords) const {
2457 // FIXME: Implement!
2458 }
2459 virtual const char *getVAListDeclaration() const {
2460 return "typedef void* __builtin_va_list;";
2461 }
2462 virtual void getGCCRegNames(const char * const *&Names,
2463 unsigned &NumNames) const;
2464 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2465 unsigned &NumAliases) const;
2466 virtual bool validateAsmConstraint(const char *&Name,
2467 TargetInfo::ConstraintInfo &Info) const {
2468 switch (*Name) {
2469 default:
2470 case 'r': // CPU registers.
2471 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2472 case 'y': // Equivalent to "r", backwards compatibility only.
2473 case 'f': // floating-point registers.
2474 Info.setAllowsRegister();
2475 return true;
2476 }
2477 return false;
2478 }
2479
2480 virtual const char *getClobbers() const {
2481 // FIXME: Implement!
2482 return "";
2483 }
2484};
2485
2486const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer20249a12010-10-21 03:16:25 +00002487 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002488 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2489 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2490 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2491 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2492 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2493 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2494 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2495 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2496 "$fcc5","$fcc6","$fcc7"
2497};
2498
2499void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2500 unsigned &NumNames) const {
2501 Names = GCCRegNames;
2502 NumNames = llvm::array_lengthof(GCCRegNames);
2503}
2504
2505const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2506 { { "at" }, "$1" },
2507 { { "v0" }, "$2" },
2508 { { "v1" }, "$3" },
2509 { { "a0" }, "$4" },
2510 { { "a1" }, "$5" },
2511 { { "a2" }, "$6" },
2512 { { "a3" }, "$7" },
2513 { { "t0" }, "$8" },
2514 { { "t1" }, "$9" },
2515 { { "t2" }, "$10" },
2516 { { "t3" }, "$11" },
2517 { { "t4" }, "$12" },
2518 { { "t5" }, "$13" },
2519 { { "t6" }, "$14" },
2520 { { "t7" }, "$15" },
2521 { { "s0" }, "$16" },
2522 { { "s1" }, "$17" },
2523 { { "s2" }, "$18" },
2524 { { "s3" }, "$19" },
2525 { { "s4" }, "$20" },
2526 { { "s5" }, "$21" },
2527 { { "s6" }, "$22" },
2528 { { "s7" }, "$23" },
2529 { { "t8" }, "$24" },
2530 { { "t9" }, "$25" },
2531 { { "k0" }, "$26" },
2532 { { "k1" }, "$27" },
2533 { { "gp" }, "$28" },
2534 { { "sp" }, "$29" },
2535 { { "fp" }, "$30" },
2536 { { "ra" }, "$31" }
2537};
2538
2539void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2540 unsigned &NumAliases) const {
2541 Aliases = GCCRegAliases;
2542 NumAliases = llvm::array_lengthof(GCCRegAliases);
2543}
2544} // end anonymous namespace.
2545
2546namespace {
2547class MipselTargetInfo : public MipsTargetInfo {
2548public:
2549 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2550 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2551 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2552 }
2553
2554 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002555 MacroBuilder &Builder) const;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002556};
2557
2558void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002559 MacroBuilder &Builder) const {
2560 DefineStd(Builder, "mips", Opts);
2561 Builder.defineMacro("_mips");
2562 DefineStd(Builder, "MIPSEL", Opts);
2563 Builder.defineMacro("_MIPSEL");
2564 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002565 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002566}
2567} // end anonymous namespace.
2568
Reid Spencer5f016e22007-07-11 17:01:13 +00002569//===----------------------------------------------------------------------===//
2570// Driver code
2571//===----------------------------------------------------------------------===//
2572
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002573static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002574 llvm::Triple Triple(T);
2575 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00002576
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002577 switch (Triple.getArch()) {
2578 default:
2579 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00002580
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002581 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00002582 case llvm::Triple::thumb:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002583 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00002584 case llvm::Triple::Linux:
2585 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002586 case llvm::Triple::Darwin:
Eli Friedmaned855cb2008-08-21 00:13:15 +00002587 return new DarwinARMTargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002588 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002589 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002590 default:
2591 return new ARMTargetInfo(T);
2592 }
Eli Friedman61538a72008-05-20 14:21:01 +00002593
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002594 case llvm::Triple::bfin:
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002595 return new BlackfinTargetInfo(T);
2596
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002597 case llvm::Triple::msp430:
2598 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00002599
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002600 case llvm::Triple::mips:
2601 if (os == llvm::Triple::Psp)
2602 return new PSPTargetInfo<MipsTargetInfo>(T);
2603 if (os == llvm::Triple::Linux)
2604 return new LinuxTargetInfo<MipsTargetInfo>(T);
2605 return new MipsTargetInfo(T);
2606
2607 case llvm::Triple::mipsel:
2608 if (os == llvm::Triple::Psp)
2609 return new PSPTargetInfo<MipselTargetInfo>(T);
2610 if (os == llvm::Triple::Linux)
2611 return new LinuxTargetInfo<MipselTargetInfo>(T);
2612 return new MipselTargetInfo(T);
2613
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002614 case llvm::Triple::ppc:
2615 if (os == llvm::Triple::Darwin)
Roman Divackyc81f2a22011-01-06 08:27:10 +00002616 return new DarwinPPC32TargetInfo(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002617 else if (os == llvm::Triple::FreeBSD)
2618 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002619 return new PPC32TargetInfo(T);
2620
2621 case llvm::Triple::ppc64:
2622 if (os == llvm::Triple::Darwin)
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00002623 return new DarwinPPC64TargetInfo(T);
John Thompson3f6918a2009-11-19 17:18:50 +00002624 else if (os == llvm::Triple::Lv2)
2625 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002626 else if (os == llvm::Triple::FreeBSD)
2627 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002628 return new PPC64TargetInfo(T);
2629
Chris Lattner9cbeb632010-03-06 21:21:27 +00002630 case llvm::Triple::mblaze:
2631 return new MBlazeTargetInfo(T);
2632
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002633 case llvm::Triple::sparc:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002634 if (os == llvm::Triple::AuroraUX)
2635 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002636 if (os == llvm::Triple::Solaris)
2637 return new SolarisSparcV8TargetInfo(T);
2638 return new SparcV8TargetInfo(T);
2639
John Thompson3f6918a2009-11-19 17:18:50 +00002640 // FIXME: Need a real SPU target.
2641 case llvm::Triple::cellspu:
2642 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2643
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002644 case llvm::Triple::systemz:
2645 return new SystemZTargetInfo(T);
2646
Eli Friedmanb63decf2009-08-19 20:47:07 +00002647 case llvm::Triple::tce:
2648 return new TCETargetInfo(T);
2649
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002650 case llvm::Triple::x86:
2651 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002652 case llvm::Triple::AuroraUX:
2653 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002654 case llvm::Triple::Darwin:
2655 return new DarwinI386TargetInfo(T);
2656 case llvm::Triple::Linux:
2657 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2658 case llvm::Triple::DragonFly:
2659 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2660 case llvm::Triple::NetBSD:
2661 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2662 case llvm::Triple::OpenBSD:
2663 return new OpenBSDI386TargetInfo(T);
2664 case llvm::Triple::FreeBSD:
2665 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00002666 case llvm::Triple::Minix:
2667 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002668 case llvm::Triple::Solaris:
2669 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2670 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002671 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002672 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002673 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002674 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00002675 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00002676 case llvm::Triple::Haiku:
2677 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002678 default:
2679 return new X86_32TargetInfo(T);
2680 }
2681
2682 case llvm::Triple::x86_64:
2683 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002684 case llvm::Triple::AuroraUX:
2685 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002686 case llvm::Triple::Darwin:
2687 return new DarwinX86_64TargetInfo(T);
2688 case llvm::Triple::Linux:
2689 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00002690 case llvm::Triple::DragonFly:
2691 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002692 case llvm::Triple::NetBSD:
2693 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2694 case llvm::Triple::OpenBSD:
2695 return new OpenBSDX86_64TargetInfo(T);
2696 case llvm::Triple::FreeBSD:
2697 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2698 case llvm::Triple::Solaris:
2699 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00002700 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002701 return new MinGWX86_64TargetInfo(T);
2702 case llvm::Triple::Win32: // This is what Triple.h supports now.
Douglas Gregorfb7049a2011-02-01 15:06:18 +00002703 if (Triple.getEnvironment() == llvm::Triple::MachO)
2704 return new DarwinX86_64TargetInfo(T);
2705 else
2706 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002707 default:
2708 return new X86_64TargetInfo(T);
2709 }
2710 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002711}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002712
2713/// CreateTargetInfo - Return the target info object for the specified target
2714/// triple.
2715TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002716 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002717 llvm::Triple Triple(Opts.Triple);
2718
2719 // Construct the target
2720 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2721 if (!Target) {
2722 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2723 return 0;
2724 }
2725
Daniel Dunbareac7c532009-12-18 18:42:37 +00002726 // Set the target CPU if specified.
2727 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2728 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2729 return 0;
2730 }
2731
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002732 // Set the target ABI if specified.
2733 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2734 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2735 return 0;
2736 }
2737
Charles Davis98b7c5c2010-06-11 01:06:47 +00002738 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00002739 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00002740 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2741 return 0;
2742 }
2743
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002744 // Compute the default target features, we need the target to handle this
2745 // because features may have dependencies on one another.
2746 llvm::StringMap<bool> Features;
2747 Target->getDefaultFeatures(Opts.CPU, Features);
2748
2749 // Apply the user specified deltas.
2750 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2751 ie = Opts.Features.end(); it != ie; ++it) {
2752 const char *Name = it->c_str();
2753
2754 // Apply the feature via the target.
2755 if ((Name[0] != '-' && Name[0] != '+') ||
2756 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2757 Diags.Report(diag::err_target_invalid_feature) << Name;
2758 return 0;
2759 }
2760 }
2761
2762 // Add the features to the compile options.
2763 //
2764 // FIXME: If we are completely confident that we have the right set, we only
2765 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002766 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002767 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2768 ie = Features.end(); it != ie; ++it)
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002769 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2770 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002771
2772 return Target.take();
2773}