blob: 038c02d9b27a861886aa35632bd9afe048abf40d [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;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000162 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000163 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000164 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000165 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000166
Anders Carlsson18af3682010-06-08 22:47:50 +0000167 virtual const char *getStaticInitSectionSpecifier() const {
168 // FIXME: We should return 0 when building kexts.
169 return "__TEXT,__StaticInit,regular,pure_instructions";
170 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000171
Torok Edwin5f6c1942009-06-30 17:10:35 +0000172};
173
Chris Lattner797c3c42009-08-10 19:03:04 +0000174
Torok Edwin5f6c1942009-06-30 17:10:35 +0000175// DragonFlyBSD Target
176template<typename Target>
177class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
178protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000179 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000180 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000181 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000182 Builder.defineMacro("__DragonFly__");
183 Builder.defineMacro("__DragonFly_cc_version", "100001");
184 Builder.defineMacro("__ELF__");
185 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
186 Builder.defineMacro("__tune_i386__");
187 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000188 }
189public:
Mike Stump1eb44332009-09-09 15:08:12 +0000190 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000191 : OSTargetInfo<Target>(triple) {}
192};
193
194// FreeBSD Target
195template<typename Target>
196class FreeBSDTargetInfo : public OSTargetInfo<Target> {
197protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000198 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000199 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000200 // FreeBSD defines; list based off of gcc output
201
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000202 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000203 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000204
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000205 Builder.defineMacro("__FreeBSD__", Release);
206 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramera9992772010-01-09 17:55:51 +0000207 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
208 DefineStd(Builder, "unix", Opts);
209 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000210 }
211public:
Mike Stump1eb44332009-09-09 15:08:12 +0000212 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000213 : OSTargetInfo<Target>(triple) {
214 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000215
216 llvm::Triple Triple(triple);
217 switch (Triple.getArch()) {
218 default:
219 case llvm::Triple::x86:
220 case llvm::Triple::x86_64:
221 this->MCountName = ".mcount";
222 break;
223 case llvm::Triple::mips:
224 case llvm::Triple::mipsel:
225 case llvm::Triple::ppc:
226 case llvm::Triple::ppc64:
227 this->MCountName = "_mcount";
228 break;
229 case llvm::Triple::arm:
230 this->MCountName = "__mcount";
231 break;
232 }
233
Duncan Sands1e90faf2009-07-08 13:55:08 +0000234 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000235};
236
Chris Lattner38e317d2010-07-07 16:01:42 +0000237// Minix Target
238template<typename Target>
239class MinixTargetInfo : public OSTargetInfo<Target> {
240protected:
241 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
242 MacroBuilder &Builder) const {
243 // Minix defines
244
245 Builder.defineMacro("__minix", "3");
246 Builder.defineMacro("_EM_WSIZE", "4");
247 Builder.defineMacro("_EM_PSIZE", "4");
248 Builder.defineMacro("_EM_SSIZE", "2");
249 Builder.defineMacro("_EM_LSIZE", "4");
250 Builder.defineMacro("_EM_FSIZE", "4");
251 Builder.defineMacro("_EM_DSIZE", "8");
252 DefineStd(Builder, "unix", Opts);
253 }
254public:
255 MinixTargetInfo(const std::string &triple)
256 : OSTargetInfo<Target>(triple) {
257 this->UserLabelPrefix = "";
258 }
259};
260
Torok Edwin5f6c1942009-06-30 17:10:35 +0000261// Linux target
262template<typename Target>
263class LinuxTargetInfo : public OSTargetInfo<Target> {
264protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000265 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000266 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000267 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000268 DefineStd(Builder, "unix", Opts);
269 DefineStd(Builder, "linux", Opts);
270 Builder.defineMacro("__gnu_linux__");
271 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000272 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000273 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000274 if (Opts.CPlusPlus)
275 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000276 }
277public:
Mike Stump1eb44332009-09-09 15:08:12 +0000278 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000279 : OSTargetInfo<Target>(triple) {
280 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000281 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000282 }
283};
284
Chris Lattnerb62bb282009-07-13 20:29:08 +0000285// NetBSD Target
286template<typename Target>
287class NetBSDTargetInfo : public OSTargetInfo<Target> {
288protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000289 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000290 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000291 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000292 Builder.defineMacro("__NetBSD__");
293 Builder.defineMacro("__unix__");
294 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000295 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000296 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000297 }
298public:
Mike Stump1eb44332009-09-09 15:08:12 +0000299 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000300 : OSTargetInfo<Target>(triple) {
301 this->UserLabelPrefix = "";
302 }
303};
304
Torok Edwin5f6c1942009-06-30 17:10:35 +0000305// OpenBSD Target
306template<typename Target>
307class OpenBSDTargetInfo : public OSTargetInfo<Target> {
308protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000309 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000310 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000311 // OpenBSD defines; list based off of gcc output
312
Benjamin Kramera9992772010-01-09 17:55:51 +0000313 Builder.defineMacro("__OpenBSD__");
314 DefineStd(Builder, "unix", Opts);
315 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000316 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000317 Builder.defineMacro("_POSIX_THREADS");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000318 }
319public:
Mike Stump1eb44332009-09-09 15:08:12 +0000320 OpenBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000321 : OSTargetInfo<Target>(triple) {}
322};
323
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000324// PSP Target
325template<typename Target>
326class PSPTargetInfo : public OSTargetInfo<Target> {
327protected:
328 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000329 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000330 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000331 Builder.defineMacro("PSP");
332 Builder.defineMacro("_PSP");
333 Builder.defineMacro("__psp__");
334 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000335 }
336public:
337 PSPTargetInfo(const std::string& triple)
338 : OSTargetInfo<Target>(triple) {
339 this->UserLabelPrefix = "";
340 }
341};
342
John Thompson3f6918a2009-11-19 17:18:50 +0000343// PS3 PPU Target
344template<typename Target>
345class PS3PPUTargetInfo : public OSTargetInfo<Target> {
346protected:
347 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000348 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000349 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000350 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000351 Builder.defineMacro("__PPU__");
352 Builder.defineMacro("__CELLOS_LV2__");
353 Builder.defineMacro("__ELF__");
354 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000355 Builder.defineMacro("_ARCH_PPC64");
356 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000357 }
358public:
359 PS3PPUTargetInfo(const std::string& triple)
360 : OSTargetInfo<Target>(triple) {
361 this->UserLabelPrefix = "";
John Thompsonec387af2009-12-18 14:21:08 +0000362 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000363 this->IntMaxType = TargetInfo::SignedLongLong;
364 this->UIntMaxType = TargetInfo::UnsignedLongLong;
365 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000366 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000367 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
368 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000369 }
370};
371
372// FIXME: Need a real SPU target.
373// PS3 SPU Target
374template<typename Target>
375class PS3SPUTargetInfo : public OSTargetInfo<Target> {
376protected:
377 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000378 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000379 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000380 Builder.defineMacro("__SPU__");
381 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000382 }
383public:
384 PS3SPUTargetInfo(const std::string& triple)
385 : OSTargetInfo<Target>(triple) {
386 this->UserLabelPrefix = "";
387 }
388};
389
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000390// AuroraUX target
391template<typename Target>
392class AuroraUXTargetInfo : public OSTargetInfo<Target> {
393protected:
394 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000395 MacroBuilder &Builder) const {
396 DefineStd(Builder, "sun", Opts);
397 DefineStd(Builder, "unix", Opts);
398 Builder.defineMacro("__ELF__");
399 Builder.defineMacro("__svr4__");
400 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000401 }
402public:
403 AuroraUXTargetInfo(const std::string& triple)
404 : OSTargetInfo<Target>(triple) {
405 this->UserLabelPrefix = "";
406 this->WCharType = this->SignedLong;
407 // FIXME: WIntType should be SignedLong
408 }
409};
410
Torok Edwin5f6c1942009-06-30 17:10:35 +0000411// Solaris target
412template<typename Target>
413class SolarisTargetInfo : public OSTargetInfo<Target> {
414protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000415 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000416 MacroBuilder &Builder) const {
417 DefineStd(Builder, "sun", Opts);
418 DefineStd(Builder, "unix", Opts);
419 Builder.defineMacro("__ELF__");
420 Builder.defineMacro("__svr4__");
421 Builder.defineMacro("__SVR4");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000422 }
423public:
Mike Stump1eb44332009-09-09 15:08:12 +0000424 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000425 : OSTargetInfo<Target>(triple) {
426 this->UserLabelPrefix = "";
427 this->WCharType = this->SignedLong;
428 // FIXME: WIntType should be SignedLong
429 }
430};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000431
432// Windows target
433template<typename Target>
434class WindowsTargetInfo : public OSTargetInfo<Target> {
435protected:
436 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
437 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000438 Builder.defineMacro("_WIN32");
439 }
440 void getVisualStudioDefines(const LangOptions &Opts,
441 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000442 if (Opts.CPlusPlus) {
443 if (Opts.RTTI)
444 Builder.defineMacro("_CPPRTTI");
445
446 if (Opts.Exceptions)
447 Builder.defineMacro("_CPPUNWIND");
448 }
449
450 if (!Opts.CharIsSigned)
451 Builder.defineMacro("_CHAR_UNSIGNED");
452
453 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
454 // but it works for now.
455 if (Opts.POSIXThreads)
456 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000457
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000458 if (Opts.MSCVersion != 0)
459 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
460
461 if (Opts.Microsoft) {
462 Builder.defineMacro("_MSC_EXTENSIONS");
463
464 if (Opts.CPlusPlus0x) {
465 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
466 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
467 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
468 }
469 }
470
471 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000472 }
473
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000474public:
475 WindowsTargetInfo(const std::string &triple)
476 : OSTargetInfo<Target>(triple) {}
477};
478
Mike Stump1eb44332009-09-09 15:08:12 +0000479} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000480
Chris Lattnerd29b6302008-10-05 21:50:58 +0000481//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000482// Specific target implementations.
483//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000484
Eli Friedmane4277982008-08-20 23:11:40 +0000485namespace {
486// PPC abstract base class
487class PPCTargetInfo : public TargetInfo {
488 static const Builtin::Info BuiltinInfo[];
489 static const char * const GCCRegNames[];
490 static const TargetInfo::GCCRegAlias GCCRegAliases[];
491
492public:
Eli Friedman15b91762009-06-05 07:05:05 +0000493 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
494
Eli Friedmane4277982008-08-20 23:11:40 +0000495 virtual void getTargetBuiltins(const Builtin::Info *&Records,
496 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000497 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000498 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000499 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000500
Chris Lattner33328642009-03-20 15:52:06 +0000501 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000502 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000503
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000504 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000505 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000506 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000507 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000508 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000509 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000510 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000511 default: return false;
512 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000513 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000514 case 'b': // Base register
515 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000516 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000517 break;
518 // FIXME: The following are added to allow parsing.
519 // I just took a guess at what the actions should be.
520 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000521 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000522 case 'v': // Altivec vector register
523 Info.setAllowsRegister();
524 break;
525 case 'w':
526 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000527 case 'd':// VSX vector register to hold vector double data
528 case 'f':// VSX vector register to hold vector float data
529 case 's':// VSX vector register to hold scalar float data
530 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000531 break;
532 default:
533 return false;
534 }
535 Info.setAllowsRegister();
536 Name++; // Skip over 'w'.
537 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000538 case 'h': // `MQ', `CTR', or `LINK' register
539 case 'q': // `MQ' register
540 case 'c': // `CTR' register
541 case 'l': // `LINK' register
542 case 'x': // `CR' register (condition register) number 0
543 case 'y': // `CR' register (condition register)
544 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000545 Info.setAllowsRegister();
546 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000547 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000548 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000549 // (use `L' instead for SImode constants)
550 case 'K': // Unsigned 16-bit constant
551 case 'L': // Signed 16-bit constant shifted left 16 bits
552 case 'M': // Constant larger than 31
553 case 'N': // Exact power of 2
554 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000555 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000556 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000557 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000558 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000559 break;
560 case 'm': // Memory operand. Note that on PowerPC targets, m can
561 // include addresses that update the base register. It
562 // is therefore only safe to use `m' in an asm statement
563 // if that asm statement accesses the operand exactly once.
564 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000565 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000566 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000567 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000568 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000569 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
570 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000571 // register to be updated.
572 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000573 if (Name[1] != 's')
574 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000575 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000576 // include any automodification of the base register. Unlike
577 // `m', this constraint can be used in asm statements that
578 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000579 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000580 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000581 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000582 break;
583 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000584 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000585 case 'Z': // Memory operand that is an indexed or indirect from a
586 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000587 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000588 Info.setAllowsMemory();
589 Info.setAllowsRegister();
590 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000591 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000592 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000593 // register (`p' is preferable for asm statements)
594 case 'S': // Constant suitable as a 64-bit mask operand
595 case 'T': // Constant suitable as a 32-bit mask operand
596 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000597 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000598 // instructions
599 case 'W': // Vector constant that does not require memory
600 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000601 break;
602 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000603 }
John Thompson8e6065a2010-06-24 22:44:13 +0000604 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000605 }
Eli Friedmane4277982008-08-20 23:11:40 +0000606 virtual const char *getClobbers() const {
607 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000608 }
Eli Friedmane4277982008-08-20 23:11:40 +0000609};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000610
Eli Friedmane4277982008-08-20 23:11:40 +0000611const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000612#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
613#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
614 ALL_LANGUAGES, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000615#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000616};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000617
618
Chris Lattnerc0f59212009-03-02 22:27:17 +0000619/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
620/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000621void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000622 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000623 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000624 Builder.defineMacro("__ppc__");
625 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000626 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000627 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000628 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000629 Builder.defineMacro("_ARCH_PPC64");
630 Builder.defineMacro("_LP64");
631 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000632 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000633 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000634 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000635 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000636 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000637
Chris Lattnerc0f59212009-03-02 22:27:17 +0000638 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +0000639 Builder.defineMacro("_BIG_ENDIAN");
640 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000641
Chris Lattnerc0f59212009-03-02 22:27:17 +0000642 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000643 Builder.defineMacro("__NATURAL_ALIGNMENT__");
644 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000645
Chris Lattnerc0f59212009-03-02 22:27:17 +0000646 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000647 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000648
John Thompson3f6918a2009-11-19 17:18:50 +0000649 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000650 Builder.defineMacro("__VEC__", "10206");
651 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000652 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000653}
654
Chris Lattner393ff042008-04-21 18:56:49 +0000655
Eli Friedmane4277982008-08-20 23:11:40 +0000656const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000657 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
658 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
659 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
660 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
661 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
662 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
663 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
664 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000665 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000666 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000667 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000668 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
669 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
670 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
671 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000672 "vrsave", "vscr",
673 "spe_acc", "spefscr",
674 "sfp"
675};
Reid Spencer5f016e22007-07-11 17:01:13 +0000676
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000677void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000678 unsigned &NumNames) const {
679 Names = GCCRegNames;
680 NumNames = llvm::array_lengthof(GCCRegNames);
681}
Reid Spencer5f016e22007-07-11 17:01:13 +0000682
Eli Friedmane4277982008-08-20 23:11:40 +0000683const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
684 // While some of these aliases do map to different registers
685 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000686 { { "0" }, "r0" },
687 { { "1"}, "r1" },
688 { { "2" }, "r2" },
689 { { "3" }, "r3" },
690 { { "4" }, "r4" },
691 { { "5" }, "r5" },
692 { { "6" }, "r6" },
693 { { "7" }, "r7" },
694 { { "8" }, "r8" },
695 { { "9" }, "r9" },
696 { { "10" }, "r10" },
697 { { "11" }, "r11" },
698 { { "12" }, "r12" },
699 { { "13" }, "r13" },
700 { { "14" }, "r14" },
701 { { "15" }, "r15" },
702 { { "16" }, "r16" },
703 { { "17" }, "r17" },
704 { { "18" }, "r18" },
705 { { "19" }, "r19" },
706 { { "20" }, "r20" },
707 { { "21" }, "r21" },
708 { { "22" }, "r22" },
709 { { "23" }, "r23" },
710 { { "24" }, "r24" },
711 { { "25" }, "r25" },
712 { { "26" }, "r26" },
713 { { "27" }, "r27" },
714 { { "28" }, "r28" },
715 { { "29" }, "r29" },
716 { { "30" }, "r30" },
717 { { "31" }, "r31" },
718 { { "fr0" }, "f0" },
719 { { "fr1" }, "f1" },
720 { { "fr2" }, "f2" },
721 { { "fr3" }, "f3" },
722 { { "fr4" }, "f4" },
723 { { "fr5" }, "f5" },
724 { { "fr6" }, "f6" },
725 { { "fr7" }, "f7" },
726 { { "fr8" }, "f8" },
727 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000728 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000729 { { "fr11" }, "f11" },
730 { { "fr12" }, "f12" },
731 { { "fr13" }, "f13" },
732 { { "fr14" }, "f14" },
733 { { "fr15" }, "f15" },
734 { { "fr16" }, "f16" },
735 { { "fr17" }, "f17" },
736 { { "fr18" }, "f18" },
737 { { "fr19" }, "f19" },
738 { { "fr20" }, "f20" },
739 { { "fr21" }, "f21" },
740 { { "fr22" }, "f22" },
741 { { "fr23" }, "f23" },
742 { { "fr24" }, "f24" },
743 { { "fr25" }, "f25" },
744 { { "fr26" }, "f26" },
745 { { "fr27" }, "f27" },
746 { { "fr28" }, "f28" },
747 { { "fr29" }, "f29" },
748 { { "fr30" }, "f30" },
749 { { "fr31" }, "f31" },
750 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000751};
752
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000753void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000754 unsigned &NumAliases) const {
755 Aliases = GCCRegAliases;
756 NumAliases = llvm::array_lengthof(GCCRegAliases);
757}
758} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000759
760namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000761class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000762public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000763 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000764 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 +0000765 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000766
767 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divackyc81f2a22011-01-06 08:27:10 +0000768 SizeType = UnsignedInt;
769 }
770
771 virtual const char *getVAListDeclaration() const {
772 // This is the ELF definition, and is overridden by the Darwin sub-target
773 return "typedef struct __va_list_tag {"
774 " unsigned char gpr;"
775 " unsigned char fpr;"
776 " unsigned short reserved;"
777 " void* overflow_arg_area;"
778 " void* reg_save_area;"
779 "} __builtin_va_list[1];";
Eli Friedmaned855cb2008-08-21 00:13:15 +0000780 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000781};
782} // end anonymous namespace.
783
784namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000785class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000786public:
Eli Friedmane4277982008-08-20 23:11:40 +0000787 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000788 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000789 IntMaxType = SignedLong;
790 UIntMaxType = UnsignedLong;
791 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000792 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 +0000793 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerf291b102008-05-09 06:17:04 +0000794 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000795 virtual const char *getVAListDeclaration() const {
796 return "typedef char* __builtin_va_list;";
797 }
Eli Friedmane4277982008-08-20 23:11:40 +0000798};
799} // end anonymous namespace.
800
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000801
802namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000803class DarwinPPC32TargetInfo :
804 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000805public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000806 DarwinPPC32TargetInfo(const std::string& triple)
807 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000808 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000809 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
810 }
811 virtual const char *getVAListDeclaration() const {
812 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000813 }
814};
815
816class DarwinPPC64TargetInfo :
817 public DarwinTargetInfo<PPC64TargetInfo> {
818public:
819 DarwinPPC64TargetInfo(const std::string& triple)
820 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
821 HasAlignMac68kSupport = true;
822 }
823};
824} // end anonymous namespace.
825
Reid Spencer5f016e22007-07-11 17:01:13 +0000826namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +0000827// MBlaze abstract base class
828class MBlazeTargetInfo : public TargetInfo {
829 static const char * const GCCRegNames[];
830 static const TargetInfo::GCCRegAlias GCCRegAliases[];
831
832public:
833 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +0000834 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +0000835 }
836
837 virtual void getTargetBuiltins(const Builtin::Info *&Records,
838 unsigned &NumRecords) const {
839 // FIXME: Implement.
840 Records = 0;
841 NumRecords = 0;
842 }
843
844 virtual void getTargetDefines(const LangOptions &Opts,
845 MacroBuilder &Builder) const;
846
847 virtual const char *getVAListDeclaration() const {
848 return "typedef char* __builtin_va_list;";
849 }
850 virtual const char *getTargetPrefix() const {
851 return "mblaze";
852 }
853 virtual void getGCCRegNames(const char * const *&Names,
854 unsigned &NumNames) const;
855 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
856 unsigned &NumAliases) const;
857 virtual bool validateAsmConstraint(const char *&Name,
858 TargetInfo::ConstraintInfo &Info) const {
859 switch (*Name) {
860 default: return false;
861 case 'O': // Zero
862 return true;
863 case 'b': // Base register
864 case 'f': // Floating point register
865 Info.setAllowsRegister();
866 return true;
867 }
868 }
869 virtual const char *getClobbers() const {
870 return "";
871 }
872};
873
874/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
875/// #defines that are not tied to a specific subtarget.
876void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
877 MacroBuilder &Builder) const {
878 // Target identification.
879 Builder.defineMacro("__microblaze__");
880 Builder.defineMacro("_ARCH_MICROBLAZE");
881 Builder.defineMacro("__MICROBLAZE__");
882
883 // Target properties.
884 Builder.defineMacro("_BIG_ENDIAN");
885 Builder.defineMacro("__BIG_ENDIAN__");
886
887 // Subtarget options.
888 Builder.defineMacro("__REGISTER_PREFIX__", "");
889}
890
891
892const char * const MBlazeTargetInfo::GCCRegNames[] = {
893 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
894 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
895 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
896 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
897 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
898 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
899 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
900 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
901 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
902 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
903};
904
905void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
906 unsigned &NumNames) const {
907 Names = GCCRegNames;
908 NumNames = llvm::array_lengthof(GCCRegNames);
909}
910
911const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
912 { {"f0"}, "r0" },
913 { {"f1"}, "r1" },
914 { {"f2"}, "r2" },
915 { {"f3"}, "r3" },
916 { {"f4"}, "r4" },
917 { {"f5"}, "r5" },
918 { {"f6"}, "r6" },
919 { {"f7"}, "r7" },
920 { {"f8"}, "r8" },
921 { {"f9"}, "r9" },
922 { {"f10"}, "r10" },
923 { {"f11"}, "r11" },
924 { {"f12"}, "r12" },
925 { {"f13"}, "r13" },
926 { {"f14"}, "r14" },
927 { {"f15"}, "r15" },
928 { {"f16"}, "r16" },
929 { {"f17"}, "r17" },
930 { {"f18"}, "r18" },
931 { {"f19"}, "r19" },
932 { {"f20"}, "r20" },
933 { {"f21"}, "r21" },
934 { {"f22"}, "r22" },
935 { {"f23"}, "r23" },
936 { {"f24"}, "r24" },
937 { {"f25"}, "r25" },
938 { {"f26"}, "r26" },
939 { {"f27"}, "r27" },
940 { {"f28"}, "r28" },
941 { {"f29"}, "r29" },
942 { {"f30"}, "r30" },
943 { {"f31"}, "r31" },
944};
945
946void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
947 unsigned &NumAliases) const {
948 Aliases = GCCRegAliases;
949 NumAliases = llvm::array_lengthof(GCCRegAliases);
950}
951} // end anonymous namespace.
952
953namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000954// Namespace for x86 abstract base class
955const Builtin::Info BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000956#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
957#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
958 ALL_LANGUAGES, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000959#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +0000960};
Eli Friedman61538a72008-05-20 14:21:01 +0000961
Nuno Lopes2550d702009-12-23 17:49:57 +0000962static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +0000963 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
964 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
965 "argp", "flags", "fspr", "dirflag", "frame",
966 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
967 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
968 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
969 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
970};
971
972const TargetInfo::GCCRegAlias GCCRegAliases[] = {
973 { { "al", "ah", "eax", "rax" }, "ax" },
974 { { "bl", "bh", "ebx", "rbx" }, "bx" },
975 { { "cl", "ch", "ecx", "rcx" }, "cx" },
976 { { "dl", "dh", "edx", "rdx" }, "dx" },
977 { { "esi", "rsi" }, "si" },
978 { { "edi", "rdi" }, "di" },
979 { { "esp", "rsp" }, "sp" },
980 { { "ebp", "rbp" }, "bp" },
981};
982
983// X86 target abstract base class; x86-32 and x86-64 are very close, so
984// most of the implementation can be shared.
985class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +0000986 enum X86SSEEnum {
987 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
988 } SSELevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +0000989 enum AMD3DNowEnum {
990 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
991 } AMD3DNowLevel;
992
Eric Christophereea12d12010-04-02 23:50:19 +0000993 bool HasAES;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +0000994 bool HasAVX;
995
Eli Friedman618234a2008-08-20 02:34:37 +0000996public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000997 X86TargetInfo(const std::string& triple)
Eric Christophereea12d12010-04-02 23:50:19 +0000998 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +0000999 HasAES(false), HasAVX(false) {
Eli Friedman618234a2008-08-20 02:34:37 +00001000 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001001 }
1002 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1003 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001004 Records = BuiltinInfo;
1005 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001006 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001007 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001008 unsigned &NumNames) const {
1009 Names = GCCRegNames;
1010 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001011 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001012 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001013 unsigned &NumAliases) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001014 Aliases = GCCRegAliases;
1015 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001016 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001017 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001018 TargetInfo::ConstraintInfo &info) const;
1019 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001020 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001021 return "~{dirflag},~{fpsr},~{flags}";
1022 }
Chris Lattner33328642009-03-20 15:52:06 +00001023 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001024 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001025 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1026 const std::string &Name,
1027 bool Enabled) const;
Mike Stump1eb44332009-09-09 15:08:12 +00001028 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001029 llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001030 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Reid Spencer5f016e22007-07-11 17:01:13 +00001031};
Chris Lattner3daed522009-03-02 22:20:04 +00001032
Mike Stump1eb44332009-09-09 15:08:12 +00001033void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001034 llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001035 // FIXME: This should not be here.
1036 Features["3dnow"] = false;
1037 Features["3dnowa"] = false;
1038 Features["mmx"] = false;
1039 Features["sse"] = false;
1040 Features["sse2"] = false;
1041 Features["sse3"] = false;
1042 Features["ssse3"] = false;
1043 Features["sse41"] = false;
1044 Features["sse42"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001045 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001046 Features["avx"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001047
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001048 // LLVM does not currently recognize this.
1049 // Features["sse4a"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001050
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001051 // FIXME: This *really* should not be here.
1052
1053 // X86_64 always has SSE2.
1054 if (PointerWidth == 64)
1055 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1056
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001057 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1058 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1059 ;
1060 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1061 setFeatureEnabled(Features, "mmx", true);
1062 else if (CPU == "pentium3")
1063 setFeatureEnabled(Features, "sse", true);
1064 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1065 setFeatureEnabled(Features, "sse2", true);
1066 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1067 setFeatureEnabled(Features, "sse3", true);
1068 else if (CPU == "core2")
1069 setFeatureEnabled(Features, "ssse3", true);
1070 else if (CPU == "penryn") {
1071 setFeatureEnabled(Features, "sse4", true);
1072 Features["sse42"] = false;
1073 } else if (CPU == "atom")
1074 setFeatureEnabled(Features, "sse3", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001075 else if (CPU == "corei7") {
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001076 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001077 setFeatureEnabled(Features, "aes", true);
1078 }
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001079 else if (CPU == "k6" || CPU == "winchip-c6")
1080 setFeatureEnabled(Features, "mmx", true);
Mike Stump1eb44332009-09-09 15:08:12 +00001081 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001082 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1083 setFeatureEnabled(Features, "mmx", true);
1084 setFeatureEnabled(Features, "3dnow", true);
1085 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1086 setFeatureEnabled(Features, "sse", true);
1087 setFeatureEnabled(Features, "3dnowa", true);
1088 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1089 CPU == "athlon-fx") {
Mike Stump1eb44332009-09-09 15:08:12 +00001090 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001091 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001092 } else if (CPU == "k8-sse3") {
1093 setFeatureEnabled(Features, "sse3", true);
1094 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001095 } else if (CPU == "c3-2")
1096 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001097}
1098
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001099bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001100 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001101 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001102 // FIXME: This *really* should not be here. We need some way of translating
1103 // options into llvm subtarget features.
1104 if (!Features.count(Name) &&
1105 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001106 return false;
1107
1108 if (Enabled) {
1109 if (Name == "mmx")
1110 Features["mmx"] = true;
1111 else if (Name == "sse")
1112 Features["mmx"] = Features["sse"] = true;
1113 else if (Name == "sse2")
1114 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1115 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001116 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001117 Features["sse3"] = true;
1118 else if (Name == "ssse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001119 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001120 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001121 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump1eb44332009-09-09 15:08:12 +00001122 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001123 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001124 else if (Name == "sse4.1")
1125 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1126 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001127 else if (Name == "3dnow")
1128 Features["3dnowa"] = true;
1129 else if (Name == "3dnowa")
1130 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001131 else if (Name == "aes")
1132 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001133 else if (Name == "avx")
1134 Features["avx"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001135 } else {
1136 if (Name == "mmx")
Mike Stump1eb44332009-09-09 15:08:12 +00001137 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001138 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1139 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001140 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001141 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1142 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001143 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001144 Features["sse41"] = Features["sse42"] = false;
1145 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001146 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001147 Features["sse42"] = false;
1148 else if (Name == "ssse3")
1149 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1150 else if (Name == "sse4")
1151 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001152 else if (Name == "sse4.2")
1153 Features["sse42"] = false;
1154 else if (Name == "sse4.1")
1155 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001156 else if (Name == "3dnow")
1157 Features["3dnow"] = Features["3dnowa"] = false;
1158 else if (Name == "3dnowa")
1159 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001160 else if (Name == "aes")
1161 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001162 else if (Name == "avx")
1163 Features["avx"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001164 }
1165
1166 return true;
1167}
1168
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001169/// HandleTargetOptions - Perform initialization based on the user
1170/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001171void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001172 // Remember the maximum enabled sselevel.
1173 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1174 // Ignore disabled features.
1175 if (Features[i][0] == '-')
1176 continue;
1177
Eric Christophereea12d12010-04-02 23:50:19 +00001178 if (Features[i].substr(1) == "aes") {
1179 HasAES = true;
1180 continue;
1181 }
1182
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001183 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1184 // For now let it be enabled together with other SSE levels.
1185 if (Features[i].substr(1) == "avx") {
1186 HasAVX = true;
1187 continue;
1188 }
1189
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001190 assert(Features[i][0] == '+' && "Invalid target feature!");
1191 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1192 .Case("sse42", SSE42)
1193 .Case("sse41", SSE41)
1194 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001195 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001196 .Case("sse2", SSE2)
1197 .Case("sse", SSE1)
1198 .Case("mmx", MMX)
1199 .Default(NoMMXSSE);
1200 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001201
1202 AMD3DNowEnum ThreeDNowLevel =
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001203 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1204 .Case("3dnowa", AMD3DNowAthlon)
1205 .Case("3dnow", AMD3DNow)
1206 .Default(NoAMD3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001207
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001208 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001209 }
Chris Lattner3daed522009-03-02 22:20:04 +00001210}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001211
1212/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1213/// that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001214void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001215 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001216 // Target identification.
1217 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001218 Builder.defineMacro("_LP64");
1219 Builder.defineMacro("__LP64__");
1220 Builder.defineMacro("__amd64__");
1221 Builder.defineMacro("__amd64");
1222 Builder.defineMacro("__x86_64");
1223 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001224 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001225 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001226 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001227
Eric Christophereea12d12010-04-02 23:50:19 +00001228 if (HasAES)
1229 Builder.defineMacro("__AES__");
1230
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001231 if (HasAVX)
1232 Builder.defineMacro("__AVX__");
1233
Chris Lattnerc0f59212009-03-02 22:27:17 +00001234 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001235 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001236
Chris Lattnerc0f59212009-03-02 22:27:17 +00001237 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +00001238 Builder.defineMacro("__nocona");
1239 Builder.defineMacro("__nocona__");
1240 Builder.defineMacro("__tune_nocona__");
1241 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001242
Chris Lattner54175442009-04-19 17:32:33 +00001243 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1244 // functions in glibc header files that use FP Stack inline asm which the
1245 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001246 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001247
Chris Lattner84f0ea82009-03-02 22:40:39 +00001248 // Each case falls through to the previous one here.
1249 switch (SSELevel) {
1250 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00001251 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001252 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00001253 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001254 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001255 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001256 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001257 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001258 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00001259 Builder.defineMacro("__SSE2__");
1260 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001261 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00001262 Builder.defineMacro("__SSE__");
1263 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001264 case MMX:
Benjamin Kramera9992772010-01-09 17:55:51 +00001265 Builder.defineMacro("__MMX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001266 case NoMMXSSE:
1267 break;
1268 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001269
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001270 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001271 switch (SSELevel) {
Michael J. Spencera764e832010-10-21 08:22:51 +00001272 case SSE42:
1273 case SSE41:
1274 case SSSE3:
1275 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001276 case SSE2:
1277 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1278 break;
1279 case SSE1:
1280 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1281 break;
1282 default:
1283 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1284 }
1285 }
1286
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001287 // Each case falls through to the previous one here.
1288 switch (AMD3DNowLevel) {
1289 case AMD3DNowAthlon:
1290 Builder.defineMacro("__3dNOW_A__");
1291 case AMD3DNow:
1292 Builder.defineMacro("__3dNOW__");
1293 case NoAMD3DNow:
1294 break;
1295 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00001296}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001297
1298
Eli Friedman618234a2008-08-20 02:34:37 +00001299bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001300X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001301 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001302 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00001303 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00001304 case 'Y': // first letter of a pair:
1305 switch (*(Name+1)) {
1306 default: return false;
1307 case '0': // First SSE register.
1308 case 't': // Any SSE register, when SSE2 is enabled.
1309 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1310 case 'm': // any MMX register, when inter-unit moves enabled.
1311 break; // falls through to setAllowsRegister.
1312 }
Eli Friedman618234a2008-08-20 02:34:37 +00001313 case 'a': // eax.
1314 case 'b': // ebx.
1315 case 'c': // ecx.
1316 case 'd': // edx.
1317 case 'S': // esi.
1318 case 'D': // edi.
1319 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00001320 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00001321 case 't': // top of floating point stack.
1322 case 'u': // second from top of floating point stack.
1323 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00001324 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00001325 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00001326 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00001327 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1328 case 'l': // "Index" registers: any general register that can be used as an
1329 // index in a base+index memory access.
1330 Info.setAllowsRegister();
1331 return true;
1332 case 'C': // SSE floating point constant.
1333 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001334 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001335 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001336 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001337 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00001338 return true;
1339 }
Dale Johannesen545be512010-08-24 22:33:12 +00001340 return false;
Eli Friedman618234a2008-08-20 02:34:37 +00001341}
1342
Dale Johannesenf6e2c202010-10-29 23:12:32 +00001343
Eli Friedman618234a2008-08-20 02:34:37 +00001344std::string
1345X86TargetInfo::convertConstraint(const char Constraint) const {
1346 switch (Constraint) {
1347 case 'a': return std::string("{ax}");
1348 case 'b': return std::string("{bx}");
1349 case 'c': return std::string("{cx}");
1350 case 'd': return std::string("{dx}");
1351 case 'S': return std::string("{si}");
1352 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00001353 case 'p': // address
1354 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00001355 case 't': // top of floating point stack.
1356 return std::string("{st}");
1357 case 'u': // second from top of floating point stack.
1358 return std::string("{st(1)}"); // second from top of floating point stack.
1359 default:
1360 return std::string(1, Constraint);
1361 }
1362}
Eli Friedman618234a2008-08-20 02:34:37 +00001363} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00001364
1365namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001366// X86-32 generic target
1367class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001368public:
Eli Friedman618234a2008-08-20 02:34:37 +00001369 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1370 DoubleAlign = LongLongAlign = 32;
1371 LongDoubleWidth = 96;
1372 LongDoubleAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001373 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1374 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001375 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman1afabd92009-03-29 20:31:09 +00001376 SizeType = UnsignedInt;
1377 PtrDiffType = SignedInt;
1378 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001379 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001380
1381 // Use fpret for all types.
1382 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1383 (1 << TargetInfo::Double) |
1384 (1 << TargetInfo::LongDouble));
Eli Friedman618234a2008-08-20 02:34:37 +00001385 }
1386 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001387 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00001388 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001389
Chris Lattner21fb98e2009-09-23 06:06:36 +00001390 int getEHDataRegisterNumber(unsigned RegNo) const {
1391 if (RegNo == 0) return 0;
1392 if (RegNo == 1) return 2;
1393 return -1;
1394 }
Eli Friedman618234a2008-08-20 02:34:37 +00001395};
1396} // end anonymous namespace
1397
1398namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00001399class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1400public:
1401 OpenBSDI386TargetInfo(const std::string& triple) :
1402 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1403 SizeType = UnsignedLong;
1404 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00001405 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00001406 }
1407};
1408} // end anonymous namespace
1409
1410namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00001411class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00001412public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00001413 DarwinI386TargetInfo(const std::string& triple) :
1414 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00001415 LongDoubleWidth = 128;
1416 LongDoubleAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00001417 SizeType = UnsignedLong;
1418 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001419 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1420 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001421 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbar613fd672010-05-27 00:35:16 +00001422 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00001423 }
1424
Eli Friedman618234a2008-08-20 02:34:37 +00001425};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001426} // end anonymous namespace
1427
1428namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00001429// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001430class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00001431public:
1432 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001433 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00001434 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00001435 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00001436 DoubleAlign = LongLongAlign = 64;
1437 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 +00001438 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1439 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedman29a30502008-08-21 01:40:19 +00001440 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001441 virtual void getTargetDefines(const LangOptions &Opts,
1442 MacroBuilder &Builder) const {
1443 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1444 }
1445};
1446} // end anonymous namespace
1447
1448namespace {
1449
1450// x86-32 Windows Visual Studio target
1451class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1452public:
1453 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1454 : WindowsX86_32TargetInfo(triple) {
1455 LongDoubleWidth = 64;
1456 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1457 }
1458 virtual void getTargetDefines(const LangOptions &Opts,
1459 MacroBuilder &Builder) const {
1460 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1461 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1462 // The value of the following reflects processor type.
1463 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1464 // We lost the original triple, so we use the default.
1465 Builder.defineMacro("_M_IX86", "600");
1466 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001467};
1468} // end anonymous namespace
1469
1470namespace {
1471// x86-32 MinGW target
1472class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1473public:
1474 MinGWX86_32TargetInfo(const std::string& triple)
1475 : WindowsX86_32TargetInfo(triple) {
1476 }
1477 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001478 MacroBuilder &Builder) const {
1479 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001480 DefineStd(Builder, "WIN32", Opts);
1481 DefineStd(Builder, "WINNT", Opts);
1482 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00001483 Builder.defineMacro("__MSVCRT__");
1484 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001485
1486 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1487 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1488 if (Opts.Microsoft)
1489 // Provide "as-is" __declspec.
1490 Builder.defineMacro("__declspec", "__declspec");
1491 else
1492 // Provide alias of __attribute__ like mingw32-gcc.
1493 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001494 }
1495};
1496} // end anonymous namespace
1497
1498namespace {
1499// x86-32 Cygwin target
1500class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1501public:
1502 CygwinX86_32TargetInfo(const std::string& triple)
1503 : X86_32TargetInfo(triple) {
1504 TLSSupported = false;
1505 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001506 DoubleAlign = LongLongAlign = 64;
1507 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1508 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001509 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001510 }
1511 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001512 MacroBuilder &Builder) const {
1513 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1514 Builder.defineMacro("__CYGWIN__");
1515 Builder.defineMacro("__CYGWIN32__");
1516 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00001517 if (Opts.CPlusPlus)
1518 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00001519 }
Eli Friedman29a30502008-08-21 01:40:19 +00001520};
1521} // end anonymous namespace
1522
1523namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00001524// x86-32 Haiku target
1525class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1526public:
1527 HaikuX86_32TargetInfo(const std::string& triple)
1528 : X86_32TargetInfo(triple) {
1529 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00001530 IntPtrType = SignedLong;
1531 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00001532 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00001533 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00001534 virtual void getTargetDefines(const LangOptions &Opts,
1535 MacroBuilder &Builder) const {
1536 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1537 Builder.defineMacro("__INTEL__");
1538 Builder.defineMacro("__HAIKU__");
1539 }
1540};
1541} // end anonymous namespace
1542
1543namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001544// x86-64 generic target
1545class X86_64TargetInfo : public X86TargetInfo {
1546public:
Chris Lattner33328642009-03-20 15:52:06 +00001547 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001548 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00001549 LongDoubleWidth = 128;
1550 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00001551 LargeArrayMinWidth = 128;
1552 LargeArrayAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00001553 IntMaxType = SignedLong;
1554 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001555 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001556 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00001557
Eli Friedmaned855cb2008-08-21 00:13:15 +00001558 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1559 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001560 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001561
1562 // Use fpret only for long double.
1563 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Reid Spencer5f016e22007-07-11 17:01:13 +00001564 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001565 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001566 return "typedef struct __va_list_tag {"
1567 " unsigned gp_offset;"
1568 " unsigned fp_offset;"
1569 " void* overflow_arg_area;"
1570 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00001571 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00001572 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00001573 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001574
Chris Lattner21fb98e2009-09-23 06:06:36 +00001575 int getEHDataRegisterNumber(unsigned RegNo) const {
1576 if (RegNo == 0) return 0;
1577 if (RegNo == 1) return 1;
1578 return -1;
1579 }
Eli Friedman618234a2008-08-20 02:34:37 +00001580};
1581} // end anonymous namespace
1582
1583namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001584// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001585class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001586public:
1587 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001588 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001589 TLSSupported = false;
1590 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00001591 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00001592 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00001593 IntMaxType = SignedLongLong;
1594 UIntMaxType = UnsignedLongLong;
1595 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00001596 SizeType = UnsignedLongLong;
1597 PtrDiffType = SignedLongLong;
1598 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00001599 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001600 }
1601 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001602 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001603 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001604 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00001605 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00001606 virtual const char *getVAListDeclaration() const {
1607 return "typedef char* __builtin_va_list;";
1608 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001609};
1610} // end anonymous namespace
1611
1612namespace {
1613// x86-64 Windows Visual Studio target
1614class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1615public:
1616 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1617 : WindowsX86_64TargetInfo(triple) {
1618 }
1619 virtual void getTargetDefines(const LangOptions &Opts,
1620 MacroBuilder &Builder) const {
1621 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1622 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00001623 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001624 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001625 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001626};
1627} // end anonymous namespace
1628
1629namespace {
1630// x86-64 MinGW target
1631class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1632public:
1633 MinGWX86_64TargetInfo(const std::string& triple)
1634 : WindowsX86_64TargetInfo(triple) {
1635 }
1636 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001637 MacroBuilder &Builder) const {
1638 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001639 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00001640 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00001641 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00001642 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001643
1644 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1645 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1646 if (Opts.Microsoft)
1647 // Provide "as-is" __declspec.
1648 Builder.defineMacro("__declspec", "__declspec");
1649 else
1650 // Provide alias of __attribute__ like mingw32-gcc.
1651 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001652 }
1653};
1654} // end anonymous namespace
1655
1656namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001657class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1658public:
Mike Stump1eb44332009-09-09 15:08:12 +00001659 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001660 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1661 Int64Type = SignedLongLong;
1662 }
1663};
1664} // end anonymous namespace
1665
1666namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00001667class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1668public:
Mike Stump1eb44332009-09-09 15:08:12 +00001669 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00001670 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1671 IntMaxType = SignedLongLong;
1672 UIntMaxType = UnsignedLongLong;
1673 Int64Type = SignedLongLong;
1674 }
1675};
1676} // end anonymous namespace
1677
1678namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00001679class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001680 // Possible FPU choices.
1681 enum FPUMode {
1682 NoFPU,
1683 VFP2FPU,
1684 VFP3FPU,
1685 NeonFPU
1686 };
1687
1688 static bool FPUModeIsVFP(FPUMode Mode) {
1689 return Mode >= VFP2FPU && Mode <= NeonFPU;
1690 }
1691
1692 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1693 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001694
Daniel Dunbareac7c532009-12-18 18:42:37 +00001695 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001696
1697 unsigned FPU : 3;
1698
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001699 unsigned IsThumb : 1;
1700
1701 // Initialized via features.
1702 unsigned SoftFloat : 1;
1703 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001704
Chris Lattner2752c012010-03-03 19:03:45 +00001705 static const Builtin::Info BuiltinInfo[];
1706
Chris Lattner393ff042008-04-21 18:56:49 +00001707public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001708 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00001709 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001710 {
Daniel Dunbara2a41612009-09-14 00:02:24 +00001711 SizeType = UnsignedInt;
1712 PtrDiffType = SignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001713
Chris Lattner9bffb072010-04-23 16:29:58 +00001714 // {} in inline assembly are neon specifiers, not assembly variant
1715 // specifiers.
1716 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00001717
Daniel Dunbareac7c532009-12-18 18:42:37 +00001718 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00001719 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001720 if (IsThumb) {
1721 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1722 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner1932e122009-11-07 18:59:41 +00001723 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001724 } else {
1725 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1726 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner1932e122009-11-07 18:59:41 +00001727 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001728 }
John McCallee79a4c2010-08-21 22:46:04 +00001729
1730 // ARM targets default to using the ARM C++ ABI.
1731 CXXABI = CXXABI_ARM;
Eli Friedman61538a72008-05-20 14:21:01 +00001732 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001733 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00001734 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001735 ABI = Name;
1736
Daniel Dunbara2a41612009-09-14 00:02:24 +00001737 // The defaults (above) are for AAPCS, check if we need to change them.
1738 //
1739 // FIXME: We need support for -meabi... we could just mangle it into the
1740 // name.
1741 if (Name == "apcs-gnu") {
Daniel Dunbard410fa22010-01-27 20:23:08 +00001742 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00001743 SizeType = UnsignedLong;
1744
Daniel Dunbar684de632010-04-22 16:14:54 +00001745 // Do not respect the alignment of bit-field types when laying out
1746 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1747 UseBitFieldTypeAlignment = false;
1748
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001749 if (IsThumb) {
1750 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1751 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001752 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001753 } else {
1754 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1755 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001756 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001757 }
1758
Daniel Dunbara2a41612009-09-14 00:02:24 +00001759 // FIXME: Override "preferred align" for double and long long.
1760 } else if (Name == "aapcs") {
1761 // FIXME: Enumerated types are variable width in straight AAPCS.
1762 } else if (Name == "aapcs-linux") {
1763 ;
1764 } else
1765 return false;
1766
1767 return true;
1768 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001769
Daniel Dunbara91320b2009-12-21 23:28:17 +00001770 void getDefaultFeatures(const std::string &CPU,
1771 llvm::StringMap<bool> &Features) const {
1772 // FIXME: This should not be here.
1773 Features["vfp2"] = false;
1774 Features["vfp3"] = false;
1775 Features["neon"] = false;
1776
1777 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1778 Features["vfp2"] = true;
1779 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1780 Features["neon"] = true;
1781 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001782
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001783 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1784 const std::string &Name,
1785 bool Enabled) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001786 if (Name == "soft-float" || Name == "soft-float-abi") {
1787 Features[Name] = Enabled;
1788 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1789 // These effectively are a single option, reset them when any is enabled.
1790 if (Enabled)
1791 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1792 Features[Name] = Enabled;
1793 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001794 return false;
1795
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001796 return true;
1797 }
1798
1799 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001800 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001801 SoftFloat = SoftFloatABI = false;
1802 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1803 if (Features[i] == "+soft-float")
1804 SoftFloat = true;
1805 else if (Features[i] == "+soft-float-abi")
1806 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001807 else if (Features[i] == "+vfp2")
1808 FPU = VFP2FPU;
1809 else if (Features[i] == "+vfp3")
1810 FPU = VFP3FPU;
1811 else if (Features[i] == "+neon")
1812 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001813 }
1814
1815 // Remove front-end specific options which the backend handles differently.
1816 std::vector<std::string>::iterator it;
1817 it = std::find(Features.begin(), Features.end(), "+soft-float");
1818 if (it != Features.end())
1819 Features.erase(it);
1820 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1821 if (it != Features.end())
1822 Features.erase(it);
1823 }
1824
Daniel Dunbareac7c532009-12-18 18:42:37 +00001825 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1826 return llvm::StringSwitch<const char*>(Name)
1827 .Cases("arm8", "arm810", "4")
1828 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1829 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1830 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1831 .Case("ep9312", "4T")
1832 .Cases("arm10tdmi", "arm1020t", "5T")
1833 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1834 .Case("arm926ej-s", "5TEJ")
1835 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1836 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001837 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001838 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001839 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001840 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1841 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00001842 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00001843 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001844 .Default(0);
1845 }
1846 virtual bool setCPU(const std::string &Name) {
1847 if (!getCPUDefineSuffix(Name))
1848 return false;
1849
1850 CPU = Name;
1851 return true;
1852 }
Chris Lattner33328642009-03-20 15:52:06 +00001853 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001854 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001855 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00001856 Builder.defineMacro("__arm");
1857 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001858
Chris Lattnerc0f59212009-03-02 22:27:17 +00001859 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001860 Builder.defineMacro("__ARMEL__");
1861 Builder.defineMacro("__LITTLE_ENDIAN__");
1862 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001863
1864 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00001865 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001866
Mike Stump437bb4b2009-04-08 02:07:04 +00001867 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001868
Daniel Dunbareac7c532009-12-18 18:42:37 +00001869 // FIXME: It's more complicated than this and we don't really support
1870 // interworking.
1871 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00001872 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001873
Daniel Dunbareac7c532009-12-18 18:42:37 +00001874 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00001875 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001876
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001877 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00001878 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001879
1880 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00001881 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001882
Daniel Dunbara91320b2009-12-21 23:28:17 +00001883 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001884 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001885 Builder.defineMacro("__THUMBEL__");
1886 Builder.defineMacro("__thumb__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001887 if (IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00001888 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001889 }
1890
1891 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00001892 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001893
1894 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00001895 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001896
1897 // This only gets set when Neon instructions are actually available, unlike
1898 // the VFP define, hence the soft float and arch check. This is subtly
1899 // different from gcc, we follow the intent which was that it should be set
1900 // when Neon instructions are actually available.
1901 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00001902 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00001903 }
1904 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1905 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00001906 Records = BuiltinInfo;
1907 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00001908 }
1909 virtual const char *getVAListDeclaration() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001910 return "typedef char* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00001911 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001912 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001913 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001914 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001915 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001916 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001917 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001918 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001919 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00001920 default:
Nate Begemanad487f42008-04-22 05:03:19 +00001921 case 'l': // r0-r7
1922 case 'h': // r8-r15
1923 case 'w': // VFP Floating point register single precision
1924 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00001925 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00001926 return true;
1927 }
Chris Lattner393ff042008-04-21 18:56:49 +00001928 return false;
1929 }
1930 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001931 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00001932 return "";
1933 }
1934};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001935
1936const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001937 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001938 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001939 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
1940
1941 // Float registers
1942 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1943 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1944 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001945 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001946
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001947 // Double registers
1948 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
1949 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00001950 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
1951 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001952
1953 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00001954 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1955 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001956};
1957
1958void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00001959 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001960 Names = GCCRegNames;
1961 NumNames = llvm::array_lengthof(GCCRegNames);
1962}
1963
1964const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001965 { { "a1" }, "r0" },
1966 { { "a2" }, "r1" },
1967 { { "a3" }, "r2" },
1968 { { "a4" }, "r3" },
1969 { { "v1" }, "r4" },
1970 { { "v2" }, "r5" },
1971 { { "v3" }, "r6" },
1972 { { "v4" }, "r7" },
1973 { { "v5" }, "r8" },
1974 { { "v6", "rfp" }, "r9" },
1975 { { "sl" }, "r10" },
1976 { { "fp" }, "r11" },
1977 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00001978 { { "r13" }, "sp" },
1979 { { "r14" }, "lr" },
1980 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001981 // The S, D and Q registers overlap, but aren't really aliases; we
1982 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001983};
1984
1985void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1986 unsigned &NumAliases) const {
1987 Aliases = GCCRegAliases;
1988 NumAliases = llvm::array_lengthof(GCCRegAliases);
1989}
Chris Lattner2752c012010-03-03 19:03:45 +00001990
1991const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001992#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
1993#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1994 ALL_LANGUAGES, false },
Chris Lattner2752c012010-03-03 19:03:45 +00001995#include "clang/Basic/BuiltinsARM.def"
1996};
Chris Lattner393ff042008-04-21 18:56:49 +00001997} // end anonymous namespace.
1998
Eli Friedmana9f54962008-08-20 07:44:10 +00001999
2000namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002001class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002002 public DarwinTargetInfo<ARMTargetInfo> {
2003protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002004 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002005 MacroBuilder &Builder) const {
Daniel Dunbar21ae3192010-01-26 01:44:04 +00002006 getDarwinDefines(Builder, Opts, Triple);
Eli Friedmanb030f022009-04-19 21:38:35 +00002007 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002008
Torok Edwin5f6c1942009-06-30 17:10:35 +00002009public:
Mike Stump1eb44332009-09-09 15:08:12 +00002010 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002011 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2012 HasAlignMac68kSupport = true;
2013 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002014};
2015} // end anonymous namespace.
2016
Reid Spencer5f016e22007-07-11 17:01:13 +00002017namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00002018class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00002019 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2020 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002021 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00002022public:
Eli Friedman01b86682008-08-20 07:28:14 +00002023 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2024 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00002025 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 +00002026 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00002027 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002028 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2029 const std::string &Name,
2030 bool Enabled) const {
2031 if (Name == "soft-float")
2032 Features[Name] = Enabled;
2033 else
2034 return false;
2035
2036 return true;
2037 }
2038 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2039 SoftFloat = false;
2040 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2041 if (Features[i] == "+soft-float")
2042 SoftFloat = true;
2043 }
Chris Lattner33328642009-03-20 15:52:06 +00002044 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002045 MacroBuilder &Builder) const {
2046 DefineStd(Builder, "sparc", Opts);
2047 Builder.defineMacro("__sparcv8");
2048 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002049
2050 if (SoftFloat)
2051 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00002052 }
2053 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2054 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002055 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00002056 }
2057 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002058 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00002059 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002060 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002061 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002062 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002063 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002064 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00002065 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002066 // FIXME: Implement!
2067 return false;
Gabor Greif26658672008-02-21 16:29:08 +00002068 }
2069 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002070 // FIXME: Implement!
2071 return "";
Gabor Greif26658672008-02-21 16:29:08 +00002072 }
2073};
2074
Chris Lattnere957f532009-01-27 01:58:38 +00002075const char * const SparcV8TargetInfo::GCCRegNames[] = {
2076 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2077 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2078 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2079 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2080};
2081
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002082void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002083 unsigned &NumNames) const {
2084 Names = GCCRegNames;
2085 NumNames = llvm::array_lengthof(GCCRegNames);
2086}
2087
2088const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002089 { { "g0" }, "r0" },
2090 { { "g1" }, "r1" },
2091 { { "g2" }, "r2" },
2092 { { "g3" }, "r3" },
2093 { { "g4" }, "r4" },
2094 { { "g5" }, "r5" },
2095 { { "g6" }, "r6" },
2096 { { "g7" }, "r7" },
2097 { { "o0" }, "r8" },
2098 { { "o1" }, "r9" },
2099 { { "o2" }, "r10" },
2100 { { "o3" }, "r11" },
2101 { { "o4" }, "r12" },
2102 { { "o5" }, "r13" },
2103 { { "o6", "sp" }, "r14" },
2104 { { "o7" }, "r15" },
2105 { { "l0" }, "r16" },
2106 { { "l1" }, "r17" },
2107 { { "l2" }, "r18" },
2108 { { "l3" }, "r19" },
2109 { { "l4" }, "r20" },
2110 { { "l5" }, "r21" },
2111 { { "l6" }, "r22" },
2112 { { "l7" }, "r23" },
2113 { { "i0" }, "r24" },
2114 { { "i1" }, "r25" },
2115 { { "i2" }, "r26" },
2116 { { "i3" }, "r27" },
2117 { { "i4" }, "r28" },
2118 { { "i5" }, "r29" },
2119 { { "i6", "fp" }, "r30" },
2120 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00002121};
2122
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002123void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002124 unsigned &NumAliases) const {
2125 Aliases = GCCRegAliases;
2126 NumAliases = llvm::array_lengthof(GCCRegAliases);
2127}
Gabor Greif26658672008-02-21 16:29:08 +00002128} // end anonymous namespace.
2129
Eli Friedman01b86682008-08-20 07:28:14 +00002130namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002131class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2132public:
2133 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2134 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2135 SizeType = UnsignedInt;
2136 PtrDiffType = SignedInt;
2137 }
2138};
Torok Edwin5f6c1942009-06-30 17:10:35 +00002139class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00002140public:
2141 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002142 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00002143 SizeType = UnsignedInt;
2144 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00002145 }
2146};
2147} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00002148
Chris Lattner2621fd12008-05-08 05:58:21 +00002149namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002150 class MSP430TargetInfo : public TargetInfo {
2151 static const char * const GCCRegNames[];
2152 public:
2153 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2154 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00002155 IntWidth = 16; IntAlign = 16;
2156 LongWidth = 32; LongLongWidth = 64;
2157 LongAlign = LongLongAlign = 16;
2158 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002159 SizeType = UnsignedInt;
2160 IntMaxType = SignedLong;
2161 UIntMaxType = UnsignedLong;
2162 IntPtrType = SignedShort;
2163 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00002164 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00002165 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002166 }
2167 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002168 MacroBuilder &Builder) const {
2169 Builder.defineMacro("MSP430");
2170 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002171 // FIXME: defines for different 'flavours' of MCU
2172 }
2173 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2174 unsigned &NumRecords) const {
2175 // FIXME: Implement.
2176 Records = 0;
2177 NumRecords = 0;
2178 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002179 virtual void getGCCRegNames(const char * const *&Names,
2180 unsigned &NumNames) const;
2181 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2182 unsigned &NumAliases) const {
2183 // No aliases.
2184 Aliases = 0;
2185 NumAliases = 0;
2186 }
2187 virtual bool validateAsmConstraint(const char *&Name,
2188 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00002189 // No target constraints for now.
2190 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002191 }
2192 virtual const char *getClobbers() const {
2193 // FIXME: Is this really right?
2194 return "";
2195 }
2196 virtual const char *getVAListDeclaration() const {
2197 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00002198 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002199 }
2200 };
2201
2202 const char * const MSP430TargetInfo::GCCRegNames[] = {
2203 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2204 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2205 };
2206
2207 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2208 unsigned &NumNames) const {
2209 Names = GCCRegNames;
2210 NumNames = llvm::array_lengthof(GCCRegNames);
2211 }
2212}
2213
2214
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002215namespace {
2216 class SystemZTargetInfo : public TargetInfo {
2217 static const char * const GCCRegNames[];
2218 public:
2219 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2220 TLSSupported = false;
2221 IntWidth = IntAlign = 32;
2222 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2223 PointerWidth = PointerAlign = 64;
Chris Lattner1932e122009-11-07 18:59:41 +00002224 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2225 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002226 }
2227 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002228 MacroBuilder &Builder) const {
2229 Builder.defineMacro("__s390__");
2230 Builder.defineMacro("__s390x__");
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002231 }
2232 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2233 unsigned &NumRecords) const {
2234 // FIXME: Implement.
2235 Records = 0;
2236 NumRecords = 0;
2237 }
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002238
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002239 virtual void getGCCRegNames(const char * const *&Names,
2240 unsigned &NumNames) const;
2241 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2242 unsigned &NumAliases) const {
2243 // No aliases.
2244 Aliases = 0;
2245 NumAliases = 0;
2246 }
2247 virtual bool validateAsmConstraint(const char *&Name,
2248 TargetInfo::ConstraintInfo &info) const {
2249 // FIXME: implement
2250 return true;
2251 }
2252 virtual const char *getClobbers() const {
2253 // FIXME: Is this really right?
2254 return "";
2255 }
2256 virtual const char *getVAListDeclaration() const {
2257 // FIXME: implement
2258 return "typedef char* __builtin_va_list;";
2259 }
2260 };
2261
2262 const char * const SystemZTargetInfo::GCCRegNames[] = {
2263 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2264 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2265 };
2266
2267 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2268 unsigned &NumNames) const {
2269 Names = GCCRegNames;
2270 NumNames = llvm::array_lengthof(GCCRegNames);
2271 }
2272}
2273
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002274namespace {
2275 class BlackfinTargetInfo : public TargetInfo {
2276 static const char * const GCCRegNames[];
2277 public:
2278 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2279 TLSSupported = false;
2280 DoubleAlign = 32;
2281 LongLongAlign = 32;
2282 LongDoubleAlign = 32;
Chris Lattner1932e122009-11-07 18:59:41 +00002283 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002284 }
2285
2286 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002287 MacroBuilder &Builder) const {
2288 DefineStd(Builder, "bfin", Opts);
2289 DefineStd(Builder, "BFIN", Opts);
2290 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002291 // FIXME: This one is really dependent on -mcpu
Benjamin Kramera9992772010-01-09 17:55:51 +00002292 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002293 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2294 }
2295
2296 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2297 unsigned &NumRecords) const {
2298 // FIXME: Implement.
2299 Records = 0;
2300 NumRecords = 0;
2301 }
2302
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002303 virtual void getGCCRegNames(const char * const *&Names,
2304 unsigned &NumNames) const;
2305
2306 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2307 unsigned &NumAliases) const {
2308 // No aliases.
2309 Aliases = 0;
2310 NumAliases = 0;
2311 }
2312
2313 virtual bool validateAsmConstraint(const char *&Name,
2314 TargetInfo::ConstraintInfo &Info) const {
2315 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2316 Info.setAllowsRegister();
2317 return true;
2318 }
2319 return false;
2320 }
2321
2322 virtual const char *getClobbers() const {
2323 return "";
2324 }
2325
2326 virtual const char *getVAListDeclaration() const {
2327 return "typedef char* __builtin_va_list;";
2328 }
2329 };
2330
2331 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2332 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2333 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2334 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2335 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2336 "a0", "a1", "cc",
2337 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2338 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2339 };
2340
2341 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2342 unsigned &NumNames) const {
2343 Names = GCCRegNames;
2344 NumNames = llvm::array_lengthof(GCCRegNames);
2345 }
2346}
2347
Eli Friedmanb63decf2009-08-19 20:47:07 +00002348namespace {
2349
Mike Stump1eb44332009-09-09 15:08:12 +00002350 // LLVM and Clang cannot be used directly to output native binaries for
2351 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00002352 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00002353 //
2354 // TCE uses the llvm bitcode as input and uses it for generating customized
2355 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00002356 // publicly available in http://tce.cs.tut.fi
2357
2358 class TCETargetInfo : public TargetInfo{
2359 public:
2360 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2361 TLSSupported = false;
2362 IntWidth = 32;
2363 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00002364 PointerWidth = 32;
2365 IntAlign = 32;
2366 LongAlign = LongLongAlign = 32;
2367 PointerAlign = 32;
2368 SizeType = UnsignedInt;
2369 IntMaxType = SignedLong;
2370 UIntMaxType = UnsignedLong;
2371 IntPtrType = SignedInt;
2372 PtrDiffType = SignedInt;
2373 FloatWidth = 32;
2374 FloatAlign = 32;
2375 DoubleWidth = 32;
2376 DoubleAlign = 32;
2377 LongDoubleWidth = 32;
2378 LongDoubleAlign = 32;
2379 FloatFormat = &llvm::APFloat::IEEEsingle;
2380 DoubleFormat = &llvm::APFloat::IEEEsingle;
2381 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00002382 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2383 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00002384 "f32:32:32-f64:32:32-v64:32:32-"
2385 "v128:32:32-a0:0:32-n32";
Eli Friedmanb63decf2009-08-19 20:47:07 +00002386 }
2387
2388 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002389 MacroBuilder &Builder) const {
2390 DefineStd(Builder, "tce", Opts);
2391 Builder.defineMacro("__TCE__");
2392 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00002393 }
2394 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2395 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00002396 virtual const char *getClobbers() const {
2397 return "";
2398 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002399 virtual const char *getVAListDeclaration() const {
2400 return "typedef void* __builtin_va_list;";
2401 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002402 virtual void getGCCRegNames(const char * const *&Names,
2403 unsigned &NumNames) const {}
2404 virtual bool validateAsmConstraint(const char *&Name,
2405 TargetInfo::ConstraintInfo &info) const {
2406 return true;
2407 }
2408 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2409 unsigned &NumAliases) const {}
2410 };
2411}
2412
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002413namespace {
2414class MipsTargetInfo : public TargetInfo {
Eric Christophered734732010-03-02 02:41:08 +00002415 std::string ABI, CPU;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002416 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2417 static const char * const GCCRegNames[];
2418public:
Eric Christophered734732010-03-02 02:41:08 +00002419 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002420 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2421 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2422 }
Eric Christophered734732010-03-02 02:41:08 +00002423 virtual const char *getABI() const { return ABI.c_str(); }
2424 virtual bool setABI(const std::string &Name) {
2425
2426 if ((Name == "o32") || (Name == "eabi")) {
2427 ABI = Name;
2428 return true;
2429 } else
2430 return false;
2431 }
2432 virtual bool setCPU(const std::string &Name) {
2433 CPU = Name;
2434 return true;
2435 }
2436 void getDefaultFeatures(const std::string &CPU,
2437 llvm::StringMap<bool> &Features) const {
2438 Features[ABI] = true;
2439 Features[CPU] = true;
2440 }
2441 virtual void getArchDefines(const LangOptions &Opts,
2442 MacroBuilder &Builder) const {
2443 if (ABI == "o32")
2444 Builder.defineMacro("__mips_o32");
2445 else if (ABI == "eabi")
2446 Builder.defineMacro("__mips_eabi");
2447 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002448 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002449 MacroBuilder &Builder) const {
2450 DefineStd(Builder, "mips", Opts);
2451 Builder.defineMacro("_mips");
2452 DefineStd(Builder, "MIPSEB", Opts);
2453 Builder.defineMacro("_MIPSEB");
2454 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002455 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002456 }
2457 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2458 unsigned &NumRecords) const {
2459 // FIXME: Implement!
2460 }
2461 virtual const char *getVAListDeclaration() const {
2462 return "typedef void* __builtin_va_list;";
2463 }
2464 virtual void getGCCRegNames(const char * const *&Names,
2465 unsigned &NumNames) const;
2466 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2467 unsigned &NumAliases) const;
2468 virtual bool validateAsmConstraint(const char *&Name,
2469 TargetInfo::ConstraintInfo &Info) const {
2470 switch (*Name) {
2471 default:
2472 case 'r': // CPU registers.
2473 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2474 case 'y': // Equivalent to "r", backwards compatibility only.
2475 case 'f': // floating-point registers.
2476 Info.setAllowsRegister();
2477 return true;
2478 }
2479 return false;
2480 }
2481
2482 virtual const char *getClobbers() const {
2483 // FIXME: Implement!
2484 return "";
2485 }
2486};
2487
2488const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer20249a12010-10-21 03:16:25 +00002489 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002490 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2491 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2492 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2493 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2494 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2495 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2496 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2497 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2498 "$fcc5","$fcc6","$fcc7"
2499};
2500
2501void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2502 unsigned &NumNames) const {
2503 Names = GCCRegNames;
2504 NumNames = llvm::array_lengthof(GCCRegNames);
2505}
2506
2507const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2508 { { "at" }, "$1" },
2509 { { "v0" }, "$2" },
2510 { { "v1" }, "$3" },
2511 { { "a0" }, "$4" },
2512 { { "a1" }, "$5" },
2513 { { "a2" }, "$6" },
2514 { { "a3" }, "$7" },
2515 { { "t0" }, "$8" },
2516 { { "t1" }, "$9" },
2517 { { "t2" }, "$10" },
2518 { { "t3" }, "$11" },
2519 { { "t4" }, "$12" },
2520 { { "t5" }, "$13" },
2521 { { "t6" }, "$14" },
2522 { { "t7" }, "$15" },
2523 { { "s0" }, "$16" },
2524 { { "s1" }, "$17" },
2525 { { "s2" }, "$18" },
2526 { { "s3" }, "$19" },
2527 { { "s4" }, "$20" },
2528 { { "s5" }, "$21" },
2529 { { "s6" }, "$22" },
2530 { { "s7" }, "$23" },
2531 { { "t8" }, "$24" },
2532 { { "t9" }, "$25" },
2533 { { "k0" }, "$26" },
2534 { { "k1" }, "$27" },
2535 { { "gp" }, "$28" },
2536 { { "sp" }, "$29" },
2537 { { "fp" }, "$30" },
2538 { { "ra" }, "$31" }
2539};
2540
2541void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2542 unsigned &NumAliases) const {
2543 Aliases = GCCRegAliases;
2544 NumAliases = llvm::array_lengthof(GCCRegAliases);
2545}
2546} // end anonymous namespace.
2547
2548namespace {
2549class MipselTargetInfo : public MipsTargetInfo {
2550public:
2551 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2552 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2553 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2554 }
2555
2556 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002557 MacroBuilder &Builder) const;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002558};
2559
2560void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002561 MacroBuilder &Builder) const {
2562 DefineStd(Builder, "mips", Opts);
2563 Builder.defineMacro("_mips");
2564 DefineStd(Builder, "MIPSEL", Opts);
2565 Builder.defineMacro("_MIPSEL");
2566 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002567 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002568}
2569} // end anonymous namespace.
2570
Reid Spencer5f016e22007-07-11 17:01:13 +00002571//===----------------------------------------------------------------------===//
2572// Driver code
2573//===----------------------------------------------------------------------===//
2574
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002575static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002576 llvm::Triple Triple(T);
2577 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00002578
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002579 switch (Triple.getArch()) {
2580 default:
2581 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00002582
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002583 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00002584 case llvm::Triple::thumb:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002585 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00002586 case llvm::Triple::Linux:
2587 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002588 case llvm::Triple::Darwin:
Eli Friedmaned855cb2008-08-21 00:13:15 +00002589 return new DarwinARMTargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002590 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002591 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002592 default:
2593 return new ARMTargetInfo(T);
2594 }
Eli Friedman61538a72008-05-20 14:21:01 +00002595
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002596 case llvm::Triple::bfin:
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002597 return new BlackfinTargetInfo(T);
2598
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002599 case llvm::Triple::msp430:
2600 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00002601
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002602 case llvm::Triple::mips:
2603 if (os == llvm::Triple::Psp)
2604 return new PSPTargetInfo<MipsTargetInfo>(T);
2605 if (os == llvm::Triple::Linux)
2606 return new LinuxTargetInfo<MipsTargetInfo>(T);
2607 return new MipsTargetInfo(T);
2608
2609 case llvm::Triple::mipsel:
2610 if (os == llvm::Triple::Psp)
2611 return new PSPTargetInfo<MipselTargetInfo>(T);
2612 if (os == llvm::Triple::Linux)
2613 return new LinuxTargetInfo<MipselTargetInfo>(T);
2614 return new MipselTargetInfo(T);
2615
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002616 case llvm::Triple::ppc:
2617 if (os == llvm::Triple::Darwin)
Roman Divackyc81f2a22011-01-06 08:27:10 +00002618 return new DarwinPPC32TargetInfo(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002619 else if (os == llvm::Triple::FreeBSD)
2620 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002621 return new PPC32TargetInfo(T);
2622
2623 case llvm::Triple::ppc64:
2624 if (os == llvm::Triple::Darwin)
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00002625 return new DarwinPPC64TargetInfo(T);
John Thompson3f6918a2009-11-19 17:18:50 +00002626 else if (os == llvm::Triple::Lv2)
2627 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002628 else if (os == llvm::Triple::FreeBSD)
2629 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002630 return new PPC64TargetInfo(T);
2631
Chris Lattner9cbeb632010-03-06 21:21:27 +00002632 case llvm::Triple::mblaze:
2633 return new MBlazeTargetInfo(T);
2634
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002635 case llvm::Triple::sparc:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002636 if (os == llvm::Triple::AuroraUX)
2637 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002638 if (os == llvm::Triple::Solaris)
2639 return new SolarisSparcV8TargetInfo(T);
2640 return new SparcV8TargetInfo(T);
2641
John Thompson3f6918a2009-11-19 17:18:50 +00002642 // FIXME: Need a real SPU target.
2643 case llvm::Triple::cellspu:
2644 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2645
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002646 case llvm::Triple::systemz:
2647 return new SystemZTargetInfo(T);
2648
Eli Friedmanb63decf2009-08-19 20:47:07 +00002649 case llvm::Triple::tce:
2650 return new TCETargetInfo(T);
2651
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002652 case llvm::Triple::x86:
2653 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002654 case llvm::Triple::AuroraUX:
2655 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002656 case llvm::Triple::Darwin:
2657 return new DarwinI386TargetInfo(T);
2658 case llvm::Triple::Linux:
2659 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2660 case llvm::Triple::DragonFly:
2661 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2662 case llvm::Triple::NetBSD:
2663 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2664 case llvm::Triple::OpenBSD:
2665 return new OpenBSDI386TargetInfo(T);
2666 case llvm::Triple::FreeBSD:
2667 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00002668 case llvm::Triple::Minix:
2669 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002670 case llvm::Triple::Solaris:
2671 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2672 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002673 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002674 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002675 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002676 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00002677 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00002678 case llvm::Triple::Haiku:
2679 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002680 default:
2681 return new X86_32TargetInfo(T);
2682 }
2683
2684 case llvm::Triple::x86_64:
2685 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002686 case llvm::Triple::AuroraUX:
2687 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002688 case llvm::Triple::Darwin:
2689 return new DarwinX86_64TargetInfo(T);
2690 case llvm::Triple::Linux:
2691 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00002692 case llvm::Triple::DragonFly:
2693 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002694 case llvm::Triple::NetBSD:
2695 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2696 case llvm::Triple::OpenBSD:
2697 return new OpenBSDX86_64TargetInfo(T);
2698 case llvm::Triple::FreeBSD:
2699 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2700 case llvm::Triple::Solaris:
2701 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00002702 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002703 return new MinGWX86_64TargetInfo(T);
2704 case llvm::Triple::Win32: // This is what Triple.h supports now.
Douglas Gregorfb7049a2011-02-01 15:06:18 +00002705 if (Triple.getEnvironment() == llvm::Triple::MachO)
2706 return new DarwinX86_64TargetInfo(T);
2707 else
2708 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002709 default:
2710 return new X86_64TargetInfo(T);
2711 }
2712 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002713}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002714
2715/// CreateTargetInfo - Return the target info object for the specified target
2716/// triple.
2717TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002718 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002719 llvm::Triple Triple(Opts.Triple);
2720
2721 // Construct the target
2722 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2723 if (!Target) {
2724 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2725 return 0;
2726 }
2727
Daniel Dunbareac7c532009-12-18 18:42:37 +00002728 // Set the target CPU if specified.
2729 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2730 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2731 return 0;
2732 }
2733
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002734 // Set the target ABI if specified.
2735 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2736 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2737 return 0;
2738 }
2739
Charles Davis98b7c5c2010-06-11 01:06:47 +00002740 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00002741 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00002742 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2743 return 0;
2744 }
2745
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002746 // Compute the default target features, we need the target to handle this
2747 // because features may have dependencies on one another.
2748 llvm::StringMap<bool> Features;
2749 Target->getDefaultFeatures(Opts.CPU, Features);
2750
2751 // Apply the user specified deltas.
2752 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2753 ie = Opts.Features.end(); it != ie; ++it) {
2754 const char *Name = it->c_str();
2755
2756 // Apply the feature via the target.
2757 if ((Name[0] != '-' && Name[0] != '+') ||
2758 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2759 Diags.Report(diag::err_target_invalid_feature) << Name;
2760 return 0;
2761 }
2762 }
2763
2764 // Add the features to the compile options.
2765 //
2766 // FIXME: If we are completely confident that we have the right set, we only
2767 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002768 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002769 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2770 ie = Features.end(); it != ie; ++it)
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002771 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2772 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002773
2774 return Target.take();
2775}